//解析图标 STDMETHODIMP CExtractIcon::Extract( LPCTSTR pstrName, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT /*nIconSize*/ ) { TRACE_FUNCTION(); LOG(_T("%s GetIcon %s %d"), __TFUNCTION__, pstrName, nIconIndex ); ATLASSERT(phiconLarge); ATLASSERT(phiconSmall); //HMODULE hLib = LoadLibrary( pstrName ); //if ( hLib ) //{ // *phiconSmall = LoadIcon( (HINSTANCE)hLib, MAKEINTRESOURCE(nIconIndex) ); // *phiconLarge = LoadIcon( (HINSTANCE)hLib, MAKEINTRESOURCE(nIconIndex) ); // FreeLibrary( hLib ); // return S_OK; //} SHFILEINFO sfi = { 0 }; HIMAGELIST hImgList = (HIMAGELIST)SHGetFileInfo( m_szPath, 0,\ &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX|SHGFI_SMALLICON|SHGFI_ICON ); if ( hImgList ) { LOG( _T("%s Geting Smallone"), __TFUNCTION__ ); *phiconSmall = ImageList_ExtractIcon(NULL, hImgList, nIconIndex); } hImgList = (HIMAGELIST)SHGetFileInfo( m_szPath, 0, &sfi, \ sizeof(SHFILEINFO), SHGFI_SYSICONINDEX|SHGFI_LARGEICON|SHGFI_ICON ); if ( hImgList ) { LOG( _T("%s Geting Bigone"), __TFUNCTION__ ); *phiconLarge = ImageList_ExtractIcon(NULL, hImgList, nIconIndex); } TRACE_RETURN S_OK; }
/* * supHandleObjectPopupMenu * * Purpose: * * Object List popup menu builder. * */ VOID supHandleObjectPopupMenu( HWND hwnd, int iItem, LPPOINT point ) { HMENU hMenu; UINT uEnable = MF_BYCOMMAND | MF_GRAYED; hMenu = CreatePopupMenu(); if (hMenu == NULL) return; InsertMenu(hMenu, 0, MF_BYCOMMAND, ID_OBJECT_PROPERTIES, T_PROPERTIES); supSetMenuIcon(hMenu, ID_OBJECT_PROPERTIES, (ULONG_PTR)ImageList_ExtractIcon(g_hInstance, ToolBarMenuImages, 0)); if (supIsSymlink(iItem)) { InsertMenu(hMenu, 1, MF_BYCOMMAND, ID_OBJECT_GOTOLINKTARGET, T_GOTOLINKTARGET); supSetMenuIcon(hMenu, ID_OBJECT_GOTOLINKTARGET, (ULONG_PTR)ImageList_ExtractIcon(g_hInstance, ListViewImages, ID_FROM_VALUE(IDI_ICON_SYMLINK))); uEnable &= ~MF_GRAYED; } EnableMenuItem(GetSubMenu(GetMenu(hwnd), 2), ID_OBJECT_GOTOLINKTARGET, uEnable); TrackPopupMenu(hMenu, TPM_RIGHTBUTTON | TPM_LEFTALIGN, point->x, point->y, 0, hwnd, NULL); DestroyMenu(hMenu); }
HICON GetIcon (int nImage, int nImageSize ) /*++ Routine Description: GetIcon extracts an Icon from the applications image list Arguments: nImage -- index of Image nImageSize -- 16 or 32 Return Value: HICON -- Handle to Icon --*/ { HANDLE hImageList; if (nImageSize == 16) { hImageList = _h16x16Imagelist; } else { hImageList = _h32x32Imagelist; } return( ImageList_ExtractIcon(_hModule, hImageList, nImage) ); }
BOOL CPropertiesCtrl::GetIconsIndexes( const TCHAR * sPath, int& nIcon, int& nIconOpen ) { nIcon = nIconOpen = 0; if( !sPath ) return FALSE; SHFILEINFO shFI; memset( &shFI, 0, sizeof( shFI ) ); DWORD dwRes = SHGetFileInfo( sPath, 0, &shFI, sizeof( shFI ), SHGFI_SYSICONINDEX | SHGFI_SMALLICON ); if( dwRes > 0 ) { _stprintf( shFI.szDisplayName, _T("%d"), dwRes ); shFI.hIcon = ImageList_ExtractIcon( NULL, (HIMAGELIST)dwRes, shFI.iIcon ); CFTCIconMap::iterator itIcon = m_miPresentIcon.find( CFTCIconInfo( shFI.szDisplayName, shFI.iIcon ) ); if( itIcon == m_miPresentIcon.end() ) { if( shFI.hIcon ) nIcon = m_imlNormal.Add( shFI.hIcon ); if( nIcon > 0 ) m_miPresentIcon.insert( CFTCIconMap::value_type( CFTCIconInfo( shFI.szDisplayName, shFI.iIcon ), nIcon ) ); } else nIcon = itIcon->second; } if( shFI.hIcon ) ::DestroyIcon( shFI.hIcon ); memset( &shFI, 0, sizeof( shFI ) ); dwRes = SHGetFileInfo( sPath, 0, &shFI, sizeof( shFI ), SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_OPENICON ); if( dwRes > 0 ) { _stprintf( shFI.szDisplayName, _T("%d"), dwRes ); shFI.hIcon = CImageList::FromHandle( (HIMAGELIST)dwRes )->ExtractIcon( shFI.iIcon ); CFTCIconMap::iterator itIcon = m_miPresentIcon.find( CFTCIconInfo( shFI.szDisplayName, shFI.iIcon ) ); if( itIcon == m_miPresentIcon.end() ) { if( shFI.hIcon ) nIconOpen = m_imlNormal.Add( shFI.hIcon ); if( nIconOpen > 0 ) m_miPresentIcon.insert( CFTCIconMap::value_type( CFTCIconInfo( shFI.szDisplayName, shFI.iIcon ), nIconOpen ) ); } else nIconOpen = itIcon->second; } if( shFI.hIcon ) ::DestroyIcon( shFI.hIcon ); if( !nIconOpen ) nIconOpen = nIcon; return ( nIcon && nIconOpen ) ? TRUE : FALSE; }
HICON load_sysicon(wchar_t *path, int size) { UINT cbfileinfo = (size <= 16) ? SHGFI_SYSICONINDEX|SHGFI_SMALLICON : SHGFI_SYSICONINDEX; SHFILEINFO shinfo; HIMAGELIST sysimgl = (HIMAGELIST)SHGetFileInfo(path, 0, &shinfo, sizeof(SHFILEINFO), cbfileinfo); if (sysimgl) return ImageList_ExtractIcon(NULL, sysimgl, shinfo.iIcon); return NULL; }
void CSaveModifiedItemsDialog::CreateDefaultImages(void) { // IMPORTANT! Win2K and WinXP have the same index for this bitmap. // There's even a standard TB_LOADIMAGES message for toolbar that loads it, // along with standard image indexes into the bitmap. // However, instead of creating a toolbar and issuing TB_LOADIMAGES, // we'll load the bitmap directly by its index (120) and // the color mask (192,192,192). // Double check future versions of Windows to make sure // this all works correctly. HMODULE hComCtl32 = GetModuleHandle(_T("comctl32.dll")); if(hComCtl32) { HIMAGELIST hCommonToolbar = ImageList_LoadBitmap(hComCtl32, MAKEINTRESOURCE(120), 16, 0, RGB(192,192,192)); if(hCommonToolbar) { HICON hFileNew = ImageList_ExtractIcon(NULL, hCommonToolbar, STD_FILENEW); HICON hFileSave = ImageList_ExtractIcon(NULL, hCommonToolbar, STD_FILESAVE); if(hFileNew) { int fileNewIndex = m_images.AddIcon(hFileNew); ATLASSERT(fileNewIndex == 0); ::DestroyIcon(hFileNew); hFileNew = NULL; } if(hFileSave) { int fileSaveIndex = m_images.AddIcon(hFileSave); ATLASSERT(fileSaveIndex == 1); m_dialogIcon = hFileSave; this->SetIcon(m_dialogIcon, ICON_SMALL); } ImageList_Destroy(hCommonToolbar); hCommonToolbar = NULL; } } }
int CSysImageList::GetFileIcon(LPCTSTR file, DWORD attributes, UINT extraFlags) { SHFILEINFO sfi; SecureZeroMemory(&sfi, sizeof sfi); SHGetFileInfo(file, attributes, &sfi, sizeof sfi, SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES | extraFlags); auto hIcon = ImageList_ExtractIcon(nullptr, hSystemImageList, sfi.iIcon); auto index = AddIcon(hIcon); DestroyIcon(hIcon); return index; }
// Get the icon wxIcon wxImageList::GetIcon(int index) const { HICON hIcon = ImageList_ExtractIcon(0, GetHImageList(), index); if (hIcon) { wxIcon icon; icon.SetHICON((WXHICON)hIcon); int iconW, iconH; GetSize(index, iconW, iconH); icon.SetSize(iconW, iconH); return icon; } else return wxNullIcon; }
/* * supHandleTreePopupMenu * * Purpose: * * Object Tree popup menu builder. * */ VOID supHandleTreePopupMenu( HWND hwnd, LPPOINT point ) { HMENU hMenu; hMenu = CreatePopupMenu(); if (hMenu == NULL) return; InsertMenu(hMenu, 0, MF_BYCOMMAND, ID_OBJECT_PROPERTIES, T_PROPERTIES); supSetMenuIcon(hMenu, ID_OBJECT_PROPERTIES, (ULONG_PTR)ImageList_ExtractIcon(g_hInstance, ToolBarMenuImages, 0)); TrackPopupMenu(hMenu, TPM_RIGHTBUTTON | TPM_LEFTALIGN, point->x, point->y, 0, hwnd, NULL); DestroyMenu(hMenu); }
/////////////////////////////////////////////////////////////////////////////// // Paint the toolbar void CToolBarXP::OnPaint () { if ( m_bDelayedButtonLayout ) { Layout(); } CPaintDC cpDC (this); CBufferDC cDC (cpDC); CRect rcClip; cDC.GetClipBox (rcClip); cDC.SetBkMode (TRANSPARENT); cDC.SelectObject (CFont::FromHandle ((HFONT)GetStockObject (DEFAULT_GUI_FONT))); cDC.FillSolidRect (rcClip, HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), 20, 0)); CPoint ptCursor; ::GetCursorPos (&ptCursor); ScreenToClient (&ptCursor); CClientRect rcClient (this); HIMAGELIST m_hImageList = (HIMAGELIST)DefWindowProc (TB_GETIMAGELIST, 0, 0); TBBUTTON tbbutton; int nCount = DefWindowProc (TB_BUTTONCOUNT, 0, 0); int nHotItem = GetToolBarCtrl().GetHotItem(); for ( int i = 0; i < nCount; i++ ) { VERIFY(DefWindowProc (TB_GETBUTTON, i, (LPARAM)&tbbutton)); if ( !IS_VISIBLE(tbbutton) ) { continue; } CRect rcButton; VERIFY(DefWindowProc (TB_GETITEMRECT, i, (LPARAM)&rcButton)); if ( !CRect().IntersectRect (rcClip, rcButton) ) { continue; } bool bOver = nHotItem == i && IS_ENABLED(tbbutton); bool bPressed = false; if ( IS_INDETERMINATE(tbbutton) ) { CPenDC pen (cDC, ::GetSysColor (COLOR_3DSHADOW)); cDC.MoveTo (rcButton.left, rcButton.bottom); cDC.LineTo (rcButton.left, rcButton.top); cDC.LineTo (rcButton.right-1, rcButton.top); cDC.LineTo (rcButton.right-1, rcButton.bottom-1); cDC.LineTo (rcButton.left, rcButton.bottom-1); bOver = true; } else if ( bOver || IS_CHECKED(tbbutton) ) { bPressed = KEYDOWN(VK_LBUTTON) && rcButton.PtInRect (ptCursor); if ( IS_DROPDOWN(tbbutton) && bPressed ) { bPressed = ptCursor.x < rcButton.right-13; if ( bPressed ) { rcButton.right -= 13; } } COLORREF crHighLight = ::GetSysColor (COLOR_HIGHLIGHT); CPenDC pen (cDC, crHighLight); CBrushDC brush (cDC, bPressed||(bOver&&IS_CHECKED(tbbutton)) ? HLS_TRANSFORM (crHighLight, +50, -50) : (bOver ? HLS_TRANSFORM (crHighLight, +70, -57) : HLS_TRANSFORM (crHighLight, +80, -66))); cDC.Rectangle (&rcButton); if ( IS_DROPDOWN(tbbutton) ) { if ( bPressed ) { int nLeft = rcButton.left; rcButton.left = rcButton.right-1; rcButton.right += 13; brush.Color (HLS_TRANSFORM (crHighLight, +70, -66)); cDC.Rectangle (&rcButton); rcButton.left = nLeft; } else { cDC.MoveTo (rcButton.right-14, rcButton.top); cDC.LineTo (rcButton.right-14, rcButton.bottom); } } } if ( IS_SEPARATOR(tbbutton) ) { CPenDC pen (cDC, HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), -15, 0)); if ( IS_WRAP(tbbutton) ) { cDC.MoveTo (rcClient.left+2, rcButton.bottom-4); cDC.LineTo (rcClient.right-2, rcButton.bottom-4); } else { cDC.MoveTo ((rcButton.right+rcButton.left)/2-1, rcButton.top+2); cDC.LineTo ((rcButton.right+rcButton.left)/2-1, rcButton.bottom-2); } } else if ( !IS_CONTROL(tbbutton) ) { if ( IS_DROPDOWN(tbbutton) ) { CPenDC pen (cDC, ( bOver && !IS_INDETERMINATE(tbbutton) ) ? RGB(0,0,0) : ::GetSysColor (IS_ENABLED(tbbutton) ? COLOR_BTNTEXT : COLOR_GRAYTEXT)); cDC.MoveTo (rcButton.right-9, (rcButton.top+rcButton.bottom)/2-1); cDC.LineTo (rcButton.right-4, (rcButton.top+rcButton.bottom)/2-1); cDC.MoveTo (rcButton.right-8, (rcButton.top+rcButton.bottom)/2); cDC.LineTo (rcButton.right-5, (rcButton.top+rcButton.bottom)/2); cDC.SetPixel (rcButton.right-7, (rcButton.top+rcButton.bottom)/2+1, pen.Color()); rcButton.right -= 14; } if ( tbbutton.iBitmap >= 0 ) { if ( !IS_ENABLED(tbbutton) || (bOver && !bPressed) ) { HICON hIcon = ImageList_ExtractIcon (NULL, m_hImageList, tbbutton.iBitmap); cDC.DrawState (CPoint (rcButton.left + ( bOver ? 4 : 3 ), rcButton.top + ( bOver ? 4 : 3 )), m_sizeImage, hIcon, DSS_MONO, CBrush (bOver ? (IS_INDETERMINATE(tbbutton) ? HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), -20, 0) : HLS_TRANSFORM (::GetSysColor (COLOR_HIGHLIGHT), +50, -66)) : HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), -27, 0))); DestroyIcon (hIcon); } if ( IS_ENABLED(tbbutton) ) { ::ImageList_Draw (m_hImageList, tbbutton.iBitmap, cDC.m_hDC, rcButton.left + ( (bOver && !bPressed) ? 2 : 3 ), rcButton.top + ( (bOver && !bPressed) ? 2 : 3 ), ILD_TRANSPARENT); } } } } }
static BOOL Find_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) { HWND hwndFindCombo = GetDlgItem(hwnd, IDC_COMBO_FIND); LPEDITINTERFACE lpInterface = PCP_Edit_GetInterface(MDI_MyGetActive(TRUE)); ComboBox_LimitText(hwndFindCombo, MAX_PATH); MRU_SetComboBox(hwndFindCombo, _T("Find MRU"), g_MRUSettings.nFindMax); if (PCP_Edit_IsSelection(lpInterface)) { POINT ptSelStart, ptSelEnd; LPTSTR pszSelection = NULL; PCP_Edit_GetSelection(lpew, &ptSelStart, &ptSelEnd); if (ptSelStart.y == ptSelEnd.y) PCP_Edit_GetText(lpInterface, ptSelStart, ptSelEnd, &pszSelection); else pszSelection = String_Duplicate(PCP_Edit_GetLineChars(lpInterface, ptSelStart.y)); if (String_IsSpace(pszSelection)) ComboBox_SetCurSel(hwndFindCombo, 0); else SetWindowText(hwndFindCombo, pszSelection); Mem_Free(pszSelection); } else { ComboBox_SetCurSel(hwndFindCombo, 0); } if (s_bReplaceMode) { HWND hwndReplaceCombo = GetDlgItem(hwnd, IDC_COMBO_REPLACE); if (PCP_Edit_IsSelection(lpInterface)) { UINT uDirection; s_ptSaveCursorPos = PCP_Edit_GetCursorPos(lpInterface); PCP_Edit_GetSelection(lpInterface, &s_ptSaveSelStart, &s_ptSaveSelEnd); s_bSelectionPushed = TRUE; uDirection = ((s_ptSaveSelStart.y == s_ptSaveSelEnd.y) ? IDC_RADIO_DIRECTION_DOWN : IDC_RADIO_DIRECTION_UP); CheckRadioButton(hwnd, IDC_RADIO_DIRECTION_UP, IDC_RADIO_DIRECTION_DOWN, uDirection); Window_Command(hwnd, uDirection, 1, NULL); s_ptBlockBegin = s_ptSaveSelStart; s_ptBlockEnd = s_ptSaveSelEnd; } else { CheckRadioButton(hwnd, IDC_RADIO_DIRECTION_UP, IDC_RADIO_DIRECTION_DOWN, IDC_RADIO_DIRECTION_DOWN); Window_EnableDlgItem(hwnd, IDC_RADIO_DIRECTION_UP, FALSE); s_ptCurrentPos = PCP_Edit_GetCursorPos(lpInterface); } ComboBox_LimitText(hwndReplaceCombo, MAX_PATH); MRU_SetComboBox(hwndReplaceCombo, _T("Replace MRU"), g_MRUSettings.nReplaceMax); ComboBox_SetCurSel(hwndReplaceCombo, 0); Window_SetBothIcons(hwnd, ImageList_ExtractIcon(NULL, Menu_GetImageList(TRUE), IDP_REPLACE)); } else { Window_SetBothIcons(hwnd, ImageList_ExtractIcon(NULL, Menu_GetImageList(TRUE), IDP_FIND)); CheckRadioButton(hwnd, IDC_RADIO_DIRECTION_UP, IDC_RADIO_DIRECTION_DOWN, g_FindSettings.nDirection); } Find_ChangeMode(hwnd, s_bReplaceMode); if (GetWindowTextLength(hwndFindCombo)) Window_EnableDlgItem(hwnd, IDOK, TRUE); CheckDlgButton(hwnd, IDC_CHECK_MATCHCASE, g_FindSettings.bCase); CheckDlgButton(hwnd, IDC_CHECK_REGEXP, g_FindSettings.bRegExp); CheckDlgButton(hwnd, IDC_CHECK_WRAPSEARCH, g_FindSettings.bWrapSearch); if (g_FindSettings.bRegExp) { Window_EnableDlgItem(hwnd, IDC_CHECK_WHOLEWORD, FALSE); g_FindSettings.bWholeWords = FALSE; } else { CheckDlgButton(hwnd, IDC_CHECK_WHOLEWORD, g_FindSettings.bWholeWords); } return (TRUE); }
/* * WinObjExMain * * Purpose: * * Actual program entry point. * */ void WinObjExMain() { MSG msg1; WNDCLASSEX wincls; BOOL IsFullAdmin = FALSE, IsWine = FALSE, rv = TRUE, cond = FALSE; ATOM class_atom = 0; INITCOMMONCONTROLSEX icc; LVCOLUMN col; SHSTOCKICONINFO sii; HMENU hMenu; HACCEL hAccTable = 0; WCHAR szWindowTitle[100]; HANDLE hIcon; HIMAGELIST TreeViewImages; if (!WinObjInitGlobals()) return; // do not move anywhere IsFullAdmin = supUserIsFullAdmin(); // check compatibility IsWine = supIsWine(); if (IsWine != FALSE) { IsFullAdmin = FALSE; } supInit(IsFullAdmin, IsWine); // do not move anywhere // g_kdctx variable initialized BEFORE this. // if you move these lines anywhere above they will be zeroed during kdInit g_kdctx.IsWine = IsWine; g_kdctx.IsFullAdmin = IsFullAdmin; #ifdef _DEBUG TestStart(); #endif do { // // 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_WinObj.hInstance; wincls.hIcon = (HICON)LoadImage(g_WinObj.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; class_atom = RegisterClassEx(&wincls); if (class_atom == 0) break; RtlSecureZeroMemory(szWindowTitle, sizeof(szWindowTitle)); _strcpy(szWindowTitle, PROGRAM_NAME); if (IsFullAdmin != FALSE) { _strcat(szWindowTitle, L" (Administrator)"); } if (IsWine != FALSE) { _strcat(szWindowTitle, L" (Wine emulation)"); } MainWindow = CreateWindowEx(0, MAKEINTATOM(class_atom), szWindowTitle, WS_VISIBLE | WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, g_WinObj.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; hwndStatusBar = CreateWindowEx(0, STATUSCLASSNAME, NULL, WS_VISIBLE | WS_CHILD, 0, 0, 0, 0, MainWindow, NULL, g_WinObj.hInstance, NULL); g_hwndObjectTree = 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_WinObj.hInstance, NULL); if (g_hwndObjectTree == NULL) break; g_hwndObjectList = 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_WinObj.hInstance, NULL); if (g_hwndObjectList == NULL) break; hwndToolBar = CreateWindowEx(0, TOOLBARCLASSNAME, NULL, WS_VISIBLE | WS_CHILD | CCS_TOP | TBSTYLE_FLAT | TBSTYLE_TRANSPARENT | TBSTYLE_TOOLTIPS, 0, 0, 0, 0, MainWindow, (HMENU)1004, g_WinObj.hInstance, NULL); if (hwndToolBar == NULL) break; hwndSplitter = CreateWindowEx(0, WC_STATIC, NULL, WS_VISIBLE | WS_CHILD, 0, 0, 0, 0, MainWindow, (HMENU)1005, g_WinObj.hInstance, NULL); // initialization of views SendMessage(MainWindow, WM_SIZE, 0, 0); ListView_SetExtendedListViewStyle(g_hwndObjectList, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_LABELTIP | LVS_EX_DOUBLEBUFFER); // set tree imagelist TreeViewImages = supLoadImageList(g_WinObj.hInstance, IDI_ICON_VIEW_DEFAULT, IDI_ICON_VIEW_SELECTED); if (TreeViewImages) { TreeView_SetImageList(g_hwndObjectTree, TreeViewImages, TVSIL_NORMAL); } //not enough user rights, insert run as admin menu entry and hide admin only stuff if ((IsFullAdmin == FALSE) && (g_kdctx.IsWine == 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); } } if (g_kdctx.hDevice == NULL) { //require driver usage, remove DeleteMenu(GetSubMenu(GetMenu(MainWindow), 4), ID_EXTRAS_SSDT, MF_BYCOMMAND); DeleteMenu(GetSubMenu(GetMenu(MainWindow), 4), ID_EXTRAS_PRIVATENAMESPACES, MF_BYCOMMAND); } //unsupported if (g_WinObj.osver.dwBuildNumber > 10240) { DeleteMenu(GetSubMenu(GetMenu(MainWindow), 4), ID_EXTRAS_PRIVATENAMESPACES, MF_BYCOMMAND); } //wine unsupported if (g_kdctx.IsWine != FALSE) { DeleteMenu(GetSubMenu(GetMenu(MainWindow), 4), ID_EXTRAS_DRIVERS, MF_BYCOMMAND); } //load listview images g_ListViewImages = supLoadImageList(g_WinObj.hInstance, IDI_ICON_DEVICE, IDI_ICON_UNKNOWN); if (g_ListViewImages) { hIcon = LoadImage(g_WinObj.hInstance, MAKEINTRESOURCE(IDI_ICON_SORTUP), IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR); if (hIcon) { ImageList_ReplaceIcon(g_ListViewImages, -1, hIcon); DestroyIcon(hIcon); } hIcon = LoadImage(g_WinObj.hInstance, MAKEINTRESOURCE(IDI_ICON_SORTDOWN), IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR); if (hIcon) { ImageList_ReplaceIcon(g_ListViewImages, -1, hIcon); DestroyIcon(hIcon); } ListView_SetImageList(g_hwndObjectList, g_ListViewImages, LVSIL_SMALL); } //load toolbar images g_ToolBarMenuImages = ImageList_LoadImage(g_WinObj.hInstance, MAKEINTRESOURCE(IDB_BITMAP1), 16, 7, CLR_DEFAULT, IMAGE_BITMAP, LR_CREATEDIBSECTION); if (g_ToolBarMenuImages) { supCreateToolbarButtons(hwndToolBar); //set menu icons hMenu = GetSubMenu(GetMenu(MainWindow), 1); if (hMenu) { supSetMenuIcon(hMenu, ID_VIEW_REFRESH, (ULONG_PTR)ImageList_ExtractIcon(g_WinObj.hInstance, g_ToolBarMenuImages, 1)); } hMenu = GetSubMenu(GetMenu(MainWindow), 2); if (hMenu && g_ListViewImages) { supSetMenuIcon(hMenu, ID_OBJECT_PROPERTIES, (ULONG_PTR)ImageList_ExtractIcon(g_WinObj.hInstance, g_ToolBarMenuImages, 0)); supSetMenuIcon(hMenu, ID_OBJECT_GOTOLINKTARGET, (ULONG_PTR)ImageList_ExtractIcon(g_WinObj.hInstance, g_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_WinObj.hInstance, g_ToolBarMenuImages, 2)); } //set extras-mailslots/pipes menu image hMenu = GetSubMenu(GetMenu(MainWindow), 4); if (hMenu) { supSetMenuIcon(hMenu, ID_EXTRAS_MAILSLOTS, (ULONG_PTR)ImageList_ExtractIcon(g_WinObj.hInstance, g_ToolBarMenuImages, 5)); supSetMenuIcon(hMenu, ID_EXTRAS_PIPES, (ULONG_PTR)ImageList_ExtractIcon(g_WinObj.hInstance, g_ToolBarMenuImages, 6)); } //set help menu image hMenu = GetSubMenu(GetMenu(MainWindow), 5); if (hMenu) { supSetMenuIcon(hMenu, ID_HELP_HELP, (ULONG_PTR)ImageList_ExtractIcon(g_WinObj.hInstance, g_ToolBarMenuImages, 3)); } } hAccTable = LoadAccelerators(g_WinObj.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 = TEXT("Name"); col.fmt = LVCFMT_LEFT | LVCFMT_BITMAP_ON_RIGHT; col.iOrder = 0; col.iImage = -1; if (g_ListViewImages) { col.iImage = ImageList_GetImageCount(g_ListViewImages) - 1; } col.cx = 300; ListView_InsertColumn(g_hwndObjectList, 1, &col); col.iSubItem = 2; col.pszText = TEXT("Type"); col.iOrder = 1; col.iImage = -1; col.cx = 100; ListView_InsertColumn(g_hwndObjectList, 2, &col); col.iSubItem = 3; col.pszText = TEXT("Additional Information"); col.iOrder = 2; col.iImage = -1; col.cx = 170; ListView_InsertColumn(g_hwndObjectList, 3, &col); ListObjectDirectoryTree(L"\\", NULL, NULL); TreeView_SelectItem(g_hwndObjectTree, TreeView_GetRoot(g_hwndObjectTree)); SetFocus(g_hwndObjectTree); 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_WinObj.hInstance); //do not move anywhere supShutdown(); #ifdef _DEBUG TestStop(); #endif }
/* * 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 }
void InitIcons() { // all those flag icons storing in a large 24bit opaque bitmap to reduce file size FIBITMAP *dib = LoadResource(IDB_FLAGSPNG, _T("PNG")); if (dib == NULL) return; if (FIP->FI_GetBPP(dib) != ILC_COLOR32) if (NULL == (dib = ConvertTo(dib, ILC_COLOR32, 0))) return; // create new dib FIBITMAP *dib_ico = FIP->FI_Allocate(FIP->FI_GetWidth(dib), 16, ILC_COLOR32, 0, 0, 0); if (dib_ico == NULL) { FIP->FI_Unload(dib); return; } UINT h = FIP->FI_GetHeight(dib_ico); UINT w = FIP->FI_GetWidth(dib_ico); UINT t = ((h - FIP->FI_GetHeight(dib)) / 2) + 1; UINT b = t + FIP->FI_GetHeight(dib); // copy dib to new dib_ico (centered) if (FIP->FI_Paste(dib_ico, dib, 0, t - 1, 255 + 1)) { FIP->FI_Unload(dib); dib = NULL; // Calculate the number of bytes per pixel (3 for 24-bit or 4 for 32-bit) int bytespp = FIP->FI_GetLine(dib_ico) / w; // set alpha schannel for (unsigned y = 0; y < h; y++) { BYTE *bits = FIP->FI_GetScanLine(dib_ico, y); for (unsigned x = 0; x < w; x++) { bits[FI_RGBA_ALPHA] = (y < t || y >= b) ? 0 : 255; // jump to next pixel bits += bytespp; } } } else { FIP->FI_Unload(dib); FIP->FI_Unload(dib_ico); return; } HBITMAP hScrBM = FIP->FI_CreateHBITMAPFromDIB(dib_ico); FIP->FI_Unload(dib_ico); if (!hScrBM) return; // create ImageList HIMAGELIST himl = ImageList_Create(16, 16, ILC_COLOR32 | ILC_MASK, 0, nCountriesCount); ImageList_Add(himl, hScrBM, NULL); DeleteObject(hScrBM); hScrBM = NULL; if (himl != NULL) { phIconHandles = (HANDLE*)mir_alloc(nCountriesCount*sizeof(HANDLE)); if (phIconHandles != NULL) { char szId[20]; SKINICONDESC sid = { 0 }; sid.section.t = LPGENT("Country flags"); sid.pszName = szId; // name to refer to icon when playing and in db sid.flags = SIDF_SORTED | SIDF_TCHAR; for (int i=0; i < nCountriesCount; i++) { sid.description.t = mir_a2t(LPGEN(countries[i].szName)); /* create identifier */ mir_snprintf(szId, _countof(szId), (countries[i].id == 0xFFFF) ? "%s0x%X" : "%s%i", "flags_", countries[i].id); /* buffer safe */ int index = CountryNumberToBitmapIndex(countries[i].id); /* create icon */ sid.hDefaultIcon = ImageList_ExtractIcon(NULL, himl, index); index = CountryNumberToIndex(countries[i].id); phIconHandles[index] = IcoLib_AddIcon(&sid); if (sid.hDefaultIcon != NULL) DestroyIcon(sid.hDefaultIcon); mir_free(sid.description.t); sid.description.t = NULL; } } ImageList_Destroy(himl); } // create services CreateServiceFunction(MS_FLAGS_LOADFLAGICON,ServiceLoadFlagIcon); CreateServiceFunction(MS_FLAGS_CREATEMERGEDFLAGICON,ServiceCreateMergedFlagIcon); }
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; }