BOOL ProjectPanel::setImageList(int root_clean_id, int root_dirty_id, int project_id, int open_node_id, int closed_node_id, int leaf_id, int ivalid_leaf_id) { HBITMAP hbmp; const int nbBitmaps = 7; // Creation of image list if ((_hImaLst = ImageList_Create(CX_BITMAP, CY_BITMAP, ILC_COLOR32 | ILC_MASK, nbBitmaps, 0)) == NULL) return FALSE; // Add the bmp in the list hbmp = LoadBitmap(_hInst, MAKEINTRESOURCE(root_clean_id)); if (hbmp == NULL) return FALSE; ImageList_Add(_hImaLst, hbmp, (HBITMAP)NULL); DeleteObject(hbmp); hbmp = LoadBitmap(_hInst, MAKEINTRESOURCE(root_dirty_id)); if (hbmp == NULL) return FALSE; ImageList_Add(_hImaLst, hbmp, (HBITMAP)NULL); DeleteObject(hbmp); hbmp = LoadBitmap(_hInst, MAKEINTRESOURCE(project_id)); if (hbmp == NULL) return FALSE; ImageList_Add(_hImaLst, hbmp, (HBITMAP)NULL); DeleteObject(hbmp); hbmp = LoadBitmap(_hInst, MAKEINTRESOURCE(open_node_id)); if (hbmp == NULL) return FALSE; ImageList_Add(_hImaLst, hbmp, (HBITMAP)NULL); DeleteObject(hbmp); hbmp = LoadBitmap(_hInst, MAKEINTRESOURCE(closed_node_id)); if (hbmp == NULL) return FALSE; ImageList_Add(_hImaLst, hbmp, (HBITMAP)NULL); DeleteObject(hbmp); hbmp = LoadBitmap(_hInst, MAKEINTRESOURCE(leaf_id)); if (hbmp == NULL) return FALSE; ImageList_Add(_hImaLst, hbmp, (HBITMAP)NULL); DeleteObject(hbmp); hbmp = LoadBitmap(_hInst, MAKEINTRESOURCE(ivalid_leaf_id)); if (hbmp == NULL) return FALSE; ImageList_Add(_hImaLst, hbmp, (HBITMAP)NULL); DeleteObject(hbmp); if (ImageList_GetImageCount(_hImaLst) < nbBitmaps) return FALSE; // Set image list to the tree view TreeView_SetImageList(_treeView.getHSelf(), _hImaLst, TVSIL_NORMAL); return TRUE; }
/* * MainWindowHandleWMNotify * * Purpose: * * Main window WM_NOTIFY handler. * */ LRESULT MainWindowHandleWMNotify( _In_ HWND hwnd, _In_ WPARAM wParam, _In_ LPARAM lParam ) { INT c, k; LPNMHDR hdr = (LPNMHDR)lParam; LPTOOLTIPTEXT lpttt; LPNMLISTVIEW lvn; LPNMTREEVIEW lpnmTreeView; LPWSTR str; SIZE_T lcp; LVITEMW lvitem; LVCOLUMNW col; TVHITTESTINFO hti; POINT pt; WCHAR item_string[MAX_PATH + 1]; UNREFERENCED_PARAMETER(wParam); if (hdr) { if (hdr->hwndFrom == ObjectTree) { switch (hdr->code) { case TVN_ITEMEXPANDED: case TVN_SELCHANGED: SetFocus(ObjectTree); supSetWaitCursor(TRUE); MainWindowTreeViewSelChanged((LPNMTREEVIEWW)lParam); SendMessageW(StatusBar, WM_SETTEXT, 0, (LPARAM)CurrentObjectPath); g_enumParams.lpSubDirName = CurrentObjectPath; ListObjectsInDirectory(&g_enumParams); ListView_SortItemsEx(ObjectList, &MainWindowObjectListCompareFunc, SortColumn); supSetWaitCursor(FALSE); lpnmTreeView = (LPNMTREEVIEW)lParam; if (lpnmTreeView) { SelectedTreeItem = lpnmTreeView->itemNew.hItem; } break; case NM_RCLICK: GetCursorPos(&pt); hti.pt = pt; ScreenToClient(hdr->hwndFrom, &hti.pt); if (TreeView_HitTest(hdr->hwndFrom, &hti) && (hti.flags & (TVHT_ONITEM | TVHT_ONITEMRIGHT))) { SelectedTreeItem = hti.hItem; if (hdr->code == NM_RCLICK) { TreeView_SelectItem(ObjectTree, SelectedTreeItem); SendMessageW(StatusBar, WM_SETTEXT, 0, (LPARAM)CurrentObjectPath); supHandleTreePopupMenu(hwnd, &pt); } } break; } } if (hdr->hwndFrom == ObjectList) { switch (hdr->code) { case NM_SETFOCUS: if (ListView_GetSelectionMark(ObjectList) == -1) { lvitem.mask = LVIF_STATE; lvitem.iItem = 0; lvitem.state = LVIS_SELECTED | LVIS_FOCUSED; lvitem.stateMask = LVIS_SELECTED | LVIS_FOCUSED; ListView_SetItem(ObjectList, &lvitem); } break; case LVN_ITEMCHANGED: lvn = (LPNMLISTVIEW)lParam; RtlSecureZeroMemory(&item_string, sizeof(item_string)); ListView_GetItemText(ObjectList, lvn->iItem, 0, item_string, MAX_PATH); lcp = _strlen(CurrentObjectPath); str = HeapAlloc(GetProcessHeap(), 0, (lcp + _strlen(item_string) + 4) * sizeof(WCHAR)); if (str == NULL) break; _strcpy(str, CurrentObjectPath); if ((str[0] == '\\') && (str[1] == 0)) { _strcpy(str + lcp, item_string); } else { str[lcp] = '\\'; _strcpy(str + lcp + 1, item_string); } SendMessageW(StatusBar, WM_SETTEXT, 0, (LPARAM)str); HeapFree(GetProcessHeap(), 0, str); break; //handle sort by column case LVN_COLUMNCLICK: bSortInverse = !bSortInverse; SortColumn = ((NMLISTVIEW *)lParam)->iSubItem; ListView_SortItemsEx(ObjectList, &MainWindowObjectListCompareFunc, SortColumn); RtlSecureZeroMemory(&col, sizeof(col)); col.mask = LVCF_IMAGE; col.iImage = -1; for (c = 0; c < 3; c++) ListView_SetColumn(ObjectList, c, &col); k = ImageList_GetImageCount(ListViewImages); if (bSortInverse) col.iImage = k - 2; else col.iImage = k - 1; ListView_SetColumn(ObjectList, ((NMLISTVIEW *)lParam)->iSubItem, &col); break; case NM_CLICK: c = ((LPNMITEMACTIVATE)lParam)->iItem; EnableMenuItem(GetSubMenu(GetMenu(hwnd), 2), ID_OBJECT_GOTOLINKTARGET, (supIsSymlink(c)) ? MF_BYCOMMAND : MF_BYCOMMAND | MF_GRAYED); break; case NM_DBLCLK: MainWindowHandleObjectListProp(hwnd); break; default: break; } } //handle tooltip if (hdr->code == TTN_GETDISPINFO) { lpttt = (LPTOOLTIPTEXT)lParam; switch (lpttt->hdr.idFrom) { case ID_OBJECT_PROPERTIES: case ID_VIEW_REFRESH: case ID_FIND_FINDOBJECT: lpttt->hinst = g_hInstance; lpttt->lpszText = MAKEINTRESOURCE(lpttt->hdr.idFrom); lpttt->uFlags |= TTF_DI_SETITEM; break; default: break; } } } return FALSE; }
/* * WinObjExMain * * Purpose: * * Actual program entry point. * */ void WinObjExMain() { MSG msg1; WNDCLASSEX wincls; BOOL IsFullAdmin = FALSE, rv = TRUE, cond = FALSE; ATOM class_atom = 0; INITCOMMONCONTROLSEX icc; LVCOLUMNW col; SHSTOCKICONINFO sii; HMENU hMenu; HACCEL hAccTable = 0; WCHAR szWindowTitle[100]; HANDLE tmpb; #ifdef _DEBUG TestPrivateNamespace(); //TestIoCompletion(); //TestTimer(); //TestTransaction(); #endif pHtmlHelpW = NULL; CurrentObjectPath = NULL; bSortInverse = FALSE; g_hInstance = GetModuleHandle(NULL); RtlSecureZeroMemory(szWindowTitle, sizeof(szWindowTitle)); //clear dialogs array RtlSecureZeroMemory(g_wobjDialogs, sizeof(g_wobjDialogs)); // do not move anywhere IsFullAdmin = supUserIsFullAdmin(); supInit(IsFullAdmin); //create main window and it components wincls.cbSize = sizeof(WNDCLASSEX); wincls.style = 0; wincls.lpfnWndProc = &MainWindowProc; wincls.cbClsExtra = 0; wincls.cbWndExtra = 0; wincls.hInstance = g_hInstance; wincls.hIcon = (HICON)LoadImage(g_hInstance, MAKEINTRESOURCE(IDI_ICON_MAIN), IMAGE_ICON, 0, 0, LR_SHARED); wincls.hCursor = (HCURSOR)LoadImage(NULL, MAKEINTRESOURCE(OCR_SIZEWE), IMAGE_CURSOR, 0, 0, LR_SHARED); wincls.hbrBackground = NULL; wincls.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); wincls.lpszClassName = MAINWINDOWCLASSNAME; wincls.hIconSm = 0; do { class_atom = RegisterClassEx(&wincls); if (class_atom == 0) break; _strcpy(szWindowTitle, PROGRAM_NAME); if (IsFullAdmin != FALSE) { _strcat(szWindowTitle, L" (Administrator)"); } MainWindow = CreateWindowEx(0, MAKEINTATOM(class_atom), szWindowTitle, WS_VISIBLE | WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, g_hInstance, NULL); if (MainWindow == NULL) break; icc.dwSize = sizeof(icc); icc.dwICC = ICC_LISTVIEW_CLASSES | ICC_TREEVIEW_CLASSES | ICC_BAR_CLASSES | ICC_TAB_CLASSES; if (!InitCommonControlsEx(&icc)) break; StatusBar = CreateWindowEx(0, STATUSCLASSNAME, NULL, WS_VISIBLE | WS_CHILD, 0, 0, 0, 0, MainWindow, (HMENU)1001, g_hInstance, NULL); ObjectTree = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, NULL, WS_VISIBLE | WS_CHILD | WS_TABSTOP | TVS_DISABLEDRAGDROP | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT, 0, 0, 0, 0, MainWindow, (HMENU)1002, g_hInstance, NULL); if (ObjectTree == NULL) break; ObjectList = CreateWindowEx(WS_EX_CLIENTEDGE, WC_LISTVIEW, NULL, WS_VISIBLE | WS_CHILD | WS_TABSTOP | LVS_AUTOARRANGE | LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SINGLESEL | LVS_SHAREIMAGELISTS, 0, 0, 0, 0, MainWindow, (HMENU)1003, g_hInstance, NULL); if (ObjectList == NULL) break; ToolBar1 = CreateWindowEx(0, TOOLBARCLASSNAME, NULL, WS_VISIBLE | WS_CHILD | CCS_TOP | TBSTYLE_FLAT | TBSTYLE_TRANSPARENT | TBSTYLE_TOOLTIPS, 0, 0, 0, 0, MainWindow, (HMENU)1004, g_hInstance, NULL); if (ToolBar1 == NULL) break; Splitter = CreateWindowEx(0, WC_STATIC, NULL, WS_VISIBLE | WS_CHILD, 0, 0, 0, 0, MainWindow, (HMENU)1005, g_hInstance, NULL); // initialization of views SendMessage(MainWindow, WM_SIZE, 0, 0); ListView_SetExtendedListViewStyle(ObjectList, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_LABELTIP | LVS_EX_DOUBLEBUFFER); // set tree imagelist TreeViewImages = supLoadImageList(g_hInstance, IDI_ICON_VIEW_DEFAULT, IDI_ICON_VIEW_SELECTED); if (TreeViewImages) { TreeView_SetImageList(ObjectTree, TreeViewImages, TVSIL_NORMAL); } //insert run as admin menu entry if (IsFullAdmin == FALSE) { hMenu = GetSubMenu(GetMenu(MainWindow), 0); InsertMenu(hMenu, 0, MF_BYPOSITION, ID_FILE_RUNASADMIN, T_RUNASADMIN); InsertMenu(hMenu, 1, MF_BYPOSITION | MF_SEPARATOR, 0, NULL); //set menu shield icon RtlSecureZeroMemory(&sii, sizeof(sii)); sii.cbSize = sizeof(sii); if (SHGetStockIconInfo(SIID_SHIELD, SHGSI_ICON | SHGFI_SMALLICON, &sii) == S_OK) { supSetMenuIcon(hMenu, ID_FILE_RUNASADMIN, (ULONG_PTR)sii.hIcon); } } //load listview images ListViewImages = supLoadImageList(g_hInstance, IDI_ICON_DEVICE, IDI_ICON_UNKNOWN); if (ListViewImages) { tmpb = LoadImage(g_hInstance, MAKEINTRESOURCE(IDI_ICON_SORTUP), IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR); if (tmpb) { ImageList_ReplaceIcon(ListViewImages, -1, tmpb); DestroyIcon(tmpb); } tmpb = LoadImage(g_hInstance, MAKEINTRESOURCE(IDI_ICON_SORTDOWN), IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR); if (tmpb) { ImageList_ReplaceIcon(ListViewImages, -1, tmpb); DestroyIcon(tmpb); } ListView_SetImageList(ObjectList, ListViewImages, LVSIL_SMALL); } //load toolbar images ToolBarMenuImages = ImageList_LoadImage(g_hInstance, MAKEINTRESOURCE(IDB_BITMAP1), 16, 7, CLR_DEFAULT, IMAGE_BITMAP, LR_CREATEDIBSECTION); if (ToolBarMenuImages) { supCreateToolbarButtons(ToolBar1); //set menu icons hMenu = GetSubMenu(GetMenu(MainWindow), 1); if (hMenu) { supSetMenuIcon(hMenu, ID_VIEW_REFRESH, (ULONG_PTR)ImageList_ExtractIcon(g_hInstance, ToolBarMenuImages, 1)); } hMenu = GetSubMenu(GetMenu(MainWindow), 2); if (hMenu && ListViewImages) { supSetMenuIcon(hMenu, ID_OBJECT_PROPERTIES, (ULONG_PTR)ImageList_ExtractIcon(g_hInstance, ToolBarMenuImages, 0)); supSetMenuIcon(hMenu, ID_OBJECT_GOTOLINKTARGET, (ULONG_PTR)ImageList_ExtractIcon(g_hInstance, ListViewImages, ID_FROM_VALUE(IDI_ICON_SYMLINK))); } //set object -> find object menu image hMenu = GetSubMenu(GetMenu(MainWindow), 3); if (hMenu) { supSetMenuIcon(hMenu, ID_FIND_FINDOBJECT, (ULONG_PTR)ImageList_ExtractIcon(g_hInstance, ToolBarMenuImages, 2)); } //set extras-pipe menu image hMenu = GetSubMenu(GetMenu(MainWindow), 4); if (hMenu) { supSetMenuIcon(hMenu, ID_EXTRAS_PIPES, (ULONG_PTR)ImageList_ExtractIcon(g_hInstance, ToolBarMenuImages, 6)); } //set help menu image hMenu = GetSubMenu(GetMenu(MainWindow), 5); if (hMenu) { supSetMenuIcon(hMenu, ID_HELP_HELP, (ULONG_PTR)ImageList_ExtractIcon(g_hInstance, ToolBarMenuImages, 3)); } } hAccTable = LoadAccelerators(g_hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR1)); //create ObjectList columns RtlSecureZeroMemory(&col, sizeof(col)); col.mask = LVCF_TEXT | LVCF_SUBITEM | LVCF_FMT | LVCF_WIDTH | LVCF_ORDER | LVCF_IMAGE; col.iSubItem = 1; col.pszText = L"Name"; col.fmt = LVCFMT_LEFT | LVCFMT_BITMAP_ON_RIGHT; col.iOrder = 0; col.iImage = -1; if (ListViewImages) { col.iImage = ImageList_GetImageCount(ListViewImages) - 1; } col.cx = 300; ListView_InsertColumn(ObjectList, 1, &col); col.iSubItem = 2; col.pszText = L"Type"; col.iOrder = 1; col.iImage = -1; col.cx = 100; ListView_InsertColumn(ObjectList, 2, &col); col.iSubItem = 3; col.pszText = L"Additional Information"; col.iOrder = 2; col.iImage = -1; col.cx = 170; ListView_InsertColumn(ObjectList, 3, &col); ListObjectDirectoryTree(L"\\", NULL, NULL); TreeView_SelectItem(ObjectTree, TreeView_GetRoot(ObjectTree)); SetFocus(ObjectTree); do { rv = GetMessage(&msg1, NULL, 0, 0); if (rv == -1) break; if (MainDlgMsgHandler(msg1)) continue; if (IsDialogMessage(MainWindow, &msg1)) { TranslateAccelerator(MainWindow, hAccTable, &msg1); continue; } TranslateMessage(&msg1); DispatchMessage(&msg1); } while (rv != 0); } while (cond); if (class_atom != 0) UnregisterClass(MAKEINTATOM(class_atom), g_hInstance); //do not move anywhere supShutdown(); #ifdef _DEBUG if (hObject) NtClose(hObject); if (g_hMutex != NULL) { CloseHandle(g_hMutex); } if (g_hNamespace != NULL) { ClosePrivateNamespace(g_hNamespace, PRIVATE_NAMESPACE_FLAG_DESTROY); } #endif }
bool CIconList::Initialize() { bool lbOk = true; if (!mh_TabIcons) { int iSysX = GetSystemMetrics(SM_CXSMICON), iSysY = GetSystemMetrics(SM_CYSMICON); int iFontY = gpSetCls->EvalSize(gpSet->nTabFontHeight, esf_Vertical|esf_CanUseUnits|esf_CanUseDpi|esf_CanUseZoom); if (iFontY < 0) iFontY = gpSetCls->EvalFontHeight(gpSet->sTabFontFace, iFontY, gpSet->nTabFontHeight); int iDpyY = gpSetCls->EvalSize(max(16,iSysY), esf_Vertical|esf_CanUseDpi); mn_CxIcon = 16; mn_CyIcon = 16; if (iFontY > 16) { if (iDpyY <= iFontY) { mn_CxIcon = gpSetCls->EvalSize(max(16,iSysX), esf_Horizontal|esf_CanUseDpi); mn_CyIcon = iDpyY; } else { // Issue 1939: Tab bar height too big since version 150307 int iSizes[] = {20, 24, 28, 32, 40, 48, 60, 64}; iFontY++; // Allow one pixes larger... for (INT_PTR j = countof(iSizes)-1; j >= 0; j--) { if (iFontY >= iSizes[j]) { mn_CyIcon = iSizes[j]; mn_CxIcon = (iSysX * iSizes[j]) / iSysY; break; } } } } wchar_t szLog[100]; _wsprintf(szLog, SKIPCOUNT(szLog) L"Creating IconList for size {%ix%i} SysIcon size is {%ix%i}", mn_CxIcon, mn_CyIcon, iSysX, iSysY); gpConEmu->LogString(szLog); if ((mh_TabIcons = ImageList_Create(mn_CxIcon, mn_CyIcon, ILC_COLOR24|ILC_MASK, 0, 16)) != NULL) { CToolImg img; int nFirstAdd = -1; const int iShieldButtons = 4; if (img.Create(mn_CxIcon, mn_CyIcon, iShieldButtons, GetSysColor(COLOR_BTNFACE))) { if (img.AddButtons(g_hInstance, IDB_SHIELD16, iShieldButtons)) { HBITMAP hShieldUser = img.GetBitmap(); #ifdef _DEBUG BITMAP bmi = {}; GetObject(hShieldUser, sizeof(bmi), &bmi); #ifdef _DEBUG //SaveImageEx(L"T:\\ShieldUser.png", hShieldUser); #endif #endif nFirstAdd = ImageList_AddMasked(mh_TabIcons, hShieldUser, RGB(128,0,0)); } } #ifdef _DEBUG int iCount = ImageList_GetImageCount(mh_TabIcons); _ASSERTE(iCount==4); IMAGEINFO ii = {}; BOOL b; // An application should not call DeleteObject to destroy the bitmaps retrieved by ImageList_GetImageInfo b = ImageList_GetImageInfo(mh_TabIcons, 0, &ii); b = ImageList_GetImageInfo(mh_TabIcons, 1, &ii); #endif if (nFirstAdd >= 0) { mn_AdminIcon = nFirstAdd + ((gOSVer.dwMajorVersion >= 6) ? 0 : 1); } else { lbOk = false; } } else { lbOk = false; } } return lbOk; }
HIMAGELIST SdkCreateGrayImageList( IN HIMAGELIST himlNormal ) { int Count, i; int Width, Height; HIMAGELIST himlGray; HDC hdcDesktop; HDC hdcMem; RECT rc; COLORREF crMask; HPALETTE hpal; UINT index; HGDIOBJ hbm; HGDIOBJ hbmOld; COLORREF rgb; BYTE gray; HWND hWnd; int x, y; Count = ImageList_GetImageCount(himlNormal); if (Count == 0) { return NULL; } ImageList_GetIconSize(himlNormal, &Width, &Height); himlGray = ImageList_Create(Width, Height, ILC_COLOR24 | ILC_MASK, Count, 0); hdcDesktop = GetDC(NULL); hdcMem = CreateCompatibleDC(NULL); rc.top = rc.left = 0; rc.bottom = Height; rc.right = Width; crMask = RGB(200, 199, 200); if (GetDeviceCaps(hdcDesktop, BITSPIXEL) < 24) { hpal = (HPALETTE)GetCurrentObject(hdcDesktop, OBJ_PAL); index = GetNearestPaletteIndex(hpal, crMask); if (index != CLR_INVALID) { crMask = PALETTEINDEX(index); } } for (i = 0 ; i < Count; ++i) { hbm = CreateCompatibleBitmap(hdcDesktop, Width, Height); hbmOld = SelectObject(hdcMem, hbm); SdkFillSolidRect(hdcMem, crMask, &rc); ImageList_SetBkColor(himlNormal, crMask); ImageList_Draw(himlNormal, i, hdcMem, 0, 0, ILD_NORMAL); for (x = 0 ; x < Width; ++x) { for (y = 0; y < Height; ++y) { rgb = GetPixel(hdcMem, x, y); if (rgb != crMask) { gray = (BYTE) (95 + (GetRValue(rgb) * 3 + GetGValue(rgb) * 6 + GetBValue(rgb)) / 20); SetPixel(hdcMem, x, y, RGB(gray, gray, gray)); } } } hbm = SelectObject(hdcMem, hbmOld); ImageList_AddMasked(himlGray, (HBITMAP)hbm, crMask); DeleteObject(hbm); } DeleteDC(hdcMem); hWnd = WindowFromDC(hdcDesktop); ReleaseDC(hWnd, hdcDesktop); return himlGray; }
// Returns the number of images in the image list. int wxImageList::GetImageCount() const { wxASSERT_MSG( m_hImageList, wxT("invalid image list") ); return ImageList_GetImageCount(GetHImageList()); }
void CXTPHeaderCtrlTheme::OnDrawItemBitmap(LPDRAWITEMSTRUCT lpDIS, CRect& rcText, CXTPHeaderCtrl* pHeaderCtrl) { ASSERT_VALID(pHeaderCtrl); HDITEM hdi; hdi.mask = HDI_BITMAP | HDI_FORMAT | HDI_IMAGE; pHeaderCtrl->GetItem(lpDIS->itemID, &hdi); HIMAGELIST hImageList = 0; int nIndex = -1; if (hdi.fmt & HDF_BITMAP && hdi.hbm != NULL) { hImageList = (HIMAGELIST)hdi.hbm; nIndex = 0; } else if (hdi.fmt & HDF_IMAGE) { hImageList = (HIMAGELIST)pHeaderCtrl->SendMessage(HDM_GETIMAGELIST); nIndex = hdi.iImage; } if (nIndex != -1 && (hdi.fmt & HDF_IMAGE) && pHeaderCtrl->GetImageManager()) { CXTPImageManagerIcon* pIcon = pHeaderCtrl->GetImageManager()->GetImage(nIndex, 0); if (pIcon) { CRect rcItem(lpDIS->rcItem); CPoint point(rcText.left, (rcItem.Height() - pIcon->GetHeight()) / 2); rcText.left += pIcon->GetWidth() + m_sizePadding.cx; XTPImageState imageState = (lpDIS->itemState & ODS_SELECTED) ? xtpImageChecked : (lpDIS->itemState & ODS_HOTLIGHT) ? xtpImageHot : xtpImageNormal; if (lpDIS->itemState == ODS_SELECTED) point.Offset(1, 1); if (point.x + pIcon->GetWidth() > lpDIS->rcItem.right) return; // draw image transparently. pIcon->Draw(CDC::FromHandle(lpDIS->hDC), point, pIcon->GetIcon(imageState)); return; } } if (hImageList) { int cx, cy; if (::ImageList_GetIconSize(hImageList, &cx, &cy) && (nIndex < ImageList_GetImageCount(hImageList))) { CRect rcItem(lpDIS->rcItem); CPoint point(rcText.left, (rcItem.Height() - cy) / 2); rcText.left += cx + m_sizePadding.cx; if (lpDIS->itemState == ODS_SELECTED) point.Offset(1, 1); if (point.x + cx > lpDIS->rcItem.right) return; // draw image transparently. ::ImageList_Draw(hImageList, nIndex, lpDIS->hDC, point.x, point.y, ILD_TRANSPARENT); } } }
int CCImageList::GetCount() { return ImageList_GetImageCount(m_hImageList); }
INT_PTR CALLBACK DlgProcFiltering(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { static HANDLE hItemAll; switch (msg) { case WM_INITDIALOG: { TranslateDialogDefault(hwndDlg); HIMAGELIST hImageList = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), IsWinVerXPPlus() ? ILC_COLOR32 : ILC_COLOR16 | ILC_MASK, 3, 3); ImageList_AddIcon(hImageList, LoadIcon(hInst,MAKEINTRESOURCE(IDI_SOUND))); SendDlgItemMessage(hwndDlg,IDC_SOUNDICON,STM_SETICON, (WPARAM)ImageList_GetIcon(hImageList, EXTRA_IMAGE_SOUND, ILD_NORMAL), 0); ImageList_AddIcon(hImageList, LoadIcon(hInst, MAKEINTRESOURCE(IDI_POPUP))); SendDlgItemMessage(hwndDlg, IDC_POPUPICON, STM_SETICON, (WPARAM)ImageList_GetIcon(hImageList, EXTRA_IMAGE_POPUP, ILD_NORMAL), 0); ImageList_AddIcon(hImageList, LoadIcon(hInst,MAKEINTRESOURCE(IDI_XSTATUS))); SendDlgItemMessage(hwndDlg, IDC_XSTATUSICON, STM_SETICON, (WPARAM)ImageList_GetIcon(hImageList, EXTRA_IMAGE_XSTATUS, ILD_NORMAL), 0); ImageList_AddIcon(hImageList, LoadIcon(hInst,MAKEINTRESOURCE(IDI_LOGGING))); SendDlgItemMessage(hwndDlg, IDC_LOGGINGICON, STM_SETICON, (WPARAM)ImageList_GetIcon(hImageList, EXTRA_IMAGE_LOGGING, ILD_NORMAL), 0); ImageList_AddIcon(hImageList, LoadIcon(hInst,MAKEINTRESOURCE(IDI_DISABLEALL))); SendDlgItemMessage(hwndDlg, IDC_DISABLEALLICON, STM_SETICON, (WPARAM)ImageList_GetIcon(hImageList, EXTRA_IMAGE_DISABLEALL, ILD_NORMAL), 0); ImageList_AddIcon(hImageList, LoadIcon(hInst,MAKEINTRESOURCE(IDI_ENABLEALL))); SendDlgItemMessage(hwndDlg, IDC_ENABLEALLICON, STM_SETICON, (WPARAM)ImageList_GetIcon(hImageList, EXTRA_IMAGE_ENABLEALL, ILD_NORMAL), 0); ImageList_AddIcon(hImageList, LoadSkinnedIcon(SKINICON_OTHER_SMALLDOT)); SendDlgItemMessage(hwndDlg, IDC_INDSNDLIST, CLM_SETEXTRAIMAGELIST, 0, (LPARAM)hImageList); SendDlgItemMessage(hwndDlg, IDC_INDSNDLIST, CLM_SETEXTRACOLUMNS, 6, 0); HWND hList = GetDlgItem(hwndDlg, IDC_INDSNDLIST); ResetListOptions(hList); CLCINFOITEM cii = {0}; cii.cbSize = sizeof(cii); cii.flags = CLCIIF_GROUPFONT; cii.pszText = TranslateT("** All contacts **"); hItemAll = (HANDLE)SendDlgItemMessage(hwndDlg, IDC_INDSNDLIST, CLM_ADDINFOITEM, 0, (LPARAM)&cii); return TRUE; } case WM_SETFOCUS: { SetFocus(GetDlgItem(hwndDlg, IDC_INDSNDLIST)); break; } case WM_NOTIFY: { HWND hList = GetDlgItem(hwndDlg, IDC_INDSNDLIST); switch(((LPNMHDR)lParam)->idFrom) { case IDC_INDSNDLIST: switch (((LPNMHDR)lParam)->code) { case CLN_NEWCONTACT: case CLN_LISTREBUILT: SetAllContactsIcons(hList); //fall through case CLN_CONTACTMOVED: SetGroupsIcons(hList, (HANDLE)SendMessage(hList, CLM_GETNEXTITEM, CLGN_ROOT, 0), hItemAll, NULL); break; case CLN_OPTIONSCHANGED: ResetListOptions(hList); break; case NM_CLICK: { NMCLISTCONTROL *nm = (NMCLISTCONTROL*)lParam; DWORD hitFlags; // Make sure we have an extra column if (nm->iColumn == -1) break; // Find clicked item HANDLE hItem = (HANDLE)SendMessage(hList, CLM_HITTEST, (WPARAM)&hitFlags, MAKELPARAM(nm->pt.x, nm->pt.y)); if (hItem == NULL) break; if(!(hitFlags & CLCHT_ONITEMEXTRA)) break; int itemType = SendMessage(hList, CLM_GETITEMTYPE, (WPARAM)hItem, 0); // Get image in clicked column int image = GetExtraImage(hList, hItem, nm->iColumn); if (image == EXTRA_IMAGE_DOT) image = nm->iColumn; else if (image >= EXTRA_IMAGE_SOUND && image <= EXTRA_IMAGE_LOGGING) image = EXTRA_IMAGE_DOT; // Get item type (contact, group, etc...) if (itemType == CLCIT_CONTACT) { if (image == EXTRA_IMAGE_DISABLEALL) { for (int i = 0; i < 4; i++) SetExtraImage(hList, hItem, i, EXTRA_IMAGE_DOT); } else if (image == EXTRA_IMAGE_ENABLEALL) { for (int i = 0; i < 4; i++) SetExtraImage(hList, hItem, i, i); } else { SetExtraImage(hList, hItem, nm->iColumn, image); } } else if (itemType == CLCIT_INFO || itemType == CLCIT_GROUP) { if (itemType == CLCIT_GROUP) hItem = (HANDLE)SendMessage(hList, CLM_GETNEXTITEM, CLGN_CHILD, (LPARAM)hItem); if (hItem) { if (image == EXTRA_IMAGE_DISABLEALL) { for (int i = 0; i < 4; i++) SetAllChildrenIcons(hList, hItem, i, EXTRA_IMAGE_DOT); } else if (image == EXTRA_IMAGE_ENABLEALL) { for (int i = 0; i < 4; i++) SetAllChildrenIcons(hList, hItem, i, i); } else { SetAllChildrenIcons(hList, hItem, nm->iColumn, image); } } } // Update the all/none icons SetGroupsIcons(hList, (HANDLE)SendMessage(hList, CLM_GETNEXTITEM, CLGN_ROOT, 0), hItemAll, NULL); // Activate Apply button SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; } } break; case 0: switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: { HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0); do { HANDLE hItem = (HANDLE)SendMessage(hList, CLM_FINDCONTACT, (WPARAM)hContact, 0); if (hItem) { if (GetExtraImage(hList, hItem, EXTRA_IMAGE_SOUND) == EXTRA_IMAGE_SOUND) DBDeleteContactSetting(hContact, MODULE, "EnableSounds"); else DBWriteContactSettingByte(hContact, MODULE, "EnableSounds", 0); if (GetExtraImage(hList, hItem, EXTRA_IMAGE_POPUP) == EXTRA_IMAGE_POPUP) DBDeleteContactSetting(hContact, MODULE, "EnablePopups"); else DBWriteContactSettingByte(hContact, MODULE, "EnablePopups", 0); if(GetExtraImage(hList, hItem, EXTRA_IMAGE_XSTATUS) == EXTRA_IMAGE_XSTATUS) DBDeleteContactSetting(hContact, MODULE, "EnableXStatusNotify"); else DBWriteContactSettingByte(hContact, MODULE, "EnableXStatusNotify", 0); if (GetExtraImage(hList, hItem, EXTRA_IMAGE_LOGGING) == EXTRA_IMAGE_LOGGING) DBDeleteContactSetting(hContact, MODULE, "EnableLogging"); else DBWriteContactSettingByte(hContact, MODULE, "EnableLogging", 0); } } while(hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0)); return TRUE; } } break; } break; } case WM_DESTROY: { HIMAGELIST hImageList = (HIMAGELIST)SendMessage(GetDlgItem(hwndDlg, IDC_INDSNDLIST), CLM_GETEXTRAIMAGELIST, 0, 0); for (int i = 0; i < ImageList_GetImageCount(hImageList); i++) DestroyIcon(ImageList_GetIcon(hImageList, i, ILD_NORMAL)); ImageList_Destroy(hImageList); break; } } return FALSE; }
static void test_removeimage(void) { static const BYTE bits[32]; HWND hwTab; INT i; TCITEM item; HICON hicon; HIMAGELIST himl = ImageList_Create(16, 16, ILC_COLOR, 3, 4); hicon = CreateIcon(NULL, 16, 16, 1, 1, bits, bits); ImageList_AddIcon(himl, hicon); ImageList_AddIcon(himl, hicon); ImageList_AddIcon(himl, hicon); hwTab = create_tabcontrol(TCS_FIXEDWIDTH, TCIF_TEXT|TCIF_IMAGE); SendMessage(hwTab, TCM_SETIMAGELIST, 0, (LPARAM)himl); memset(&item, 0, sizeof(TCITEM)); item.mask = TCIF_IMAGE; for(i = 0; i < 3; i++) { SendMessage(hwTab, TCM_GETITEM, i, (LPARAM)&item); expect(i, item.iImage); } /* remove image middle image */ SendMessage(hwTab, TCM_REMOVEIMAGE, 1, 0); expect(2, ImageList_GetImageCount(himl)); item.iImage = -1; SendMessage(hwTab, TCM_GETITEM, 0, (LPARAM)&item); expect(0, item.iImage); item.iImage = 0; SendMessage(hwTab, TCM_GETITEM, 1, (LPARAM)&item); expect(-1, item.iImage); item.iImage = 0; SendMessage(hwTab, TCM_GETITEM, 2, (LPARAM)&item); expect(1, item.iImage); /* remove first image */ SendMessage(hwTab, TCM_REMOVEIMAGE, 0, 0); expect(1, ImageList_GetImageCount(himl)); item.iImage = 0; SendMessage(hwTab, TCM_GETITEM, 0, (LPARAM)&item); expect(-1, item.iImage); item.iImage = 0; SendMessage(hwTab, TCM_GETITEM, 1, (LPARAM)&item); expect(-1, item.iImage); item.iImage = -1; SendMessage(hwTab, TCM_GETITEM, 2, (LPARAM)&item); expect(0, item.iImage); /* remove the last one */ SendMessage(hwTab, TCM_REMOVEIMAGE, 0, 0); expect(0, ImageList_GetImageCount(himl)); for(i = 0; i < 3; i++) { item.iImage = 0; SendMessage(hwTab, TCM_GETITEM, i, (LPARAM)&item); expect(-1, item.iImage); } DestroyWindow(hwTab); ImageList_Destroy(himl); DestroyIcon(hicon); }
static int winTabsGetImageIndex(Ihandle* ih, const char* name) { HIMAGELIST image_list; int count, i, bpp, ret; Iarray* bmp_array; HBITMAP *bmp_array_data, hMask=NULL; HBITMAP bmp = iupImageGetImage(name, ih, 0); if (!bmp) return -1; /* the array is used to avoi adding the same bitmap twice */ bmp_array = (Iarray*)iupAttribGet(ih, "_IUPWIN_BMPARRAY"); if (!bmp_array) { /* create the array if does not exist */ bmp_array = iupArrayCreate(50, sizeof(HBITMAP)); iupAttribSetStr(ih, "_IUPWIN_BMPARRAY", (char*)bmp_array); } bmp_array_data = iupArrayGetData(bmp_array); image_list = (HIMAGELIST)SendMessage(ih->handle, TCM_GETIMAGELIST, 0, 0); if (!image_list) { int width, height; UINT flags = ILC_COLOR32|ILC_MASK; /* must use this info, since image can be a driver image loaded from resources */ iupdrvImageGetInfo(bmp, &width, &height, &bpp); /* create the image list if does not exist */ image_list = ImageList_Create(width, height, flags, 0, 50); SendMessage(ih->handle, TCM_SETIMAGELIST, 0, (LPARAM)image_list); } else iupdrvImageGetInfo(bmp, NULL, NULL, &bpp); /* check if that bitmap is already added to the list, but we can not compare with the actual bitmap at the list since it is a copy */ count = ImageList_GetImageCount(image_list); for (i=0; i<count; i++) { if (bmp_array_data[i] == bmp) return i; } if (bpp == 8) { Ihandle* image = IupGetHandle(name); if (image) { iupAttribSetStr(image, "_IUPIMG_NO_INVERT", "1"); hMask = iupdrvImageCreateMask(image); iupAttribSetStr(image, "_IUPIMG_NO_INVERT", NULL); } } bmp_array_data = iupArrayInc(bmp_array); bmp_array_data[i] = bmp; ret = ImageList_Add(image_list, bmp, hMask); /* the bmp is duplicated at the list */ DeleteObject(hMask); return ret; }
RT_B RT_API RtCreateGuiCommandMenuItemManager(RT_GUI_COMMAND_MENU_ITEM_MANAGER* lpGuiCommandMenuItemManager, RT_GUI_COMMAND_MENU_ITEM* lpCommandMenuItems, RT_UN unCommandMenuItemsCount, RT_H hInstance) { RT_H hDc; RT_N nIconsCount; RT_N nImageIndex; RT_H hTemporaryToolBar; RT_N nSystemImageList; RT_N lpSystemImageListIndex[3]; RT_UN32 unOsVersion; RT_UN32 lpMaskBuffer[256]; RT_UN32 lpColorBuffer[256]; RT_N nI; RT_B bResult; /* Used to load system images. */ hTemporaryToolBar = RT_NULL; hDc = RT_NULL; unOsVersion = RtGetOsVersion(RT_NULL); lpGuiCommandMenuItemManager->lpCommandMenuItems = lpCommandMenuItems; lpGuiCommandMenuItemManager->nCommandMenuItemsCount = unCommandMenuItemsCount; /* Count icons. The result is not accurate as the user can use system image lists, but it will help for initial image list size. */ nIconsCount = 0; for (nI = 0; nI < unCommandMenuItemsCount; nI++) { if (lpCommandMenuItems[nI].hIcon) { nIconsCount++; } lpCommandMenuItems[nI].hBitmap = RT_NULL; } lpGuiCommandMenuItemManager->hToolBarImageList = ImageList_Create(16, 16, ILC_COLOR32 | ILC_MASK, nIconsCount, 8); if (!lpGuiCommandMenuItemManager->hToolBarImageList) goto handle_error; /* By default, there is no system image list loaded. */ for (nI = 0; nI < 3; nI++) { lpSystemImageListIndex[nI] = -1; } /* Loop on command menu items. */ nImageIndex = 0; for (nI = 0; nI < unCommandMenuItemsCount; nI++) { if (lpCommandMenuItems[nI].hIcon) { /* The user has provided an icon. */ if (ImageList_AddIcon(lpGuiCommandMenuItemManager->hToolBarImageList, lpCommandMenuItems[nI].hIcon) == -1) { goto handle_error; } lpCommandMenuItems[nI].unImageIndex = nImageIndex; nImageIndex++; } else if (lpCommandMenuItems[nI].nSystemImageList != -1) { /* The user want to use an icon from a system image list. */ switch (lpCommandMenuItems[nI].nSystemImageList) { case IDB_STD_SMALL_COLOR: nSystemImageList = 0; break; case IDB_VIEW_SMALL_COLOR: nSystemImageList = 1; break; case IDB_HIST_SMALL_COLOR: nSystemImageList = 2; break; default: nSystemImageList = -1; } if (nSystemImageList == -1) { RtSetLastError(RT_ERROR_BAD_ARGUMENTS); goto handle_error; } /* If the system list is not already loaded in the image list. */ if (lpSystemImageListIndex[nSystemImageList] == -1) { /* We need a temporary toolbar to load system images in the image list. */ if (!hTemporaryToolBar) { hTemporaryToolBar = CreateWindowEx(0, /* Extended style. */ TOOLBARCLASSNAME, /* Class name. */ _R("TemporaryToolBar"), /* Window name. */ 0, /* Style. */ 0, 0, 0, 0, RT_NULL, /* Parent. */ RT_NULL, /* Control id. */ hInstance, RT_NULL); if (!hTemporaryToolBar) { goto handle_error; } /* We use our main image list as temporary image list. */ SendMessage(hTemporaryToolBar, TB_SETIMAGELIST, 0, (LPARAM)lpGuiCommandMenuItemManager->hToolBarImageList); } SendMessage(hTemporaryToolBar, TB_LOADIMAGES, (WPARAM)lpCommandMenuItems[nI].nSystemImageList, (LPARAM)HINST_COMMCTRL); lpSystemImageListIndex[nSystemImageList] = nImageIndex; nImageIndex = ImageList_GetImageCount(lpGuiCommandMenuItemManager->hToolBarImageList); } lpCommandMenuItems[nI].unImageIndex = lpSystemImageListIndex[nSystemImageList] + lpCommandMenuItems[nI].nSystemImageIndex; /* Create the menu icon from the image list. */ lpCommandMenuItems[nI].hIcon = ImageList_ExtractIcon(0, lpGuiCommandMenuItemManager->hToolBarImageList, lpCommandMenuItems[nI].unImageIndex); if (!lpCommandMenuItems[nI].hIcon) { goto handle_error; } } else { lpCommandMenuItems[nI].unImageIndex = -1; } /* Under vista, we must use a PARGB bitmap for menus. */ if (unOsVersion >= 6) { if (lpCommandMenuItems[nI].hIcon) { /* Get a reference DC. */ if (!hDc) { hDc = GetDC(RT_NULL); if (!hDc) goto handle_error; } /* Create a PARG bitmap from the icon. */ lpCommandMenuItems[nI].hBitmap = RtConvertIconToPargbBitmap(lpCommandMenuItems[nI].hIcon, 16, 16, lpMaskBuffer, lpColorBuffer, hDc); if (!lpCommandMenuItems[nI].hBitmap) goto handle_error; } } } bResult = RT_TRUE; goto free_resources; handle_error: /* Free allocated content in case of error. */ if (lpGuiCommandMenuItemManager->hToolBarImageList) { ImageList_Destroy(lpGuiCommandMenuItemManager->hToolBarImageList); } /* Free allocated icons and bitmaps. */ for (nI = 0; nI < unCommandMenuItemsCount; nI++) { if (lpCommandMenuItems[nI].nSystemImageIndex != -1) { if (lpCommandMenuItems[nI].hIcon) { DestroyIcon(lpCommandMenuItems[nI].hIcon); } } if (lpCommandMenuItems[nI].hBitmap) { DeleteObject(lpCommandMenuItems[nI].hBitmap); } } bResult = RT_FALSE; free_resources: if (hDc) { if (!ReleaseDC(RT_NULL, hDc) && bResult) { hDc = RT_NULL; goto handle_error; } hDc = RT_NULL; } if (hTemporaryToolBar) { if (!DestroyWindow(hTemporaryToolBar) && bResult) { hTemporaryToolBar = RT_NULL; goto handle_error; } hTemporaryToolBar = RT_NULL; } return bResult; }