Titelleiste systemunabhängig immer gleiche Größe Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

tm6464
Posts: 48
Joined: 17 Jul 2017, 22:56

Titelleiste systemunabhängig immer gleiche Größe

11 Aug 2017, 20:23

Hi Leute
gibt es eine Möglichkeit die Titelleiste des Gui immer in gleicher Größe anzeigen zu lassen , zb win7 und win10 oder wenn man in windows das design ändert.
thx
just me
Posts: 9451
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Titelleiste systemunabhängig immer gleiche Größe

12 Aug 2017, 01:27

Moin,

ich glaube, es gibt eine Systemeinstellung für die Höhe der Titelleiste, aber die würde sich auf alle Fenster auswirken. Welchem Zweck soll das dienen?
tm6464
Posts: 48
Joined: 17 Jul 2017, 22:56

Re: Titelleiste systemunabhängig immer gleiche Größe

12 Aug 2017, 02:21

Ja stimmt es gibt eine Systemeinstellung in windows für die Höhe der Titelleiste, aber wie du sagst würde sich das auf alle Fenster auswirken daher suche ich das nicht.
Der Zweck ist das coords immer gleich bleiben.
Meine jetztige Lösung ist mit -caption die Titelleiste zu entfernen und via button ein x zum schliessen , dachte es gibt vll wie in c# "CaptionHeight"...
just me
Posts: 9451
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Titelleiste systemunabhängig immer gleiche Größe

12 Aug 2017, 10:08

Wofür sollen welche "coords" immer gleich bleiben?
tm6464
Posts: 48
Joined: 17 Jul 2017, 22:56

Re: Titelleiste systemunabhängig immer gleiche Größe

13 Aug 2017, 17:25

Im Gui Fenster ist ein ActiveX Fenster das ich mit ControlClick,xy anklicke , leider stimmen bei Wechsel von win7 und win10 aufgrund der Titelleiste die coords nicht mehr.
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Titelleiste systemunabhängig immer gleiche Größe

14 Aug 2017, 01:25

tm6464 wrote:Im Gui Fenster ist ein ActiveX Fenster das ich mit ControlClick,xy anklicke , leider stimmen bei Wechsel von win7 und win10 aufgrund der Titelleiste die coords nicht mehr.
Das trifft mitunter selbst bei wechsel der darstellungsform innerhalb des selben OS zu. Hatte vor gefühlt 100 jahren damit zu kämpfen, als im office der wechsel von XP auf win7 anstand, und deshalb der komplette semi-automatisierte billing process re-konfiguriert werden musste. :crazy:
just me
Posts: 9451
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Titelleiste systemunabhängig immer gleiche Größe

14 Aug 2017, 02:26

Moin,

Du könntest auf Deinem Entwicklungssystem die Distanzen (Deltas) zwischen den oberen linken Ecken des Fensters und des Clientbereichs bestimmen:

Code: Select all

#NoEnv
Gui, +hwndHGUI -DPIScale
Gui, Show, w600 h400, Test
WinGetPos, WX, WY, , , ahk_id %HGUI%
WinGetClientPos(HGUI, CX, CY)
DeltaX := CX - WX
DeltaY := CY - WY
MsgBox, DeltaX: %DeltaX% - DeltaY: %DeltaY%
Return

GuiClose:
ExitApp

WinGetClientPos(HWND, ByRef X := "", ByRef Y := "", ByRef W := "", ByRef H := "") {
   VarSetCapacity(RECT, 16, 0)
   If DllCall("GetClientRect", "Ptr", HWND, "Ptr", &RECT) && DllCall("ClientToScreen", "Ptr", HWND, "Ptr", &RECT) {
      X := NumGet(RECT, 0, "Int")
      Y := NumGet(RECT, 4, "Int")
      W := X + NumGet(RECT, 8, "Int")
      H := Y + NumGet(RECT, 12, "Int")
      Return True
   }
   Return False
}
Wenn dann auf dem Zielsystem abweichende Werte ermittelt werden, kannst Du die Position für ControlClick entsprechend anpassen.
tm6464
Posts: 48
Joined: 17 Jul 2017, 22:56

Re: Titelleiste systemunabhängig immer gleiche Größe

14 Aug 2017, 04:52

Danke für die Lösung habs getestet
Ganz erlich, ich finde mit -caption einfach die Titelleiste zu entfernen weit aus besser, da stimmen die coords immer , bisher ;)
just me
Posts: 9451
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Titelleiste systemunabhängig immer gleiche Größe

14 Aug 2017, 06:00

Ganz ehrlich, die Titelleiste komplett zu entfernen ist für mich die absolute Notlösung, wenn man keine zusätzlichen Gründe dafür hat. ;)
tm6464
Posts: 48
Joined: 17 Jul 2017, 22:56

Re: Titelleiste systemunabhängig immer gleiche Größe

14 Aug 2017, 23:11

Hast natürlich recht ist eine Notlösung.
Ohne Titelleiste kann man zb das Fenster nicht mehr verschieben, habe dafür bisher noch keine gute Lösung...
just me
Posts: 9451
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Titelleiste systemunabhängig immer gleiche Größe  Topic is solved

15 Aug 2017, 01:30

Dafür gibt es schon lange eine gute Lösung, die wohl ursprünglich von SKAN stammt.

Beispiel:

Code: Select all

#NoEnv
; Der 'extended style' 0x02000000 (WS_EX_COMPOSITED) bewirkt, dass überlappende Controls in der Reihenfolge unten->oben
; gezeichnet werden.
Gui, -Caption -DPIScale +Border +E0x02000000
Gui, Margin, 0, 0
; Weißer Hintergrund für die simulierte Titelleiste (0x0006 = SS_WHITERECT).
; Der Stil +0x0100 (SS_NOTIFY) bewirkt, dass Mausklicks dem Control auch ohne g-Label zugeordnet werden.
Gui, Add, Text, w400 h20 vTitelleiste +0x0006 +0x0100
; Text für die simulierte Titelleite.
; Der Stil 0x0200 (SS_CENTERIMAGE) bewirkt, dass der Text vertikal zentriert wird.
Gui, Add, Text, xp yp wp hp +0x0200 +BackgroundTrans +hwndHCTL, % "   Simulierte Titelleiste"
; Der Text muss 'nach oben' gebracht werden, damit er sichtbar ist.
DllCall("BringWindowToTop", "Ptr", HCTL)
; Close-Button für die simulierte Titelleiste, geht auch 'viel schöner'.
Gui, Add, Text, x380 y0 w20 h20 gGuiClose cRed Center +0x0200 +0x0100 +hwndHCTL +BackGroundTrans, X
; Der 'Button' muss 'nach oben' gebracht werden, damit er sichtbar ist.
DllCall("BringWindowToTop", "Ptr", HCTL)
; Und noch ein Control.
Gui, Add, Edit, x10 y+10 w380 h100, Edit Control als Beispiel!
; Für den unteren Freiraum (10 Pixel).
Gui, Add, Text, x0 y+0 w400 h10
Gui, Show, , TestGui
OnMessage(0x0201, "WM_LBUTTONDOWN")
Return

GuiClose:
GuiEscape:
ExitApp

WM_LBUTTONDOWN() {
   ; Bei einem Linksklick auf die simulierte Titelleiste wird die Nachricht NC_LBUTTONDOWN (0xA1) mit wParam HTCAPTION (2)
   ; und lParam 0 (relative Koordinaten 0/0) an das "last-found window" (in diesem Fall das aktive GUI-Fenster) gesendet.
   ; Das geht dann davon aus, dass in eine 'echte' Titelleiste geklickt wurde, und verhält sich entsprechend.
   If (A_GuiControl = "Titelleiste")
      PostMessage, 0xA1, 2, 0
}
Alternativ mit mehrteiliger 'Titelleiste' (macht die Klickunterscheidung Titel/CloseButton einfacher):

Code: Select all

#NoEnv
HWhite := CreateDIB(0x3399FF)
HClose := LoadPicture("Shell32.dll", "GDI+ Icon132 h16 w16", ImageType)
GuiWidth := 400
Gui, -Caption -DPIScale +Border
Gui, Margin, 10, 10
; Simulierte Titelleiste, Gesamtbreite 400 Pixel (GuiWidth) ----------------------------------------------------------------------
; Weißes Textfeld für den linken Freiraum (10 Pixel), nicht klickbar.
Gui, Add, Pic, x0 y0 w10 h20, HBITMAP:*%HWhite%
; Weißer Hintergrund für den Titelbereich.
; Der Stil +0x0100 (SS_NOTIFY) bewirkt, dass Mausklicks dem Control auch ohne g-Label zugeordnet werden.
; Gui, Add, Text, x+0 yp w370 h20 vTitelBereich +0x0006 +0x0100
Gui, Add, Pic, x+0 yp w370 h20 vTitelBereich +0x0100, HBITMAP:*%HWhite%
; Fenstertitel
; Der Stil 0x0200 (SS_CENTERIMAGE) bewirkt, dass der Text vertikal zentriert wird.
Gui, Add, Text, xp yp wp hp cWhite +0x0200 +BackgroundTrans vTitel, Simulierte Titelleiste
; Weißer Hintergrund für den Close Button.
Gui, Add, Pic, x380 yp w20 h20 gGuiClose, HBITMAP:%HWhite%
; Icon für den Close Button
Gui, Add, Pic, xp+2 yp+2 wp-4 hp-4 +BackgroundTrans, HICON:%HClose%
; Controlbereich -----------------------------------------------------------------------------------------------------------------
Gui, Add, Edit, xm y30 w380 h100, Edit Control als Beispiel!
Gui, Show, w%GuiWidth%, TestGui
OnMessage(0x0201, "WM_LBUTTONDOWN")
Return

GuiClose:
GuiEscape:
ExitApp

WM_LBUTTONDOWN() {
   ; Bei einem Linksklick auf die simulierte Titelleiste wird die Nachricht NC_LBUTTONDOWN (0xA1) mit wParam HTCAPTION (2)
   ; und lParam 0 (relative Koordinaten 0/0) an das "last-found window" (in diesem Fall das aktive GUI-Fenster) gesendet.
   ; Das geht dann davon aus, dass in eine 'echte' Titelleiste geklickt wurde, und verhält sich entsprechend.
   If (A_GuiControl = "TitelBereich")
      PostMessage, 0xA1, 2, 0
}

; ==================================================================================================================================
; Modified version of a function by SKAN, 01-Apr-2014, autohotkey.com/boards/viewtopic.php?t=3203
; Creates an uni-colored bitmap of 1 * 1 pixels.
; ==================================================================================================================================
CreateDIB(Color) {
   VarSetCapacity(BMBITS, 4, 0)
   , Numput(Color, BMBITS, "UInt")
   , HBM := DllCall("CreateBitmap", "Int", 1, "Int", 1, "UInt", 1, "UInt", 24, "Ptr", 0, "UPtr")
   , HBM := DllCall("CopyImage", "Ptr", HBM, "UInt", 0, "Int", 0, "Int", 0, "UInt", 0x2008, "UPtr")
   , DllCall("SetBitmapBits", "Ptr", HBM, "UInt", 4, "Ptr", &BMBITS)
   Return HBM
}

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 76 guests