Autor |
Beitrag |
K.S.M.
      
Beiträge: 82
Windows 7 Professional
Delphi 2010, HTML, JavaScript, CSS, PHP, ein wenig C, Flash ActionScript 2.0/3.0, SQL, Assembler
|
Verfasst: Di 27.04.10 17:39
Hallo
Es gitb ja immer wieder Fenster, die eine eigene Title bar oben besitzen, die speziell aussieht ... Ich würde auch gern ein Fenster im eigenen Stil erstellen, allerdings weiß ich nicht wie man das macht.
Ich habe bisher nur herauskriegen können, dass man irgendwie diese Nachrichten abfangen muss:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| WM_NCCREATE WM_NCCALCSIZE WM_NCHITTEST WM_NCLBUTTONDBLCLK WM_NCLBUTTONDOWN WM_NCPAINT WM_NCACTIVATE |
Kennt jemand von euch vlt ein Tutorial oder kann mir kurz erklären wie das geht?
Vielen Dank im Voraus 
_________________ "Programmieren ist keine Kunst. Programmieren ist eine Fähigkeit!"
|
|
Webo
      
Beiträge: 577
Erhaltene Danke: 14
Win 7, Debian
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop)
|
Verfasst: Di 27.04.10 17:45
_________________ Man kann nur das aus dem Ärmel schütteln, was man auch vorher reingesteckt hat.
|
|
K.S.M. 
      
Beiträge: 82
Windows 7 Professional
Delphi 2010, HTML, JavaScript, CSS, PHP, ein wenig C, Flash ActionScript 2.0/3.0, SQL, Assembler
|
Verfasst: Di 27.04.10 19:00
Nein, leider nicht ganz. Also Das der Fensterrand korrekt aussieht ist schonmal richtig, aber das kriege ich so wohl auch noch hin, ...
Ich hab folgendes problem: Ich suche ja eine voll funktionsfähige Title Bar die z. B. auch die Snap-Funktion unter Windows 7 erlaubt. Und das tut diese Mthode offensichtlich nicht. Deswegen dachte ich ja, das man eher auf die WMNC...-Nachrichten eingehen müsste.
_________________ "Programmieren ist keine Kunst. Programmieren ist eine Fähigkeit!"
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 28.04.10 05:48
Das passiert dort bereits. Wenn die bisher behandelten Nachrichten für den Snap Effekt usw. nicht ausreichen, dann kannst du die entsprechenden doch einfach dort ergänzen (welche das dann sein könnten, weiß ich nicht, danach habe ich bisher nicht geschaut). 
|
|
K.S.M. 
      
Beiträge: 82
Windows 7 Professional
Delphi 2010, HTML, JavaScript, CSS, PHP, ein wenig C, Flash ActionScript 2.0/3.0, SQL, Assembler
|
Verfasst: Mi 28.04.10 16:43
Alles klar, vielen Dank. Müsste ich denn dann wieder eher nach WM_NC...-Nachrichten schauen?
_________________ "Programmieren ist keine Kunst. Programmieren ist eine Fähigkeit!"
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 28.04.10 19:32
Das weiß ich nicht wie dieser Snap-Effekt realisiert wird. Ich vermute aber, dass das nicht allzuviel Aufwand ist, da das ja auch mit älteren Programmen funktioniert. Ich bin gerade mit Vista online, ich muss mal schauen ob ich nachher noch dazu komme das auszuprobieren. Ich habe u.a. berufsbedingt nicht gut Zeit, deshalb habe ich an dem Projekt auch schon lange nichts mehr gemacht, aber mal sehen.
// EDIT:
Was mir aber gerade einfällt: Ich vermute einmal man muss während dem Snap evtl. das innere Fenster anpassen, damit es durchsichtig wird usw., das muss ich mal anschauen was da eigentlich passiert mit XStyle-Programmen.
|
|
K.S.M. 
      
Beiträge: 82
Windows 7 Professional
Delphi 2010, HTML, JavaScript, CSS, PHP, ein wenig C, Flash ActionScript 2.0/3.0, SQL, Assembler
|
Verfasst: Mi 28.04.10 23:09
Wäre es denn nicht überhaupt eam einfachsten, das WM_NCPAINT-Ereignis abzufangen und dann eine Canvas zu schreiben, die auf das Non-Client-Windows-Handle zugreift? Bislang sieht mein Code so aus:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41:
| procedure TFrmMain.DrawTitleBar; var Canvas: TCanvas; TitleBarHeight: Integer; begin TitleBarHeight := GetSystemMetrics( SM_CYCAPTION ) + 8 + FAdditionalTop; Canvas := TCanvas.Create; try Canvas.Handle := GetWindowDC( Handle ); with Canvas do begin Brush.Color := clRed; Rectangle( 0, 0, Width, TitleBarHeight ); Brush.Color := clBlue; Rectangle( 0, TitleBarHeight, 8, Height ); Rectangle( 0, Height - 8, Width, Height ); Rectangle( Width - 8, TitleBarHeight, Width, Height ); Brush.Style := bsClear; end; finally Canvas.Free; end; end;
procedure TFrmMain.WMNCPaint( var AMsg: TWMNCPaint ); begin DrawTitleBar; end;
procedure TFrmMain.WMNCCalcSize( var message: TWMNCCalcSize ); begin inherited; FAdditionalTop := 17; Inc( message.CalcSize_Params^.rgrc[ 0 ].Top, FAdditionalTop ); end; |
Im Screenshot könnt Ihr sehen, wie es aussieht. Windows 7 erlaubt hier die Snap-Funktion. und der ganze rote Bereich kann wie eine Titlebar verwendet werden. Allerdings kriege ich die runden Ecken oben links und rechts nicht weg ...
Einloggen, um Attachments anzusehen!
_________________ "Programmieren ist keine Kunst. Programmieren ist eine Fähigkeit!"
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 29.04.10 14:19
Das geht natürlich, setzt aber voraus, dass die Fenster auch dementsprechend vorbereitet sind. Das heißt im Gegensatz zu XStyleForm kann man das nicht einfach auf beliebige Fenster anwenden.
Wenn es damit geht, sollte es eigentlich aber auch mit XStyleForm gehen, aber ich vermute einmal da spielt die Weitergabe der Daten / Messages zwischen den beiden Fenstern einen Streich. Ich bin leider nicht dazu gekommen es mir anzuschauen...
|
|
|