c++ - paso - ¿Cómo dibujar en el área no cliente?
como dibujar un caballo realista (4)
Para dibujar en el área que no es cliente, debe obtener el DC "ventana" (en lugar de DC "cliente") y dibujar en el DC "ventana".
Me gustaría poder hacer un dibujo a la derecha de la barra de menú, en el área no cliente de una ventana.
¿Es esto posible, usando C ++ / MFC?
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 manera, también funcionará con diferentes temas de Windows, etc.
Charlie acertó en la respuesta con WM_NCPAINT
. Si está utilizando MFC, el código se vería así:
// 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);
}
}
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 en 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);
}
Este código está destinado a ser utilizado en el ciclo de mensajes de su solicitud, que se organiza canónicamente utilizando una gran declaración de ''cambio''.
Como se señala 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.