Frage

Ich möchte in der Lage sein, eine Zeichnung rechts von der Menüleiste zu tun, in dem Nicht-Clientbereich eines Fensters.

Ist das möglich, unter Verwendung von C ++ / MFC?

War es hilfreich?

Lösung

Charlie traf auf die Antwort mit WM_NCPAINT. Wenn Sie MFC verwenden, würde der Code wie folgt aussehen:

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

Andere Tipps

Um im Nicht-Client-Bereich zu zeichnen, müssen Sie das „Fenster“ DC (eher als „Client“ DC) zu erhalten, und im „Fenster“ DC ziehen.

Sie sollten versuchen WM_NCPAINT Handhabung. Dies ist vergleichbar mit einer normalen WM_PAINT-Nachricht, sondern befasst sich mit dem gesamten Fenster, anstatt nur den Client-Bereich. Die MSDN-Dokumente auf WM_NCPAINT geben Sie den folgenden Beispielcode:

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

Dieser Code soll in der Nachrichtenschleife Ihres applicaton verwendet werden, die kanonisch organisiert wird eine große ‚Schalter‘ Anweisung.

Wie in dem MFC-Beispiel aus Shog erwähnt, stellen Sie sicher, die Standardversion zu nennen, die in diesem Beispiel einen Aufruf an DefWindowProc bedeuten würden.

Wenn Sie nur etwas in der Menüleiste wollen, ist es vielleicht einfacher / Reiniger es als rechtsbündig Menüpunkt hinzuzufügen. Auf diese Weise, es wird auch mit verschiedenen Windows-Themen arbeitet, etc.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top