快速背景:我有我已經通過在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窗體設計器。
預先感謝您的幫助,如果我遺漏了任何東西,我表示歉意;這是我的第一篇文章之一。
另外,如果我使用'HICON HICON =(HICON)的LoadImage(的hInstance,MAKEINTRESOURCE(IDI_GENERIC),IMAGE_ICON,0,0,LR_DEFAULTCOLOR);'和'm_iconGeneric = ImageList_AddIcon(m_hImageList,hIcon);'和'DestroyIcon(hIcon);'然後它工作正常。但我的要求是用戶可以指定一個大的原始皮膚文件,然後指定每個圖標在該文件中的位置。它們可能是連續的也可能不是連續的,必須一一指定。謝謝! –