Como desenhar na área de não cliente?
Pergunta
Eu gostaria de ser capaz de fazer algum desenho à direita da barra de menus, na área de não cliente de uma janela.
Isso é possível, usando C ++ / MFC?
Solução
Charlie atingido na resposta com WM_NCPAINT
. Se você estiver usando MFC, o código seria algo parecido com isto:
// 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);
}
}
Outras dicas
Para desenhar na área de não-cliente, você precisa para obter a "janela" DC (em vez de "cliente" DC), e desenhar na "janela" DC.
Você deve tentar lidar com WM_NCPAINT. Isso é semelhante a uma mensagem WM_PAINT normal, mas lida com toda a janela, em vez de apenas a área de cliente. Os documentos MSDN sobre WM_NCPAINT fornecer o código de exemplo a seguir:
case WM_NCPAINT:
{
HDC hdc;
hdc = GetDCEx(hwnd, (HRGN)wParam, DCX_WINDOW|DCX_INTERSECTRGN);
// Paint into this DC
ReleaseDC(hwnd, hdc);
}
Este código se destina a ser usado no ciclo de mensagem do seu applicaton, que é canonicamente organizado usando uma grande declaração 'switch'.
Como observado no exemplo MFC de Shog, certifique-se de chamar a versão padrão, que, neste exemplo, significaria uma chamada para DefWindowProc.
Se você quiser apenas algo na barra de menu, talvez seja mais fácil / mais limpo para adicioná-lo como um item de menu alinhado à direita. Desta forma, ele também vai trabalhar com diferentes temas do Windows, etc.