Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

GUI mit farbigen Buttons?



  • Please log in to reply
27 replies to this topic
roady1969
  • Members
  • 88 posts
  • Last active: Jul 16 2019 10:21 AM
  • Joined: 19 Dec 2012

Hallo,

 

 hBM := GetBitmapGdiP("ButtonTest.jpg")

Ist nur dafür da, damit die Bitmap auf dem Button dargestellt wird.

 

aehm?

Bei wir laedt er zwar dieses komische Teil runter (habe die JPG Datei auf einem anderen Server gefunden und den Link im Beispielscript angepasst), erstellt auch die ButtonTest.jpg, ABER wo soll die erscheinen? Auf dem Button? Auf welchem denn? "Langweiler"? Da liegt bei mir nichts. Es wird kein Bitmap / JPG angezeigt. Bei Euch denn? Wo?

 

Gruss,

Roady



fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012

Werden Transparente Gifs in einer GUI unterstützt?



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Probiers auswink.png

 

hBM := GetBitmapGdiP("ButtonTest.jpg")

Ist nur dafür da, damit die Bitmap auf dem Button dargestellt wird.

 

aehm?

Bei wir laedt er zwar dieses komische Teil runter (habe die JPG Datei auf einem anderen Server gefunden und den Link im Beispielscript angepasst), erstellt auch die ButtonTest.jpg, ABER wo soll die erscheinen? Auf dem Button? Auf welchem denn? "Langweiler"? Da liegt bei mir nichts. Es wird kein Bitmap / JPG angezeigt. Bei Euch denn? Wo?

 

Gruss,

Roady

 

Die Syntax muss an die neue Version der GDI+ Lib von Tic angepasst werden.

Diese kannst du hier runterladen.

Lege sie dann als AHK file in C:/Dokumente und Einstellungen/Benutzername/Eigene Dateien/AutoHotkey/Lib

Dann sparst du dir nervige #Includes.

Sie sollte so heissen.

pToken := Gdip_Startup()
pBitmap := Gdip_CreateBitmapFromFile("ButtonTest.jpg")

Visit the new forum ahkscript.org.

http://ahkscript.org


nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012
_CreatePicturedButtonPlus_(HWND, CB, CT="",Rahmen=1,Iconnumber=1) {
    ; ---------------------------------------------------------------------------
    ; HWND : HWND oder Variablenname des Buttons
    ; Variablennamen m?ssen als "Strings" ?bergeben werden!
    ; CB Bildname oder Pointer zu einer Bitmap
    ; CT : Textfarbe:
    ; 6-steliger RGB Hexwert ("RRGGBB") oder HTML Farbname ("Red")
    ; Voreinstellung: 000000 (Schwarz)
    ; ---------------------------------------------------------------------------
    ; Die meisten DllCall's stammen aus tic's GDIP.AHK:
    ; --> http://www.autohotkey.com/forum/post-198949.html
    ; Ohne tic's Skript g?be es dieses nicht!!!
    ; ---------------------------------------------------------------------------
    ; HTML-Farben
    Static HTML_BLACK := "000000"
    , HTML_SILVER := "C0C0C0"
    , HTML_GRAY := "808080"
    , HTML_WHITE := "FFFFFF"
    , HTML_MAROON := "800000"
    , HTML_RED := "FF0000"
    , HTML_PURPLE := "800080"
    , HTML_FUCHSIA := "FF00FF"
    , HTML_GREEN := "008000"
    , HTML_LIME := "00FF00"
    , HTML_OLIVE := "808000"
    , HTML_YELLOW := "FFFF00"
    , HTML_NAVY := "000080"
    , HTML_BLUE := "0000FF"
    , HTML_TEAL := "008080"
    , HTML_AQUA := "00FFFF"
    ; Windows Konstanten
    , BS_CHECKBOX := "0x2"
    , BS_RADIOBUTTON := "0x4"
    , BS_GROUPBOX := "0x7"
    , BS_AUTORADIOBUTTON := "0x9"
    , BS_BITMAP := "0x80"
    , BS_LEFT := "0x100"
    , BS_RIGHT := "0x200"
    , BS_CENTER := "0x300"
    , BS_TOP := "0x400"
    , BS_BOTTOM := "0x800"
    , BS_VCENTER := "0xC00"
    , SA_LEFT := "0x0"
    , SA_CENTER := "0x1"
    , SA_RIGHT := "0x2"
    , BCM_SETIMAGELIST := "0x1602"
    , BCM_GETTEXTMARGIN := "0x1605"
    , BUTTON_IMAGELIST_ALIGN_LEFT := 0
    , BUTTON_IMAGELIST_ALIGN_RIGHT := 1
    , BUTTON_IMAGELIST_ALIGN_CENTER := 4
    , BM_SETIMAGE := "0xF7"
    , IMAGE_BITMAP := "0x0"
    , BITSPIXEL := "0xC"
    , WM_GETFONT := "0x31"
    ; Weitere Konstanten
    , DEFAULT_CT := "000000"
    , DEFAULT_CB1 := "000000"
    , DEFAULT_GC := 0
    RCBUTTONS := BS_CHECKBOX | BS_RADIOBUTTON | BS_AUTORADIOBUTTON
    ; ---------------------------------------------------------------------------
    ; HWND pr?fen
    If !(HWND + 0) {
    GuiControlGet, nHWND, HWND, %HWND%
    HWND := nHWND
    }
    ; ---------------------------------------------------------------------------
    ; Klasse und Stile des Controls holen und pr?fen
    WinGetClass, Class, ahk_id %HWND%
    If (Class != "Button") {
    MsgBox, 48, _CreateImageButtonP_
    , % "Diese Funktion arbeitet nur mit`n"
    . "Controls der Klasse ""Button""!"
    Return False
    }
    ControlGet, BS, Style, , , ahk_id %HWND%
    If (BS & 0xF ^ BS_GROUPBOX) = 0 {
    MsgBox, 48, _CreatePictureButtonP_
    , % "Diese Funktion arbeitet nicht mit`n"
    . "Controls des Typs ""GroupBox""!"
    Return False
    }
    ; ---------------------------------------------------------------------------
    ; Ggf. Voreinstellungen f?r optionale Parameter setzen
    If (CT = "")
    CT := DEFAULT_CT
    ; Verf?gbarkeit von GDI+ pr?fen
    If !DllCall("GetModuleHandle", "Str", "Gdiplus")
    hGDIP := DllCall("LoadLibrary", Str, "gdiplus")
    VarSetCapacity(SI, 16, 0)
    , Numput(1, SI, 0, "Char")
    , DllCall("gdiplus\GdiplusStartup", UIntP, pToken, UInt, &SI, UInt, 0)
    If (!pToken) {
    MsgBox, 48, _CreatePictureButtonP_
    , % "GDIplus konnte nicht gestartet werden!`n"
    . "Pr?fen Sie bitte die Verf?gbarkeit von GDIPlus auf Ihrem System!"
    Return False
    }
    ; ---------------------------------------------------------------------------
    ; Farbtiefe und Font ermitteln
    hDC := DllCall("GetDC", UInt, HWND)
    , BPP := DllCall("GetDeviceCaps", UInt, hDC, Int, BITSPIXEL)
    , Font := DllCall("SendMessage", UInt, HWND, UInt, WM_GETFONT, UInt, 0, UInt, 0)
    , DllCall("SelectObject", UInt, hDC, UInt, Font)
    , DllCall("gdiplus\GdipCreateFontFromDC", UInt, hDC, UintP, hFont)
    , DllCall("ReleaseDC", UInt, HWND, UInt, hDC)
    ; ---------------------------------------------------------------------------
    ; Rechteck des Clientbereichs ermitteln
    , VarSetCapacity(RECT, 16, 0)
    , DllCall("GetClientRect", UInt, HWND, UInt, &RECT)
    , W := NumGet(RECT, 8), H := NumGet(RECT, 12)
    ; ---------------------------------------------------------------------------
    ; Rechteck f?r das Bild typabh?ngig anpassen
    If Rahmen
	{
	SysGet, SMIW, 49
    If (BS & RCBUTTONS) > 1
    RCBUTTON := 1, W -= SMIW
    Else
    RCBUTTON := 0, W -= 8, H -= 8
    }
	; ---------------------------------------------------------------------------
    ; Beschriftung holen
    ControlGetText,Text2,,ahk_id %HWND%
    ; ---------------------------------------------------------------------------
    ; GDI+ Bitmap erzeugen
    DllCall("gdiplus\GdipCreateBitmapFromScan0", Int, W, Int, H, Int, 0
    , Int, 0x26200A, UInt, 0, UIntP, pBitmap)
    ; ---------------------------------------------------------------------------
    ; Zeiger auf das zugeh?rige Grafikobjekt holen
    , DllCall("gdiplus\GdipGetImageGraphicsContext", UInt, pBitmap, UIntP, pGraphics)
    ; ---------------------------------------------------------------------------
    ; Gl?ttung auf Systemeinstellung setzen
    , DllCall("gdiplus\GdipSetSmoothingMode", UInt, pGraphics, Int, 0)
    ; Bitmap aus Handle oder Datei erstellen
    If !(CB + 0) {
	If IsFunc("Gdip_CreateBitmapFromFile")
	pBM:=Gdip_CreateBitmapFromFile(CB, IconNumber?Iconnumber:1)
	Else
    DllCall("gdiplus\GdipCreateBitmapFromFile", "Str", CB, UIntP, pBM)
    }
    ; Bitmap einf?gen
    DllCall("gdiplus\GdipDrawImageRectI", UInt, pGraphics, UInt, pBM
    , Int, 0, Int, 0, Int, W, Int, H)
    ; Bitmap feigeben
    , DllCall("gdiplus\GdipDisposeImage", UInt, pBM)
    ; ---------------------------------------------------------------------------
    ; Ggf. Beschriftung ausgeben
    If (Text2) {
    ; ------------------------------------------------------------------------
    ; Formatobjekt erstellen
    DllCall("gdiplus\GdipCreateStringFormat", Int, 0x5404, Int, 0, UIntP, hFormat)
    ; ------------------------------------------------------------------------
    ; Textfarbe setzen
    , DllCall("gdiplus\GdipCreateSolidFill", Int, "0xFF" . CT, UIntP, pBrush)
    ; ------------------------------------------------------------------------
    ; Horizontale Ausrichtung setzen
    , HALIGN := (BS & BS_CENTER) = BS_CENTER ? SA_CENTER
    : (BS & BS_CENTER) = BS_RIGHT ? SA_RIGHT
    : (BS & BS_CENTER) = BS_LEFT ? SA_LEFT
    : (RCBUTTON) ? SA_LEFT : SA_CENTER
    , DllCall("gdiplus\GdipSetStringFormatAlign", UInt, hFormat, Int, HALIGN)
    ; Vertikale Ausrichtung setzen
    , VALIGN := (BS & BS_VCENTER) = BS_TOP ? 0
    : (BS & BS_VCENTER) = BS_BOTTOM ? 2
    : 1
    , DllCall("gdiplus\GdipSetStringFormatLineAlign", UInt, hFormat, Int, VALIGN)
    ; ------------------------------------------------------------------------
    ; Renderqualit?t auf Systemeinstellung setzen
    , DllCall("gdiplus\GdipSetTextRenderingHint", UInt, pGraphics, Int, 0)
    ; ------------------------------------------------------------------------
    ; Rechteck f?r den Text bestimmen
    If (RCBUTTON && HALIGN != SA_CENTER)
    XT := HALIGN = SA_RIGHT ? -8.0 : 0.0, WT := HALIGN = SA_RIGHT ? W + 8.0 : W
    Else
    XT := HALIGN = SA_CENTER ? -4.0 : 0.0, WT := HALIGN = SA_CENTER ? W + 8.0 : W
    NumPut(XT, RECT, 0, "Float")
    , NumPut(0.0, RECT, 4, "Float")
    , NumPut(WT, RECT, 8, "Float")
    , NumPut(H, RECT, 12, "Float")
    ; ------------------------------------------------------------------------
    ; Text ausgeben
    , DllCall("gdiplus\GdipDrawString", UInt, pGraphics, Str, Text2, Int, -1
    , UInt, hFont, UInt, &RECT, UInt, hFormat, UInt, pBrush)
    }
    ; ---------------------------------------------------------------------------
    ;die Bitmap erzeugen
    DllCall("gdiplus\GdipCreateHBITMAPFromBitmap", UInt, pBitmap, UIntP, hBitmap
    , Int, 0XFFFFFFFF)
    ; ---------------------------------------------------------------------------
    ; Ressourcen freigeben
    DllCall("gdiplus\GdipDisposeImage", UInt, pBitmap)
    , DllCall("gdiplus\GdipDeleteBrush", UInt, pBrush)
    , DllCall("gdiplus\GdipDeleteStringFormat", UInt, hFormat)
    , DllCall("gdiplus\GdipDeleteFont", UInt, hFont)
    , DllCall("gdiplus\GdipDeleteGraphics", UInt, pGraphics)
    ; GDI+ beenden
    , DllCall("gdiplus\GdiplusShutdown", UInt, pToken)
    If (hGDIP)
    DllCall("FreeLibrary", UInt, hGDIP)
    ; ---------------------------------------------------------------------------
    ; ImageList erstellen
    hIL := DllCall("ImageList_Create", UInt, W, UInt, H, UInt, BPP, UInt, 8, UInt, 0)
    Loop, 1
    DllCall("ImageList_Add", UInt, hIL, UInt, hBitmap, UInt, 0)
    ; BUTTON_IMAGELIST Struktur erstellen
    VarSetCapacity(BIL, 24, 0)
    , NumPut(hIL, BIL)
    , Numput(BUTTON_IMAGELIST_ALIGN_CENTER, BIL, 20)
    ; ImageList zuweisen
    , DllCall("SendMessage", UInt, HWND, UInt, BCM_SETIMAGELIST, UInt, 0, UInt, 0)
    , DllCall("SendMessage", UInt, HWND, UInt, BCM_SETIMAGELIST, UInt, 0, UInt, &BIL)
    ; Beschriftung l?schen
    ControlSetText, , , ahk_ID %HWND%
    ; Bitmap freigeben
    DllCall("DeleteObject", "UInt", hBitmap)
    ; Fertig!
    Return True
    }

Das sit die Funktion von denick bloss modifiziert.

Sie unterstützt nun auch dlls als Ressourcen wenn Tics gdip Lib in dem Autohotkey Lib Verzeichnis ist.


Visit the new forum ahkscript.org.

http://ahkscript.org


roady1969
  • Members
  • 88 posts
  • Last active: Jul 16 2019 10:21 AM
  • Joined: 19 Dec 2012

Hi nnnik,

 

interessanter Code. Allerdings kommt sowohl beim Aufruf aus dem Beispielscript (ueber #include...), als auch beim direkten Scriptablauf eine Fehlermeldung:

 

_CreatePictureButtonPlus_.ahk (219) : ==> Return's parameter should be blank except inside a function.

 

Wenn ich das "true" auskommentiere, kommt "missing {".

 

Hm, geht also leider bei mir nicht...

Gruss,

Roady



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Mein Fehler hab beim Kopieren ein { gefressen.

Ich überlege die ganzen Funktionen zusammen zufügen.


Visit the new forum ahkscript.org.

http://ahkscript.org


roady1969
  • Members
  • 88 posts
  • Last active: Jul 16 2019 10:21 AM
  • Joined: 19 Dec 2012

Hi nnnik,

 

mit der ueberarbeiteten Variante gibt's nun keine Fehlermeldung mehr, aber ich bekomme auch kein JPG auf dem Button angezeigt...

Die Datei buttontest.jpg hat er aber (vom angepassten URL) geladen...

Der erste grosse Button hat auch, sagen wir mal, wingdings Hiroglyphen.

 

Hm???

Gruss,

roady

 

PS. Screenshots einfuegen im Post geht noch immer nicht.



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012
Die Wingdings Hyroglyphen haben die absichtlich reingebaut.
Ich werde das ganze nochmal durchtesten aber ich bekomme schon Bilder auf Buttons.

Habs durchgeschaut selbst wenn die gdiplus lib von Tic fehlt kann man eine Datei darstellen.

Poste mal deinen Code.

Visit the new forum ahkscript.org.

http://ahkscript.org


roady1969
  • Members
  • 88 posts
  • Last active: Jul 16 2019 10:21 AM
  • Joined: 19 Dec 2012

naja, der code ist immer noch nahezu 1:1 zum Ursprungsbeispiel... (muesste es zumindest sein).

#NoEnv
#Include _CreateImageButtonPlus_.ahk
#Include _CreatePicturedButtonPlus_.ahk
If !FileExist("ButtonTest.jpg")
   URLDownloadToFile
      , http://i741.photobucket.com/albums/xx55/GuildzArt/star-wars-yoda-pissed-me-off-you-have.jpg
      , ButtonTest.jpg
pToken := Gdip_Startup()
pBitmap := Gdip_CreateBitmapFromFile("ButtonTest.jpg")
hBM := GetBitmapGdiP("ButtonTest.jpg")
Gui, Margin, 20, 20
Gui, Color, E0E0E0
Gui, Font, s18 Bold, Wingdings
Gui, Add, Button, vBT1 w250 h188 hwndBTID, Hab Dich!`n`n`nJepp!
_CreateImageButtonPlus_("BT1", hBM, "Lime", 9)
Gui, Font
Gui, Font, s10 Normal
Gui, Add, GroupBox, Section xs w115 h90, Farbe w�hlen
Gui, Add, Radio, Left xp+10 yp+20 w60  hwndRBID, Rot
_CreateImageButtonPlus_(RBID, "Maroon|Red", "Yellow", 3, 1)
Gui, Add, Radio, Right y+5 hp wp hwndRBID, Grün
_CreateImageButtonPlus_(RBID, "Lime|Teal", "004000", 3, 1)
Gui, Add, Radio, Center y+5 hp wp hwndRBID, Blau
_CreateImageButtonPlus_(RBID, "Navy|Blue", "White", 3, 1)
Gui, Add, CheckBox, ys Center hwndCBID, Check mich!`nZweizeiler!
_CreateImageButtonPlus_(CBID, "Green|Yellow", "Navy", 2)
Gui, Add, Button, vBTEX w115 h38 gGuiClose, Und Tschüss!
_CreateImageButtonPlus_("BTEX", "000000|C0C0C0", "Lime", 2)
Gui, Show, , Colored Buttons GDI+
Return
; ------------------------------------------------------------------------------
GuiClose:
GuiEscape:
DllCall("DeleteObjekt", UInt, hBM)
ExitApp
; ------------------------------------------------------------------------------
GetBitmapGdiP(PATH, W=0, H=0) {
   If !DllCall("GetModuleHandle",Str,"Gdiplus")
      MH:=DllCall("LoadLibrary",Str,"Gdiplus")
   VarSetCapacity(SI,16,0)
 , SI:=Chr(1)
 , DllCall("Gdiplus\GdiplusStartup",UIntP,TG,UInt,&SI,UInt,0)
 , VarSetCapacity(WP,1024)
 , DllCall("Kernel32\MultiByteToWideChar",UInt,0,UInt,0,Str,PATH,Int,-1,UInt,&WP,Int,512)
 , DllCall("Gdiplus\GdipCreateBitmapFromFile",UInt,&WP,UIntP,PB)
 , DllCall("Gdiplus\GdipCreateHBITMAPFromBitmap",UInt,PB,UIntP,HB,Int,0xFFFFFFFF)
 , DllCall("Gdiplus\GdipDisposeImage",UInt,PB)
 , DllCall("Gdiplus\GdiplusShutdown",UInt,TG)
   If (MH)
      DllCall("FreeLibrary",UInt,MH)
   Return (W=0 && H=0) ? HB : DllCall("CopyImage",UInt,HB,UInt,0,Int,W,Int,H,UInt,0x8)
}

wie kann ich feststellen, ob die GDI+fehlt?

in /LIB unter /EigeneDateien/Autohotkey/ habe ich eine Gdip.ahk. Das muesste die doch sein, oder?

 

Gruss,

Roady



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Du benutzt den falschen Funktionsnamen.

Gui, Margin, 20, 20
Gui, Color, E0E0E0
Gui, Font, s18 Bold, Wingdings
Gui, Add, Button, vBT1 w250 h188 hwndBTID, Hab Dich!`n`n`nJepp!
_CreatePicturedButtonPlus_(BTID, "ButtonTest.jpg", "Lime")

_CreatePicturedButtonPlus_ für Bilder

anstatt

 

 

Ich hab es vorerst in eine andere Funktion gelegt nämlich _CreatePicturedButtonPlus_

Zudem würde ich "ButtonTest.jpg" direkt übergeben damit du bei der Verwendung von Gdip keine Fehler machst. (was du hier nicht tust)

 

Die Funktion GetBitmapGdiP(PATH, W=0, H=0)  ist zwar an sich richtig hat aber mehrere Fehler so ist sie ANSI (Sie ruft eine dll auf um ANSI in Unicode zu verwandeln) 

Und sie startet  dafür extra GDIPlus nochmal und das ist nicht optimal.(Ist bei denicks Funktion nicht viel besser...).

Zudem könntest du diesen ganzen Effekt durch 1 DllCall erreichen.

 

 

Ich werde den ganzen Code vielleicht in ein Objekt schreiben.

 

Natürlich musst du diese Funktion mit einbauen:

_CreatePicturedButtonPlus_(HWND, CB, CT="",Rahmen=1,Iconnumber=1) {
    ; ---------------------------------------------------------------------------
    ; HWND : HWND oder Variablenname des Buttons
    ; Variablennamen m?ssen als "Strings" ?bergeben werden!
    ; CB Bildname oder Pointer zu einer Bitmap
    ; CT : Textfarbe:
    ; 6-steliger RGB Hexwert ("RRGGBB") oder HTML Farbname ("Red")
    ; Voreinstellung: 000000 (Schwarz)
    ; ---------------------------------------------------------------------------
    ; Die meisten DllCall's stammen aus tic's GDIP.AHK:
    ; --> http://www.autohotkey.com/forum/post-198949.html
    ; Ohne tic's Skript g?be es dieses nicht!!!
    ; ---------------------------------------------------------------------------
    ; HTML-Farben
    Static HTML_BLACK := "000000"
    , HTML_SILVER := "C0C0C0"
    , HTML_GRAY := "808080"
    , HTML_WHITE := "FFFFFF"
    , HTML_MAROON := "800000"
    , HTML_RED := "FF0000"
    , HTML_PURPLE := "800080"
    , HTML_FUCHSIA := "FF00FF"
    , HTML_GREEN := "008000"
    , HTML_LIME := "00FF00"
    , HTML_OLIVE := "808000"
    , HTML_YELLOW := "FFFF00"
    , HTML_NAVY := "000080"
    , HTML_BLUE := "0000FF"
    , HTML_TEAL := "008080"
    , HTML_AQUA := "00FFFF"
    ; Windows Konstanten
    , BS_CHECKBOX := "0x2"
    , BS_RADIOBUTTON := "0x4"
    , BS_GROUPBOX := "0x7"
    , BS_AUTORADIOBUTTON := "0x9"
    , BS_BITMAP := "0x80"
    , BS_LEFT := "0x100"
    , BS_RIGHT := "0x200"
    , BS_CENTER := "0x300"
    , BS_TOP := "0x400"
    , BS_BOTTOM := "0x800"
    , BS_VCENTER := "0xC00"
    , SA_LEFT := "0x0"
    , SA_CENTER := "0x1"
    , SA_RIGHT := "0x2"
    , BCM_SETIMAGELIST := "0x1602"
    , BCM_GETTEXTMARGIN := "0x1605"
    , BUTTON_IMAGELIST_ALIGN_LEFT := 0
    , BUTTON_IMAGELIST_ALIGN_RIGHT := 1
    , BUTTON_IMAGELIST_ALIGN_CENTER := 4
    , BM_SETIMAGE := "0xF7"
    , IMAGE_BITMAP := "0x0"
    , BITSPIXEL := "0xC"
    , WM_GETFONT := "0x31"
    ; Weitere Konstanten
    , DEFAULT_CT := "000000"
    , DEFAULT_CB1 := "000000"
    , DEFAULT_GC := 0
    RCBUTTONS := BS_CHECKBOX | BS_RADIOBUTTON | BS_AUTORADIOBUTTON
    ; ---------------------------------------------------------------------------
    ; HWND pr?fen
    If !(HWND + 0) {
    GuiControlGet, nHWND, HWND, %HWND%
    HWND := nHWND
    }
    ; ---------------------------------------------------------------------------
    ; Klasse und Stile des Controls holen und pr?fen
    WinGetClass, Class, ahk_id %HWND%
    If (Class != "Button") {
    MsgBox, 48, _CreateImageButtonP_
    , % "Diese Funktion arbeitet nur mit`n"
    . "Controls der Klasse ""Button""!"
    Return False
    }
    ControlGet, BS, Style, , , ahk_id %HWND%
    If (BS & 0xF ^ BS_GROUPBOX) = 0 {
    MsgBox, 48, _CreatePictureButtonP_
    , % "Diese Funktion arbeitet nicht mit`n"
    . "Controls des Typs ""GroupBox""!"
    Return False
    }
    ; ---------------------------------------------------------------------------
    ; Ggf. Voreinstellungen f?r optionale Parameter setzen
    If (CT = "")
    CT := DEFAULT_CT
    ; Verf?gbarkeit von GDI+ pr?fen
    If !DllCall("GetModuleHandle", "Str", "Gdiplus")
    hGDIP := DllCall("LoadLibrary", Str, "gdiplus")
    VarSetCapacity(SI, 16, 0)
    , Numput(1, SI, 0, "Char")
    , DllCall("gdiplus\GdiplusStartup", UIntP, pToken, UInt, &SI, UInt, 0)
    If (!pToken) {
    MsgBox, 48, _CreatePictureButtonP_
    , % "GDIplus konnte nicht gestartet werden!`n"
    . "Pr?fen Sie bitte die Verf?gbarkeit von GDIPlus auf Ihrem System!"
    Return False
    }
    ; ---------------------------------------------------------------------------
    ; Farbtiefe und Font ermitteln
    hDC := DllCall("GetDC", UInt, HWND)
    , BPP := DllCall("GetDeviceCaps", UInt, hDC, Int, BITSPIXEL)
    , Font := DllCall("SendMessage", UInt, HWND, UInt, WM_GETFONT, UInt, 0, UInt, 0)
    , DllCall("SelectObject", UInt, hDC, UInt, Font)
    , DllCall("gdiplus\GdipCreateFontFromDC", UInt, hDC, UintP, hFont)
    , DllCall("ReleaseDC", UInt, HWND, UInt, hDC)
    ; ---------------------------------------------------------------------------
    ; Rechteck des Clientbereichs ermitteln
    , VarSetCapacity(RECT, 16, 0)
    , DllCall("GetClientRect", UInt, HWND, UInt, &RECT)
    , W := NumGet(RECT, 8), H := NumGet(RECT, 12)
    ; ---------------------------------------------------------------------------
    ; Rechteck f?r das Bild typabh?ngig anpassen
    If Rahmen
	{
	SysGet, SMIW, 49
    If (BS & RCBUTTONS) > 1
    RCBUTTON := 1, W -= SMIW
    Else
    RCBUTTON := 0, W -= 8, H -= 8
    }
	; ---------------------------------------------------------------------------
    ; Beschriftung holen
    ControlGetText,Text2,,ahk_id %HWND%
    ; ---------------------------------------------------------------------------
    ; GDI+ Bitmap erzeugen
    DllCall("gdiplus\GdipCreateBitmapFromScan0", Int, W, Int, H, Int, 0
    , Int, 0x26200A, UInt, 0, UIntP, pBitmap)
    ; ---------------------------------------------------------------------------
    ; Zeiger auf das zugeh?rige Grafikobjekt holen
    , DllCall("gdiplus\GdipGetImageGraphicsContext", UInt, pBitmap, UIntP, pGraphics)
    ; ---------------------------------------------------------------------------
    ; Gl?ttung auf Systemeinstellung setzen
    , DllCall("gdiplus\GdipSetSmoothingMode", UInt, pGraphics, Int, 0)
    ; Bitmap aus Handle oder Datei erstellen
    If !(CB + 0) {
	If IsFunc("Gdip_CreateBitmapFromFile")
	pBM:=Gdip_CreateBitmapFromFile(CB, IconNumber?Iconnumber:1)
	Else
    DllCall("gdiplus\GdipCreateBitmapFromFile", "Str", CB, UIntP, pBM)
    }
    ; Bitmap einf?gen
    DllCall("gdiplus\GdipDrawImageRectI", UInt, pGraphics, UInt, pBM
    , Int, 0, Int, 0, Int, W, Int, H)
    ; Bitmap feigeben
    , DllCall("gdiplus\GdipDisposeImage", UInt, pBM)
    ; ---------------------------------------------------------------------------
    ; Ggf. Beschriftung ausgeben
    If (Text2) {
    ; ------------------------------------------------------------------------
    ; Formatobjekt erstellen
    DllCall("gdiplus\GdipCreateStringFormat", Int, 0x5404, Int, 0, UIntP, hFormat)
    ; ------------------------------------------------------------------------
    ; Textfarbe setzen
    , DllCall("gdiplus\GdipCreateSolidFill", Int, "0xFF" . CT, UIntP, pBrush)
    ; ------------------------------------------------------------------------
    ; Horizontale Ausrichtung setzen
    , HALIGN := (BS & BS_CENTER) = BS_CENTER ? SA_CENTER
    : (BS & BS_CENTER) = BS_RIGHT ? SA_RIGHT
    : (BS & BS_CENTER) = BS_LEFT ? SA_LEFT
    : (RCBUTTON) ? SA_LEFT : SA_CENTER
    , DllCall("gdiplus\GdipSetStringFormatAlign", UInt, hFormat, Int, HALIGN)
    ; Vertikale Ausrichtung setzen
    , VALIGN := (BS & BS_VCENTER) = BS_TOP ? 0
    : (BS & BS_VCENTER) = BS_BOTTOM ? 2
    : 1
    , DllCall("gdiplus\GdipSetStringFormatLineAlign", UInt, hFormat, Int, VALIGN)
    ; ------------------------------------------------------------------------
    ; Renderqualit?t auf Systemeinstellung setzen
    , DllCall("gdiplus\GdipSetTextRenderingHint", UInt, pGraphics, Int, 0)
    ; ------------------------------------------------------------------------
    ; Rechteck f?r den Text bestimmen
    If (RCBUTTON && HALIGN != SA_CENTER)
    XT := HALIGN = SA_RIGHT ? -8.0 : 0.0, WT := HALIGN = SA_RIGHT ? W + 8.0 : W
    Else
    XT := HALIGN = SA_CENTER ? -4.0 : 0.0, WT := HALIGN = SA_CENTER ? W + 8.0 : W
    NumPut(XT, RECT, 0, "Float")
    , NumPut(0.0, RECT, 4, "Float")
    , NumPut(WT, RECT, 8, "Float")
    , NumPut(H, RECT, 12, "Float")
    ; ------------------------------------------------------------------------
    ; Text ausgeben
    , DllCall("gdiplus\GdipDrawString", UInt, pGraphics, Str, Text2, Int, -1
    , UInt, hFont, UInt, &RECT, UInt, hFormat, UInt, pBrush)
    }
    ; ---------------------------------------------------------------------------
    ;die Bitmap erzeugen
    DllCall("gdiplus\GdipCreateHBITMAPFromBitmap", UInt, pBitmap, UIntP, hBitmap
    , Int, 0XFFFFFFFF)
    ; ---------------------------------------------------------------------------
    ; Ressourcen freigeben
    DllCall("gdiplus\GdipDisposeImage", UInt, pBitmap)
    , DllCall("gdiplus\GdipDeleteBrush", UInt, pBrush)
    , DllCall("gdiplus\GdipDeleteStringFormat", UInt, hFormat)
    , DllCall("gdiplus\GdipDeleteFont", UInt, hFont)
    , DllCall("gdiplus\GdipDeleteGraphics", UInt, pGraphics)
    ; GDI+ beenden
    , DllCall("gdiplus\GdiplusShutdown", UInt, pToken)
    If (hGDIP)
    DllCall("FreeLibrary", UInt, hGDIP)
    ; ---------------------------------------------------------------------------
    ; ImageList erstellen
    hIL := DllCall("ImageList_Create", UInt, W, UInt, H, UInt, BPP, UInt, 8, UInt, 0)
    Loop, 1
    DllCall("ImageList_Add", UInt, hIL, UInt, hBitmap, UInt, 0)
    ; BUTTON_IMAGELIST Struktur erstellen
    VarSetCapacity(BIL, 24, 0)
    , NumPut(hIL, BIL)
    , Numput(BUTTON_IMAGELIST_ALIGN_CENTER, BIL, 20)
    ; ImageList zuweisen
    , DllCall("SendMessage", UInt, HWND, UInt, BCM_SETIMAGELIST, UInt, 0, UInt, 0)
    , DllCall("SendMessage", UInt, HWND, UInt, BCM_SETIMAGELIST, UInt, 0, UInt, &BIL)
    ; Beschriftung l?schen
    ControlSetText, , , ahk_ID %HWND%
    ; Bitmap freigeben
    DllCall("DeleteObject", "UInt", hBitmap)
    ; Fertig!
    Return True
    }

Visit the new forum ahkscript.org.

http://ahkscript.org


roady1969
  • Members
  • 88 posts
  • Last active: Jul 16 2019 10:21 AM
  • Joined: 19 Dec 2012

Hallo nnnik,

 

mit dem angepassten Funktionsaufruf klappt's nun.

ABER ich habe mal wieder ein neues Phaenomen. Mit meinem eigenen Script, nachfolgend ein kleiner Auszug,

Gui, Add, Button, VStarten GStarten x36 y30 w170 h160 , Starten
_CreateImageButtonPlus_("Starten, "FF0000|FF0000", "000000", 2)
Gui, Add, Button, VBeenden GBeenden x266 y30 w170 h160 , Beenden
_CreateImageButtonPlus_("Beenden", "00FF00|00FF00", "000000", 2)

habe ich wieder wie in #11 dieses Threads gepostet das Problem, dass ich die Meldung aus

MsgBox, 48, _CreateImageButtonP_
    , % "Diese Funktion arbeitet nur mit`n"
    . "Controls der Klasse ""Button""!"

Codezeile 70ff von Deinem Script bekomme (da ist uebrigens der MsgBox-Titel noch "alt") WENN ich den ImageButton_Scriptaufruf auskommentiere und dann durch

_CreatePicturedButtonPlus_(BTID, "ButtonTest.jpg", "Lime",1,0)

ersetze.

 

In #12 dieses Threads hattest Du festgestellt, warum ich damals mit _CreateImageButtonPlus_.ahk den Fehler bekam. Nur finde ich heute keinen Test-Funktionsaufruf in Deinem Script. Und warum klappt's mit korrigiertem Funktionsaufruf in dem Ursprungsbeispiel script - nicht aber in meinem?

 

hm,

Roady



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Schmeiss einfach die * Messageboxes raus.

Die stören höchstens, zumal ich nicht glaube, dass sie wirklich benötigt werden.

In #12 dieses Threads hattest Du festgestellt, warum ich damals mit _CreateImageButtonPlus_.ahk den Fehler bekam. Nur finde ich heute keinen Test-Funktionsaufruf in Deinem Script. 

Den Fehler hab ich gelöscht.

Und warum klappt's mit korrigiertem Funktionsaufruf in dem Ursprungsbeispiel script - nicht aber in meinem?

 

Weil BTID in meinem Beispiel die HWND des Controls enthält.

Übergib einfach weiterhin den Namen des Controls


Visit the new forum ahkscript.org.

http://ahkscript.org


roady1969
  • Members
  • 88 posts
  • Last active: Jul 16 2019 10:21 AM
  • Joined: 19 Dec 2012

ok, danke!

Klappt alles!