Seite 1 von 1

QPaintEvent nur vom MainWindow? Bzw. eigene Titlebar

Verfasst: 17. Dezember 2006 20:18
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

Verfasst: 17. Dezember 2006 22:16
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.