Firmen-Logo an der Anwendungsoberfläche

titanic

Mitglied
Hallo Leute,

ich bin total verzweifelt und bitte um Hilfe.
Ich habe eine SDI-Anwendung mit Menu- und Symbolleiste.
Das Firmenlogo ist eine *.bmp.
In der Anwendung soll es im Bereich der Menu- und Symbolleiste rechts gezeichnet werden.
Ich lade die Bitmap und wandle sie in ein HICON um, damit der Hintergrund transparent gezeichnet wird. In OnPaint(..) und OnNCPaint(..) des MainFrames rufe ich dann DrawLogo() auf:
Code:
void CMainFrame::DrawLogo()
{
    CDC* pdc = GetWindowDC();
	
	::DrawIconEx(pdc->GetSafeHdc(),m_rectLogo.left,m_rectLogo.top,m_hIcon, 
				m_rectLogo.Width(),m_rectLogo.Height(),0, NULL, 
				DI_NORMAL);
	ReleaseDC(pdc);    
}
void CMainFrame::OnNcPaint()
{
	// TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein.
//	CFrameWnd::OnNcPaint();// soll zum Zeichnen von Meldungen nicht aufgerufen werden.
  	Default();
	DrawLogo();
}  
void CMainFrame::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	//Default();
	DrawLogo();
}
Die obere Hälfte des Logos wird korrekt angezeigt, die untere wird mit dem Hintergrund des Frames verdeckt. Sobald ich das Fenster verschiebe, so wird auch die untere Hälfte sichtbar. Woran liegt das.
 

Anhänge

  • musterlogo1.jpg
    musterlogo1.jpg
    7,6 KB · Aufrufe: 41
  • musterlogo2.jpg
    musterlogo2.jpg
    7,4 KB · Aufrufe: 40
Hallo Forum,

habe doch noch eine Lösung gefunden.
Was mein Icon verdeckt, ist die Dockbar des MainFrame-Fensters.
Ich hole mir über das Symbol-Leisten-Fenster das Dockbar-Fenster und
zeichne dort noch mal das Icon. Meine DrawIcon() rufe ich nur in OnPaint() auf:
Code:
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
void CMainFrame::DrawLogo()
{
    CWnd* pDockBar = m_wndToolBar.GetParent();
	//im DockBar-DC zeichnen (Symbolleiste)
	if (pDockBar != NULL)
	{
	    HDC hdc;
		hdc = ::GetWindowDC(pDockBar->m_hWnd);
		::DrawIconEx(hdc, m_rectLogo.left, 
						  m_rectLogo.top,
						  m_hLogoIcon,
						  m_rectLogo.Width(),
						  m_rectLogo.Height(),
						  0, NULL, 
						  DI_NORMAL);
		::ReleaseDC(pDockBar->m_hWnd, hdc);
		pDockBar->Invalidate();
		pDockBar->UpdateWindow();
	} 
	//im MainFrame-DC zeichnen (Menu-Leiste) 
	CDC* pdc = GetWindowDC();
	::DrawIconEx(pdc->m_hDC, m_rectLogo.left, 
						  m_rectLogo.top,
						  m_hLogoIcon,
						  m_rectLogo.Width(),
						  m_rectLogo.Height(),
						  0, NULL, 
						  DI_NORMAL);
	ReleaseDC(pdc);
}
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
void CMainFrame::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	DrawLogo();
}

Ist vielleicht nicht die beste Lösung,
aber es funktioniert!

Gruß
titanic
 
Hallo,

für den Fall, dass jemand für meine Lösung Interesse zeigen sollte:

1. mein Erfolg lag daran, das ich das Fenster der Dockbar neu zeichnen ließ
(das Zeichen des Icons war überflüssig)


2. ein kleiner Fehler fiel mir noch ein:
wenn die Menuleiste (de)aktiviert wurde, zb. Aufruf der Hilfe,
wurde die obere Hälfte des Logos verdeckt.
Deshalb musste ich noch auf das Ereigniss reagieren.
Code:
//-----------------------------------------------------------------------
//	DrawLogo
//-----------------------------------------------------------------------
void CMainFrame::DrawLogo()
{
    HDC hdc;

	CWnd* pNextWnd;
	pNextWnd = GetWindow(GW_CHILD);
	//bei allen Child-Fenstern des Frames das Rechteck aktualisieren 
	while (pNextWnd != NULL)
	{
		pNextWnd->InvalidateRect(m_rectLogo);
		pNextWnd->UpdateWindow();
		pNextWnd = pNextWnd->GetNextWindow();
	} 

	//im MainFrame-DC zeichnen (Menu-Leiste) 
	hdc = ::GetWindowDC(m_hWnd);
	::DrawIconEx(hdc, m_rectLogo.left, 
						m_rectLogo.top,
						m_hLogoIcon,
						m_rectLogo.Width(),
						m_rectLogo.Height(),
						0, 0, 
						DI_NORMAL);
	::ReleaseDC(m_hWnd, hdc);
}
//-----------------------------------------------------------------------
//	OnPaint
//-----------------------------------------------------------------------
void CMainFrame::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	DrawLogo();
}
//-----------------------------------------------------------------------
//	OnNcActivate
//-----------------------------------------------------------------------
BOOL CMainFrame::OnNcActivate(BOOL bActive)
{
	BOOL bRet = CFrameWnd::OnNcActivate(bActive);
	DrawLogo();
	return bRet;
}

Für Verbesserungen wäre ich dankbar
Gruß
titanic
 
Zurück