2013-06-21 2 views
1

빠른 배경 :복사 부분

hTreeview = CreateWindowEx(0, WC_TREEVIEW, L"My Treeview", WS_CHILD | WS_VISIBLE | TVS_INFOTIP | TVS_NOHSCROLL | TVS_SHOWSELALWAYS | TVS_EDITLABELS | TVS_SINGLEEXPAND, m_tx, m_ty, m_tw, m_th, hWindow, (HMENU)2, hInstance, NULL); 

: 나는 (그 차이를해서는 안하지만, 비주얼 스튜디오 2008) 나 C++에서 윈도우 API 호출을 사용하여 생성 한 트 리뷰가 나는 성공적으로 사용하여에의 ImageList를 할당 : cx, cyn 모두 지정

m_hImageList = ImageList_Create(cx, cy, ILC_COLOR24, n, n); 
TreeView_SetImageList(hTreeview, m_hImageList, TVSIL_NORMAL); 

(이 경우, 18, 18, 5, 각각). 이 모든 것은 잘 작동합니다. 왜냐하면 이미지에 대한 항목 옆에 공간이 설정되어 있기 때문에 볼 수 있습니다.

내가 달성하려고하는 것은 다음 다른 비트 맵 (파일에서)의 하위 섹션을 복사하는 것입니다. 나는 시도했다 (그러나 작동하지 않습니다) 코드는 이것이다 : 나는 간결에 대한 코드를 검사 오류를 떠난

HBITMAP hSkin = (HBITMAP)LoadImage(NULL, szPathBmp, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); 
for (long i = 0; i < n; i++) 
{ 
    HDC dcDest = CreateCompatibleDC(NULL); 
    HBITMAP hIcon = CreateCompatibleBitmap(dcDest, cx, cy); 
    HDC dcSrc = CreateCompatibleDC(NULL); 
    SelectObject(dcSrc, hSkin); 
    BitBlt(dcDest, 0, 0, cx, cy, dcSrc, x, y, SRCCOPY); 
    *pIcon = ImageList_Add(m_hImageList, hIcon, NULL); 
    DeleteObject(hIcon); 
    DeleteDC(dcSrc); 
    DeleteDC(dcDest); 
} 
DeleteObject(hSkin); 

, 나열된 모든 변수는 다른 곳에서 설정 한 것으로 가정 할 수있다 프로그램 (작업 소스 파일을 제공하지 못해서 용서해 주지만, 이것은 매우 큰 프로젝트이며 관련있는 부분 만 포함하려고했습니다).

Treeview에있는 모든 것은 검은 색 사각형 (Treeview의 배경색이됩니다)이므로 코드의 마지막 블록에 문제가있는 것으로 가정합니다. BitBlt의 일부를 ImageList에 저장하기 위해 새 비트 맵에 넣으려고합니다. 누구든지 내가 뭘 잘못하고 있는지 말해 줄 수 있니? 아니면 내가하려는 일을 성취하기 위해 더 나은 방법을 말해 줄 수 있니?

저는 C++과 Windows API 만 사용하고 있습니다. .NET, MFC 또는 Windows Form Designer가 없습니다.

사전에 도움을 주셔서 감사 드리며, 무엇이라도 남겨두면 사과드립니다. 이것은 나의 첫 번째 게시물 중 하나입니다.

+0

을 또한, 내가 사용하는 경우'HICON HICON = (HICON) LoadImage (HINSTANCE, MAKEINTRESOURCE (IDI_GENERIC), IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR)'와'm_iconGeneric = ImageList_AddIcon (m_hImageList, hIcon); 그리고'DestroyIcon (hIcon);'그런 다음 잘 동작합니다. 그러나 사용자가 하나의 큰 원본 스킨 파일을 지정한 다음 각 파일이 해당 파일에있는 위치를 지정할 수 있어야합니다.이들은 연속적 일 수도 있고 연속적 일 수도 있고, 하나씩 지정되어야합니다. 감사! –

답변

1

코드에 몇 가지 문제가 있습니다.

첫 번째로 새 DC를 만들면 흑백 비트 맵으로 시작되므로 CreateCompatibleBitmap 호출도 단색으로 생성됩니다. 대신, 창 또는 화면 DC를 기반으로 비트 맵을 생성하려고합니다.

두 번째로 비트 맵을 dcDest으로 실제로 선택하지 않으므로 hIcon에 아무 것도 그려지지 않을 것입니다.

비트 맵이 현재 장치 컨텍스트로 선택되어있는 경우 ImageList_Add이 실패하므로 아이콘을 이미지 목록에 추가하기 전에 hIcon에서 dcDest의 선택을 취소해야합니다.

마지막으로 원본 비트 맵을 저장하고 복원하지 않으므로 GDI 누출이 발생할 수도 있습니다.

이 같은 것을보십시오 :

HDC hdcWindow = GetDC(hWnd); 
HDC dcDest = CreateCompatibleDC(hDCWindow); 
HBITMAP hIcon = CreateCompatibleBitmap(hDCWindow, cx, cy); 
HDC dcSrc = CreateCompatibleDC(NULL); 

HGDIOBJ hOldSourceBmp = SelectObject(dcSrc, hSkin); 
HGDIOBJ hOldDestBmp = SelectObject(dcDest, hIcon); 

BitBlt(dcDest, 0, 0, cx, cy, dcSrc, x, y, SRCCOPY); 

SelectObject(dcDest, hOldDestBmp); 
SelectObject(dcSrc, hOldSourceBmp); 

*pIcon = ImageList_Add(m_hImageList, hIcon, NULL); 

DeleteObject(hIcon); 
DeleteDC(dcSrc); 
DeleteDC(dcDest); 
ReleaseDC(hWnd, hDCWindow); 
+0

Jonathan에게 감사드립니다. 이것은 매력처럼 작동했습니다! –