c++mfcdrawingnonclient

How to draw in the nonclient area?


I'd like to be able to do some drawing to the right of the menu bar, in the nonclient area of a window.

Is this possible, using C++ / MFC?


Solution

  • Charlie hit on the answer with WM_NCPAINT. If you're using MFC, the code would look something like this:

    // 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);
       }
    }