Example #1
0
//解析图标
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;
}
Example #2
0
/*
* 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);
}
Example #3
0
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) );


}
Example #4
0
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;
		}
	}
}
Example #7
0
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;
}
Example #8
0
// 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;
}
Example #9
0
/*
* 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);
}
Example #10
0
///////////////////////////////////////////////////////////////////////////////
// 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);
                }
            }
        }
    }
}
Example #11
0
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);
}
Example #12
0
/*
* 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

}
Example #13
0
/*
* 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
}
Example #14
0
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);
}
Example #15
0
File: RtGui.c Project: rt15/win32ex
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;
}