|
Das Logo wird in Form einer Bitmap-Ressource in das Projekt eingebunden. Um Platz für das Bild zu schaffen, wird ein Dummy-Eintrag im Menü an der ersten Position eingefügt. Durch Implementieren der Methode OnMeasureItem() kann die Anwendung selbst ermitteln, wie groß der Platzbedarf für die Bitmap ist, so dass ein entsprechend großer Bereich für das Logo reserviert werden kann.
void CLogoDlg::OnMeasureItem(int nIDCtl,
LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
if (lpMeasureItemStruct->CtlType == ODT_MENU)
{
if (lpMeasureItemStruct->itemID == IDM_IMAGE)
lpMeasureItemStruct->itemWidth = m_rectLogo.Width() + 5;
}
CDialog::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}
In der Methode OnInitDialog (für die Dialog-basierte Anwendung) ist der nachfolgende Code einzufügen, um die Logo-Bitmap zu laden.
m_hBmp = (HBITMAP)LoadImage(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_Logo),
IMAGE_BITMAP, 0, 0,
LR_CREATEDIBSECTION);
BITMAP bm;
GetObject(m_hBmp, sizeof(bm), &bm);
m_rectLogo.left = 15;
m_rectLogo.right = 15 + bm.bmWidth;
m_rectLogo.top = 2 ;
m_rectLogo.bottom = 2 + bm.bmHeight;
Die Methode DrawLogo() zeichnet das Logo über einen simplen BitBlt()-Aufruf an der gewünschten Position, deren linke obere Ecke mit (15, 2) vorgegeben wird.
void CLogoDlg::DrawLogo()
{
CDC* pdc= GetWindowDC();
CDC memdc;
memdc.CreateCompatibleDC(pdc);
memdc.SelectObject(m_hBmp);
pdc->BitBlt(15, 2, m_rectLogo.Width(),m_rectLogo.Height(),
&memdc, 0, 0, SRCCOPY);
ReleaseDC(pdc);
}
Um zu verhindern, dass die Methode OnInitMenu() im Fens-ter eine Linie zwischen TitleBar und MenuBar zeichnet, muss diese Methode überschrieben werden, so dass DrawLogo() ausgeführt wird.
|