ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

HGLOBAL WINAPI OleMetafilePictFromIconAndLabel ( HICON  hIcon,
LPOLESTR  lpszLabel,
LPOLESTR  lpszSourceFile,
UINT  iIconIndex 
)

Definition at line 43 of file ole32_main.c.

{
    METAFILEPICT mfp;
    HDC hdc;
    HGLOBAL hmem = NULL;
    LPVOID mfdata;
    static const char szIconOnly[] = "IconOnly";
    SIZE text_size = { 0, 0 };
    INT width;
    INT icon_width;
    INT icon_height;
    INT label_offset;
    HDC hdcScreen;
    LOGFONTW lf;
    HFONT font;

    TRACE("%p %p %s %d\n", hIcon, lpszLabel, debugstr_w(lpszSourceFile), iIconIndex);

    if( !hIcon )
        return NULL;

    if (!SystemParametersInfoW(SPI_GETICONTITLELOGFONT, sizeof(lf), &lf, 0))
        return NULL;

    font = CreateFontIndirectW(&lf);
    if (!font)
        return NULL;

    hdc = CreateMetaFileW(NULL);
    if( !hdc )
    {
        DeleteObject(font);
        return NULL;
    }

    SelectObject(hdc, font);

    ExtEscape(hdc, MFCOMMENT, sizeof(szIconOnly), szIconOnly, 0, NULL);

    icon_width = GetSystemMetrics(SM_CXICON);
    icon_height = GetSystemMetrics(SM_CYICON);
    /* FIXME: should we give the label a bit of padding here? */
    label_offset = icon_height;
    if (lpszLabel)
    {
        HFONT screen_old_font;
        /* metafile DCs don't support GetTextExtentPoint32, so size the font
         * using the desktop window DC */
        hdcScreen = GetDC(NULL);
        screen_old_font = SelectObject(hdcScreen, font);
        GetTextExtentPoint32W(hdcScreen, lpszLabel, lstrlenW(lpszLabel), &text_size);
        SelectObject(hdcScreen, screen_old_font);
        ReleaseDC(NULL, hdcScreen);

        width = 3 * icon_width;
    }
    else
        width = icon_width;

    SetMapMode(hdc, MM_ANISOTROPIC);
    SetWindowOrgEx(hdc, 0, 0, NULL);
    SetWindowExtEx(hdc, width, label_offset + text_size.cy, NULL);

    /* draw the icon centered */
    DrawIcon(hdc, (width-icon_width) / 2, 0, hIcon);
    if(lpszLabel)
        /* draw the label centered too, if provided */
        TextOutW(hdc, (width-text_size.cx) / 2, label_offset, lpszLabel, lstrlenW(lpszLabel));

    if (lpszSourceFile)
    {
        char szIconIndex[10];
        int path_length = WideCharToMultiByte(CP_ACP,0,lpszSourceFile,-1,NULL,0,NULL,NULL);
        if (path_length > 1)
        {
            char * szPath = CoTaskMemAlloc(path_length * sizeof(CHAR));
            if (szPath)
            {
                WideCharToMultiByte(CP_ACP,0,lpszSourceFile,-1,szPath,path_length,NULL,NULL);
                ExtEscape(hdc, MFCOMMENT, path_length, szPath, 0, NULL);
                CoTaskMemFree(szPath);
            }
        }
        snprintf(szIconIndex, 10, "%u", iIconIndex);
        ExtEscape(hdc, MFCOMMENT, strlen(szIconIndex)+1, szIconIndex, 0, NULL);
    }

    mfp.mm = MM_ANISOTROPIC;
    hdcScreen = GetDC(NULL);
    mfp.xExt = MulDiv(width, HIMETRIC_INCHES, GetDeviceCaps(hdcScreen, LOGPIXELSX));
    mfp.yExt = MulDiv(label_offset + text_size.cy, HIMETRIC_INCHES, GetDeviceCaps(hdcScreen, LOGPIXELSY));
    ReleaseDC(NULL, hdcScreen);
    mfp.hMF = CloseMetaFile(hdc);
    DeleteObject(font);
    if( !mfp.hMF )
        return NULL;

    hmem = GlobalAlloc( GMEM_MOVEABLE, sizeof(mfp) );
    if( !hmem )
    {
        DeleteMetaFile(mfp.hMF);
        return NULL;
    }

    mfdata = GlobalLock( hmem );
    if( !mfdata )
    {
        GlobalFree( hmem );
        DeleteMetaFile(mfp.hMF);
        return NULL;
    }

    memcpy(mfdata,&mfp,sizeof(mfp));
    GlobalUnlock( hmem );

    TRACE("returning %p\n",hmem);

    return hmem;
}

Generated on Fri May 25 2012 05:14:01 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.