2008-09-19 20 views

Respuesta

12

Charlie dio en la respuesta con WM_NCPAINT. Si está utilizando MFC, el código sería algo como esto:

// in the message map 
ON_WM_NCPAINT() 

// ... 

void CMainFrame::OnNcPaint() 
{ 
    // still want the menu to be drawn, so trigger default handler first 
    Default(); 

    // get menu bar bounds 
    MENUBARINFO menuInfo = {sizeof(MENUBARINFO)}; 
    if (GetMenuBarInfo(OBJID_MENU, 0, &menuInfo)) 
    { 
     CRect windowBounds; 
     GetWindowRect(&windowBounds); 
     CRect menuBounds(menuInfo.rcBar); 
     menuBounds.OffsetRect(-windowBounds.TopLeft()); 

     // horrible, horrible icon-drawing code. Don't use this. Seriously. 
     CWindowDC dc(this); 
     HICON appIcon = (HICON)::LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); 
     ::DrawIconEx(dc, menuBounds.right-18, menuBounds.top+2, appIcon, 0,0, 0, NULL, DI_NORMAL); 
     ::DestroyIcon(appIcon); 
    } 
} 
3

Para dibujar en el área no cliente, necesita obtener la "ventana" DC (en lugar de DC "cliente") y dibujar en la "ventana" DC.

3

Si solo desea algo en la barra de menú, quizás sea más fácil/más limpio agregarlo como un elemento de menú alineado a la derecha. De esta forma también funcionará con diferentes temas de Windows, etc.

4

Debería intentar manejar WM_NCPAINT. Esto es similar a un mensaje WM_PAINT normal, pero trata de toda la ventana, en lugar de solo el área del cliente. Los documentos de MSDN sobre WM_NCPAINT proporcionan el siguiente código de ejemplo:

case WM_NCPAINT: 
{ 
HDC hdc; 
hdc = GetDCEx(hwnd, (HRGN)wParam, DCX_WINDOW|DCX_INTERSECTRGN); 
// Paint into this DC 
ReleaseDC(hwnd, hdc); 
} 

está destinado a ser utilizado en el bucle de mensaje de su applicaton, que se organiza canónicamente el uso de una gran declaración 'switch' Este código.

Como se menciona en el ejemplo de MFC de Shog, asegúrese de llamar a la versión predeterminada, que en este ejemplo significaría una llamada a DefWindowProc.

Cuestiones relacionadas