QPaintEvent nur vom MainWindow? Bzw. eigene Titlebar

Alles rund um die Programmierung mit Qt
Antworten
JanStuhlmann
Beiträge: 1
Registriert: 5. Oktober 2006 20:22
Wohnort: www.much.de
Kontaktdaten:

QPaintEvent nur vom MainWindow? Bzw. eigene Titlebar

Beitrag von JanStuhlmann »

Hi,

da ich keine Möglichkeit gefunden habe mit QT die Windows Titlebar (oder Caption Bar) zu verändern habe ich mir selbst was im Internet zusammengesucht, was mit einem normalen Win32 Fenster auch ganz gut klappt.
Hierbei wird das PaintEvent abgefangen, und mit BitBlt() noch ein Bild zum Fenster hinzugepaintet.
Das was ich bei nem "normalen" Fenster in der CallBack Funktion unter WM_PAINT machen würde habe ich jetzt in einer Funktion gemacht die das QPaint Event überschreibt. Problem ist dass das Bild jetzt in jedes Widget gepaintet wird, also auch auf jeden Button etc. Gibts da eine möglichkeit den Event nur vom MainWindow abzufangen ?
Vieleicht gibts aber auch eine Möglichkeit die Titlebar mit Qt eigenen Mitteln zu modifizieren das wär mir noch viel lieber :-)

Code: Alles auswählen

MainWindow::MainWindow(QWidget* parent /* = 0 */, Qt::WindowFlags flags, HINSTANCE hInstance)
	: QMainWindow(parent, flags)
{
         setupUI(this);

	HBITMAP hSkinBmp = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_SKIN));
	dcSkin = CreateCompatibleDC(0);
	HBITMAP hOldBmp = (HBITMAP)SelectObject(dcSkin, hSkinBmp);
}

Code: Alles auswählen

void MainWindow::paintEvent( QPaintEvent* event ) {
	HWND hWnd = this->winId();
	PAINTSTRUCT ps;

	// blit the skin
	BitBlt(ps.hdc, 0,0,320,240, dcSkin, 0,0, SRCCOPY);
	EndPaint(hWnd,&ps);

}
Jan
dhcase
Beiträge: 132
Registriert: 10. Juni 2006 20:38

Beitrag von dhcase »

Ab Qt 4.2 gibts die Funktion setMenuWidget(), da könnest du mit Qt::FramelessWindowHint ein Fenster ohne Rahmen erzeugen und dann ein eigenes Widget mit Titlebar und Menubar erstellen. Das kannst du dann als MenuWidget setzen, hab ich zwar noch nicht getestet, sollte aber funktionieren.
Für Versionen < 4.2 bleibt dir nur die Option, die Titlebar als Widget zu erstellen und selber zu Zeichnen. Dann musst du die einzelnen Funktionen und Buttons (Minimize, Maximize,..) auch noch implementieren... allerdings würde ich die Windows-Funktionen nicht unbedingt verwenden, wegen der plattform(un)abhängigkeit.

Gruss,
D.
Antworten