Windows Titelleiste ändern



  • Hallo!

    Ich hab einen bestehenden Code der mittels OnNcPaint ein zusätzliches Icon auf die Titelleiste zeichnet. Funktioniert auch wunderbar, solange der Rahmen nicht über den DWM gezeichnet wird. Bei aktivem Aero kommt also kein Icon.

    Ich hab mich im Netz schon mal schlau gemacht, allerdings außer haufenweise Posts mit dem selben Problem keine Lösung gefunden. Hat sich schon mal jemand damit beschäftigt?

    Hier der Code:

    void CBrushedDialog::OnNcPaint()
    {
    	Default();
    
    	if(!(GetStyle() & WS_CAPTION))
    		return;
    
    	CDC *pNCDC = GetWindowDC();
    	//CDC *pNCDC = GetDCEx(0, DCX_WINDOW | DCX_CACHE | DCX_CLIPSIBLINGS);
    
    	CRect rect;
    	GetWindowRect(rect);
    	ScreenToClient(rect);
    
    	int nButtonWidth = GetSystemMetrics(SM_CXSIZE);
    
    	// X-Button
    	rect.right -= nButtonWidth * 2;
    	if(GetStyle() & WS_MAXIMIZEBOX)
    		rect.right -= nButtonWidth;
    	if(GetStyle() & WS_MINIMIZEBOX)
    		rect.right -= nButtonWidth;
    
    	::DrawIconEx(pNCDC->m_hDC, rect.right - 16, 4, m_appIcon, 0,0, 0, NULL, DI_NORMAL);
    
    	ReleaseDC(pNCDC);
    }
    

    Ich bekomme es nur hin, wenn ich das Rendern des Rahmens durch den DWM für das betreffende Fenster ausschalte:

    // Schaltet das Rendern aus
    // Allerdings geht der Transparenz-Effekt flöten
    DWMNCRENDERINGPOLICY policy = DWMNCRP_DISABLED;
    DwmSetWindowAttribute(this->m_hWnd, 
    	DWMWA_NCRENDERING_POLICY,
    	(void*)&policy, 
    	sizeof(DWMNCRENDERINGPOLICY));
    
    // Ist diese Einstellung aktiv, müsste ich den gesamten
    // Rahmen selber zeichnen. Will ich aber nicht...
    BOOL bAllow = TRUE;
    DwmSetWindowAttribute(this->m_hWnd, 
    	DWMWA_ALLOW_NCPAINT,
    	(void*)&bAllow, 
    	sizeof(BOOL));
    


  • Source2702 schrieb:

    Hallo!

    Ich hab einen bestehenden Code der mrrrrrrtttels OnNcPaint ein zusätzliches Icon auf die Titelleiste zeichnet. Funktioniert auch wunderbar, solange der Rahmen nicht über den DWM gezeichnet wird. Bei aktivem Aero kommt also kein Icon.

    Ich hab mich im Netz schon mal schlau gemacht, allerdings außer haufenweise Posts mit dem selben Problem keine Lösung gefunden. Hat sich schon mal jemand damit beschäftigt?

    Hier der Code:

    void CBrushedDialog::OnNcPaint()
    {
    	Default();
    
    	if(!(GetStyle() & WS_CAPTION))
    		return;
    	
    	
    	CDC *pNCDC = GetWindowDC();
    	//CDC *pNCDC = GetDCEx(0, DCX_WIert
    	CRect rect;
    	GetWindowRect(rect);
    	ScreenToClient(rect);
    
    	int nButtonWidth = GetSystemMetrics(SM_CXSIZE);
    		
    	// X-Button
    	rect.right -= nButtonWidth * 2;
    	if(GetStyle() & WS_MAXIMIZEBOX)
    		rect.right -= nButtonWidth;
    	if(GetStyle() & WS_MINIMIZEBOX)
    		rect.right -= nButtonWidth;
    
    	
    	::DrawIconEx(pNCDC->m_hDC, rect.right - 16, 4, m_appIcon, 0,0, 0, NULL, DI_NORMAL);
    
    	ReleaseDC(pNCDC);
    }
    

    Ich bekomme es nur hin, wenn ich das Rendern des Rahmens durch den DWM für das betreffende Fenster ausschalte:

    // Schaltet das Rendern aus
    // Allerdings geht der Transparenz-Effekt flöten
    DWMNCRENDERINGPOLICY policy = DWMNCRP_DISABLED;
    DwmSetWindowAttribute(this->m_hWnd, 
    	DWMWA_NCRENDERING_POLICY,
    	(void*)&policy, 
    	sizeof(DWMNCRENDERINGPOLICY));
    
    // Ist diese Einstellung aktiv, müsste ich den gesamten
    // Rahmen selber zeichnen. Will ich aber nicht...
    BOOL bAllow = TRUE;
    DwmSetWindowAttribute(this->m_hWnd, 
    	DWMWA_ALLOW_NCPAINT,
    	(void*)&bAllow, 
    	sizeof(BOOL));
    

Anmelden zum Antworten