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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top