2013-06-21 38 views
1

快速背景:我有我已經通過在C Windows API調用++創建一個TreeView(Visual Studio 2008中,儘管這不應該有所作爲):一個位圖的複製一部分到一個ImageList

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); 

我已成功分配使用一個ImageList它:

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

cx其中,cy,和n都指定(在這種情況下,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窗體設計器。

預先感謝您的幫助,如果我遺漏了任何東西,我表示歉意;這是我的第一篇文章之一。

+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將失敗,因此必須在將圖標添加到圖像列表之前從dcDest中取消選擇hIcon

最後,你也忽略了保存原始位圖並恢復它們,所以這也會導致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

謝謝喬納森,這工作就像一個魅力! –

相關問題