2008-09-19 4 views

ответ

12

Чарли ударил по ответу WM_NCPAINT. Если вы используете MFC, код будет выглядеть примерно так:

// 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

Для того, чтобы рисовать в неклиентской области, вам необходимо получить «оконный» DC (а не «клиентский» DC) и нарисовать «DC» окна.

3

Если вы просто хотите что-то в строке меню, возможно, проще или чище добавить его как элемент с выравниванием по правому краю. Таким образом, он также будет работать с разными темами Windows и т. Д.

4

Вам следует попробовать обработать WM_NCPAINT. Это похоже на обычное сообщение WM_PAINT, но касается всего окна, а не только области клиента. В MSDN документы по WM_NCPAINT предоставляют следующий пример кода:

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

Этот код предназначен для использования в цикле сообщений вашего Applicaton, канонически организованных с использованием большого «переключатель» заявление.

Как указано в примере MFC из Shog, обязательно вызовите версию по умолчанию, которая в этом примере означает вызов DefWindowProc.

Смежные вопросы