Hey,
Ich habe mal eine Frage ist es möglich mit dieser API(Directx Hook): https://github.com/agrippa1994/DX9-Overlay-API zb. Strings auf dem Desktop anzeigen zulassen, in einem Gui, evtl dargestellt per GDIP(?)...
Ich bin gerade dabei mit GDIP rumzuprobieren, aber derzeit leider noch erfolglos...
Hat jemand eine Idee, oder sogar Ahnung davon ?
Gruß
Renz
DirectX Hook im Gui (via GDIP(?))
Moderator: jNizM
Re: DirectX Hook im Gui (via GDIP(?))
Moin,
soweit ich weiß, ist DirectX eine Alternative zu den Windows GDI/GDI+ Funktionen, die die Grafikausgabe durch direkten Zugriff auf die Grafikhardware beschleunigen kann.
Zum Thema GDIP: Für manche Funktionen ist es entscheidend, das zur AHK-Version (32/64 Bit) passende GDIP-Skript zu verwenden. Es gibt mehrere unterschiedliche Skripte. Die ursprüngliche Version von tic ist in Teilen nur für 32-Bit funktionsfähig.
soweit ich weiß, ist DirectX eine Alternative zu den Windows GDI/GDI+ Funktionen, die die Grafikausgabe durch direkten Zugriff auf die Grafikhardware beschleunigen kann.
Kannst Du etwas detaillierter beschreiben, was Du tun willst?Renz wrote:... zb. Strings auf dem Desktop anzeigen zulassen, in einem Gui, evtl dargestellt per GDIP(?)...
Zum Thema GDIP: Für manche Funktionen ist es entscheidend, das zur AHK-Version (32/64 Bit) passende GDIP-Skript zu verwenden. Es gibt mehrere unterschiedliche Skripte. Die ursprüngliche Version von tic ist in Teilen nur für 32-Bit funktionsfähig.
Re: DirectX Hook im Gui (via GDIP(?))
Hey, Sry für die späte Antwort...
Man kann natürlich auch per HTML/CSS die Guis gestalten, aber das ist "für mich" nicht das richtige^^
Das mit dem Directx Hook von meinem 1. Beitrag ist hinfällig, da ich mich entschieden habe nur mit GDIP zu arbeiten, da es genau das erfüllt was ich suche...
Diesbezüglich hätte ich eine Frage,
Wenn ich mit meiner Klasse eine Box erstelle mit den Koordinaten X=0 Y=0 W=100 H=100 ist alles gut, die Box wird gut angezeigt...
Wenn ich aber die X bzw Y Koordinate erhöhe +10 sind schon genug, verändert sich die ganze Box und die Ränder verziehen und verschwinden...
Liegt es an UpdateLayeredWindow() evtl benutze ich es falsch?
Gruß
Klar, Ich versuche mir derzeit eine Klasse zuerstellen die mir hilft dabei mit GDIP zuarbeiten für Grafische Overlays auf dem Desktop, statt der "herkömmlichen" Guis/Fenster.just me wrote:Kannst Du etwas detaillierter beschreiben, was Du tun willst?
Man kann natürlich auch per HTML/CSS die Guis gestalten, aber das ist "für mich" nicht das richtige^^
Das mit dem Directx Hook von meinem 1. Beitrag ist hinfällig, da ich mich entschieden habe nur mit GDIP zu arbeiten, da es genau das erfüllt was ich suche...
Diesbezüglich hätte ich eine Frage,
Wenn ich mit meiner Klasse eine Box erstelle mit den Koordinaten X=0 Y=0 W=100 H=100 ist alles gut, die Box wird gut angezeigt...
Wenn ich aber die X bzw Y Koordinate erhöhe +10 sind schon genug, verändert sich die ganze Box und die Ränder verziehen und verschwinden...
Kleines Testskript
Hätte jemand dazu evtl eine Idee? Liegt es an UpdateLayeredWindow() evtl benutze ich es falsch?
Gruß
Re: DirectX Hook im Gui (via GDIP(?))
Ich hab den Fehler gefunden.
GDIp zeichnet nicht relativ zum Bildschirm sondern relativ zu der Bitmap auf die du gerade Zeichnest.
Wenn du also ein Rechteck bei 0,0 Zeichnen lässt und es dann per UpdateLayeredWindow auf deine GUI legst wird dieses Rechteck in der linken oberen Ecke anfangen.
Du zeichnest jedoch das Rechteck und deinen Rahmen mit einem Offset, sodass sie nicht mehr genau auf deinem GUI liegen.
Es ist zudem Erwähnenswert, dass die Rect Struktur von Windows sehr leicht zu Fehlern führen kann wenn man nicht aufpasst.
Und ich finde es komisch den Rahmen unter die Box zu legen.
GDIp zeichnet nicht relativ zum Bildschirm sondern relativ zu der Bitmap auf die du gerade Zeichnest.
Wenn du also ein Rechteck bei 0,0 Zeichnen lässt und es dann per UpdateLayeredWindow auf deine GUI legst wird dieses Rechteck in der linken oberen Ecke anfangen.
Du zeichnest jedoch das Rechteck und deinen Rahmen mit einem Offset, sodass sie nicht mehr genau auf deinem GUI liegen.
Es ist zudem Erwähnenswert, dass die Rect Struktur von Windows sehr leicht zu Fehlern führen kann wenn man nicht aufpasst.
Und ich finde es komisch den Rahmen unter die Box zu legen.
Recommends AHK Studio
Re: DirectX Hook im Gui (via GDIP(?))
Code: Select all
#Persistent
#SingleInstance force
#include <gdip_all>
#NoEnv
global GDITOKEN := GDIP_Startup()
test := new Main.GUICLASS(GDITOKEN)
o := new Main.GDICLASS()
BoxID := o.CreateBox(0,0,500,400,10,0xFFFFFF00)
FilledBoxID := o.FillBox(BoxID,0xAA0000FF)
TextID := o.DrawStringEx("Das ist korrekt, so sollte die Box aussehen! `nKoordinaten: X=0 & Y=0 & W=500 & H=400","Arial",25,0xAA000000,5,5,500,150)
sleep 5000
o.RemoveID(BoxID)
o.RemoveID(FilledBoxID)
o.RemoveID(TextID)
BoxID := o.CreateBox(100,100,500,400,10,0xFFFFFF00)
FilledBoxID := o.FillBox(BoxID,0xAA0000FF)
TextID := o.DrawStringEx("Das ist Falsch, Die Rechte und Untere Seite verschwinden`nKoordinaten: X=50 & Y=25 & W=500 & H=400","Arial",25,0xAA000000,50,25,500,574)
sleep 2500
o.RemoveID(BoxID)
o.RemoveID(FilledBoxID)
o.RemoveID(TextID)
class Main
{
static _ERROR := False,GDITOKEN,GUICOUNT:=0,STRUCT := Object()
class GDICLASS
{
static HWND,HDC,HBM,OBM,GRAPH,PEN,BRUSH,_tmpSTRUCTID
__New(pToken) {
Main._ERROR := False
Main.GDITOKEN := pToken
if(!Main.GDITOKEN){
_E1 := True
Main._ERROR := True
}
If (Main._ERROR){
this.setlasterror("Error in __New(" Main.GDITOKEN ") -> GDIP StartUp Failed")
Return 0
}
}
CreateBox(BoxX,BoxY,BoxW,BoxH,BoxBorderSize:=5,BoxColor:=0xAA000000)
{
if(!Main.GDITOKEN)
Main.GDITOKEN := Gdip_Startup()
g_ID=-1
Main.GUICOUNT++
g_ID := Main.GUICOUNT
Gui %g_ID%: -Caption +E0x80000 +LastFound +AlwaysOnTop +ToolWindow +OwnDialogs
Gui %g_ID%: Show, % "w" BoxW " h" BoxH " y" BoxY " x" BoxX ""
this.HWND := WinExist()
this.HDC := CreateCompatibleDC()
this.HBM := CreateDIBSection(BoxW,BoxH, this.HDC ,32)
this.OBM := SelectObject(this.HDC, this.HBM)
this.GRAPH := Gdip_GraphicsFromHDC(this.HDC)
this.PEN := Gdip_CreatePen(BoxColor,BoxBorderSize)
;Msgbox % "`nHDC: " this.HDC "`nHBM: " this.HBM "`nOBM: " this.OBM "`nGRAPH: " this.GRAPH "`nPEN: " this.PEN
Gdip_SetInterpolationMode(this.GRAPH, 7)
Gdip_SetSmoothingMode(this.GRAPH, 4)
Gdip_DrawRectangle(this.GRAPH,this.PEN,0,0,BoxW,BoxH)
if(UpdateLayeredWindow(this.HWND,this.HDC) != 0)
return this.ADDStruct(this.GRAPH,this.HWND,this.HDC ,this.HBM ,this.OBM ,g_ID,-1, this.PEN,BoxX,BoxY,BoxW,BoxH)
return 0
}
FillBox(_STRUCTID, FillColor:=0xAA000000)
{
if(!Main.GDITOKEN)
Main.GDITOKEN := Gdip_Startup()
g_ID=-1
Main.GUICOUNT++
g_ID := Main.GUICOUNT
Gui %g_ID%: -Caption +E0x80000 +LastFound +AlwaysOnTop +ToolWindow +OwnDialogs
Gui %g_ID%: Show, % "w" Main.STRUCT[ _STRUCTID ][12] " h" Main.STRUCT[ _STRUCTID ][13] " y" Main.STRUCT[ _STRUCTID ][11] " x" Main.STRUCT[ _STRUCTID ][10]
this.HWND := WinExist()
this.HDC := CreateCompatibleDC()
this.HBM := CreateDIBSection(Main.STRUCT[ _STRUCTID ][12],Main.STRUCT[ _STRUCTID ][13], this.HDC ,32)
this.OBM := SelectObject(this.HDC, this.HBM)
this.GRAPH := Gdip_GraphicsFromHDC(this.HDC)
this.BRUSH := Gdip_BrushCreateSolid(FillColor)
;Msgbox % "`nHDC: " this.HDC "`nHBM: " this.HBM "`nOBM: " this.OBM "`nGRAPH: " this.GRAPH "`nPEN: " this.PEN
Gdip_SetInterpolationMode(this.GRAPH, 7)
Gdip_SetSmoothingMode(this.GRAPH, 4)
Gdip_FillRectangle(this.GRAPH, this.BRUSH,0,0,Main.STRUCT[ _STRUCTID ][12],Main.STRUCT[ _STRUCTID ][13])
UpdateLayeredWindow(this.HWND,this.HDC,Main.STRUCT[ _STRUCTID ][10],Main.STRUCT[ _STRUCTID ][11],Main.STRUCT[ _STRUCTID ][12],Main.STRUCT[ _STRUCTID ][13])
return this.ADDStruct(this.GRAPH,this.HWND,this.HDC ,this.HBM ,this.OBM ,g_ID,this.BRUSH, this.PEN,Main.STRUCT[ _STRUCTID ][10],Main.STRUCT[ _STRUCTID ][11],Main.STRUCT[ _STRUCTID ][12],Main.STRUCT[ _STRUCTID ][13])
}
;UpdateDrawedStringEx(pText,pFont,pSize,pColor,pX,pY,pW,pH,pPos)
DrawStringEx(pText,pFont,pSize,pColor,pX,pY,pW,pH,pPos:="vCenter")
{
if(!Main.GDITOKEN)
Main.GDITOKEN := Gdip_Startup()
g_ID=-1
Main.GUICOUNT++
g_ID := Main.GUICOUNT
Gui %g_ID%: -Caption +E0x80000 +LastFound +AlwaysOnTop +ToolWindow +OwnDialogs
Gui %g_ID%: Show, % "x" pX " y" pY " w" pW " h" pH
this.HWND := WinExist()
this.HDC := CreateCompatibleDC()
this.HBM := CreateDIBSection(pW,pH, this.HDC ,32)
this.OBM := SelectObject(this.HDC, this.HBM)
this.GRAPH := Gdip_GraphicsFromHDC(this.HDC)
Gdip_SetInterpolationMode(this.GRAPH, 7)
Gdip_SetSmoothingMode(this.GRAPH, 4)
Gdip_TextToGraphics(this.GRAPH, pText, "x" pX " y" pY " w" pW " h" pH " c" pColor " s" pSize " " pPos, pFont, pW,pH)
UpdateLayeredWindow(this.HWND,this.HDC,pX,pY,pW,pH)
return this.ADDStruct(this.GRAPH,this.HWND,this.HDC ,this.HBM ,this.OBM ,g_ID,-1, -1,pX,pY,pW,pH)
}
;SetString(_STRUCTID,Text_To_Set, Font, Size, Color)
;UpdateString(_STRUCTID,Text_To_Set, Font, Size, Color)
ADDStruct(pGraph,phwnd,pHDC,pHBM,pOBM,pgID,pBrush,pPen,_X,_Y,_W,_H)
{
this._tmpSTRUCTID := -1
if(Main.STRUCT.MaxIndex() == ""){
Main.STRUCT.Push([ 1 , pGraph , phwnd , pHDC , pHBM , pOBM , pBrush , pPen , pgID, _X , _Y , _W , _H ])
this._tmpSTRUCTID:= 1
return this._tmpSTRUCTID
}
Loop
{
if(Main.STRUCT[ A_Index ][1] == ""){
Main.STRUCT.Push([ A_Index , pGraph , phwnd , pHDC , pHBM , pOBM , pBrush , pPen , pgID, _X , _Y , _W , _H ])
this._tmpSTRUCTID:= A_Index
break
}
if(A_Index >= 1000)
break
}
if(this._tmpSTRUCTID != -1)
return this._tmpSTRUCTID
else
return this.setlasterror("Fehler: Keine Freie Strukturen ID gefunden | MaxSize(" Main.STRUCT.MaxIndex() ")")
}
RemoveID(pID)
{
While(A_Index <= Main.STRUCT.MaxIndex())
{
if(Main.STRUCT[ A_Index ][1] == pID)
{
if(Main.STRUCT[ A_Index ][7] != -1)
Gdip_DeleteBrush(Main.STRUCT[ A_Index ][7])
if(Main.STRUCT[ A_Index ][8] != -1)
Gdip_DeletePen(Main.STRUCT[ A_Index ][8])
SelectObject(Main.STRUCT[ A_Index ][4], Main.STRUCT[ A_Index ][6])
DeleteObject(Main.STRUCT[ A_Index ][5])
DeleteDC(Main.STRUCT[ A_Index ][4])
Gdip_DeleteGraphics(Main.STRUCT[ A_Index ][2])
g_ID := Main.STRUCT[ A_Index ][9]
Gui, %g_ID%: Destroy
Main.GUICOUNT--
this.STRUCT.RemoveAt( A_Index )
_tempID := A_Index
Main._ERROR := False
break
}
}
return
}
INIT_STRUCT()
{
_Max:=Main.STRUCT.MaxIndex()
if(_Max){
While(A_Index <= _Max)
Main.STRUCT.RemoveAt(1)
}
Loop 99
Main.STRUCT.Push([-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1])
}
getlasterror(){
if(Main._ERROR != False){
Msgbox % Main._ERROR
this.setlasterror(False)
}
return
}
setlasterror(ERRORMSG){
Main._ERROR := ERRORMSG
return
}
}
}
Recommends AHK Studio
Re: DirectX Hook im Gui (via GDIP(?))
Hey,
Gibt es Alternativen ? Selber erstellen per Linien?
Oh vielen dank, werde mir das nochmal genauer anschauen heute, hab ja freinnnik wrote:Ich hab den Fehler gefunden.
GDIp zeichnet nicht relativ zum Bildschirm sondern relativ zu der Bitmap auf die du gerade Zeichnest.
Wenn du also ein Rechteck bei 0,0 Zeichnen lässt und es dann per UpdateLayeredWindow auf deine GUI legst wird dieses Rechteck in der linken oberen Ecke anfangen.
Du zeichnest jedoch das Rechteck und deinen Rahmen mit einem Offset, sodass sie nicht mehr genau auf deinem GUI liegen.
Vielen Dank für den Hinweisnnnik wrote: Es ist zudem Erwähnenswert, dass die Rect Struktur von Windows sehr leicht zu Fehlern führen kann wenn man nicht aufpasst.
Gibt es Alternativen ? Selber erstellen per Linien?
Das wurde bereits behoben, hatte das nur noch gelassen, da ich mich erstmal um die darstellung des Rahmens kümmern wollte ^^nnnik wrote: Und ich finde es komisch den Rahmen unter die Box zu legen.
Re: DirectX Hook im Gui (via GDIP(?))
Oh ich habs vergessen zu sagen aber was ich meinte ist in der linken, oberen Ecke der GUI.
Bei der RECT Struktur reicht es eignetlich, wenn du dir anschaust was in MSDN darüber steht.
Wenn du das nicht machst läufst du Gefahr, dass deine Ränder sich z.B. um ein Pixel verschieben und du nicht weißt wieso.
Bei der RECT Struktur reicht es eignetlich, wenn du dir anschaust was in MSDN darüber steht.
Wenn du das nicht machst läufst du Gefahr, dass deine Ränder sich z.B. um ein Pixel verschieben und du nicht weißt wieso.
Recommends AHK Studio
Re: DirectX Hook im Gui (via GDIP(?))
Vielen Dank, das werde ich berücksichtigen, lese mich da gleich reinnnnik wrote:Oh ich habs vergessen zu sagen aber was ich meinte ist in der linken, oberen Ecke der GUI.
Bei der RECT Struktur reicht es eignetlich, wenn du dir anschaust was in MSDN darüber steht.
Wenn du das nicht machst läufst du Gefahr, dass deine Ränder sich z.B. um ein Pixel verschieben und du nicht weißt wieso.
Ich habe eine Frage zur Anordnung der Gui´s,
Wie kann ich es am besten lösen, das die Gui´s eine feste Reihenfolge haben?
Hier ein Test Skript was mein Problem darstellt...
Code: Select all
#Persistent
#SingleInstance force
#include gdip_New.ahk
#NoEnv
global GUICOUNT:=1
global _GUISTRUCT:= Object()
global DEFAULTBUTTONHANDLE := "BTN_Handle"
BTN_POS := {X:25,Y:25,W:55,H:35,Size: 16}
o := new Main.GDICLASS(GDIP_Startup(),DEFAULTBUTTONHANDLE)
Box1 := o.CreateBox(15,15,250,250,0xDD000000,[True,5,0xFFD4FFFF])
Str1 := o.DrawStringEx("HIER KLICKEN","Arial",25,"FFFFFFFFF",30,70,200,30,"Centre vCentre")
BTN1 := o.CreateButton(BTN_POS.X,BTN_POS.Y,BTN_POS.W,BTN_POS.H,"BTN_Solo",0xFF000000,[True,"Solo","Arial",BTN_POS.Size,"Centre vCentre",0xFFD4FFFF])
BTN2 := o.CreateButton((BTN_POS.X:=BTN_POS.X + (BTN_POS.W+3)),BTN_POS.Y,BTN_POS.W,BTN_POS.H,"BTN_Duo",0xFF000000,[True,"Duo","Arial",BTN_POS.Size,"Centre vCentre",0xFFD4FFFF])
BTN3 := o.CreateButton((BTN_POS.X:=BTN_POS.X + (BTN_POS.W+3)),BTN_POS.Y,BTN_POS.W,BTN_POS.H,"BTN_Trio",0xFF000000,[True,"Trio","Arial",BTN_POS.Size,"Centre vCentre",0xFFD4FFFF])
BTN4 := o.CreateButton((BTN_POS.X:=BTN_POS.X + (BTN_POS.W+3)),BTN_POS.Y,BTN_POS.W,BTN_POS.H,"BTN_Squad",0xFF000000,[True,"Squad","Arial",BTN_POS.Size,"Centre vCentre",0xFFD4FFFF])
return
class Main
{
static _ERROR := False
,GDITOKEN
class GDICLASS
{
static HWND,HDC,HBM,OBM,GRAPH,PEN,BRUSH,_tmpSTRUCTID
__New(pToken) {
Main._ERROR := False
Main.GDITOKEN := pToken
if(!Main.GDITOKEN){
return this.SetLastError("Error in __New(" Main.GDITOKEN ") -> GDIP StartUp Failed")
}
}
CreateBoxOutline(BoxX,BoxY,BoxW,BoxH,pSize:=5,pColor:=0xFF000000)
{
if(!Main.GDITOKEN)
Main.GDITOKEN := Gdip_Startup()
g_ID := this.HandleGUIID("INC")
Gui %g_ID%: -Caption +E0x80000 +LastFound +AlwaysOnTop +ToolWindow +OwnDialogs
Gui %g_ID%: Show, % "w" BoxW " h" BoxH " y" BoxY " x" BoxX ""
this.HWND := WinExist()
this.HDC := CreateCompatibleDC()
this.HBM := CreateDIBSection(BoxW,BoxH, this.HDC ,32)
this.OBM := SelectObject(this.HDC, this.HBM)
this.GRAPH := Gdip_GraphicsFromHDC(this.HDC)
this.PEN := Gdip_CreatePen(pColor,pSize)
Gdip_DrawRectangle(this.GRAPH,this.PEN,0,0,BoxW,BoxH)
if(UpdateLayeredWindow(this.HWND,this.HDC) != 0)
return this.ADDStruct(this.GRAPH,this.HWND,this.HDC ,this.HBM ,this.OBM ,g_ID,-1, this.PEN,BoxX,BoxY,BoxW,BoxH,"TYP_BORDERONLY")
return this.SetLastError("GDIP ERROR: UpdateLayeredWindow() failed to Update the GUI in Func: " A_ThisFunc)
}
CreateBox(BoxX,BoxY,BoxW,BoxH,pColor:=0xAA000000,pBorder:="")
{
if(!Main.GDITOKEN)
Main.GDITOKEN := Gdip_Startup()
g_ID := this.HandleGUIID("INC")
Gui %g_ID%: -Caption +E0x80000 +LastFound +AlwaysOnTop +ToolWindow +OwnDialogs
Gui %g_ID%: Show, % "x" BoxX " y" BoxY " w" BoxW " h" BoxH
this.HWND := WinExist()
this.HDC := CreateCompatibleDC()
this.HBM := CreateDIBSection(BoxW,BoxH, this.HDC ,32)
this.OBM := SelectObject(this.HDC, this.HBM)
this.GRAPH := Gdip_GraphicsFromHDC(this.HDC)
this.BRUSH := Gdip_BrushCreateSolid(pColor)
pBorder[1] == True ? this.PEN:=Gdip_CreatePen((pBorder[3] <> "" ? pBorder[3] : 0xFF000000), (pBorder[2] <= 1 || pBorder[2] < 0 ? 2 : pBorder[2])) : ""
Gdip_FillRectangle(this.GRAPH, this.BRUSH,0,0,BoxW,BoxH)
IsObject(pBorder) && pBorder[1] == True ? Gdip_DrawRectangle(this.GRAPH,this.PEN,0,0,BoxW,BoxH) : ""
if(UpdateLayeredWindow(this.HWND,this.HDC) != 0){
bID:=this.ADDStruct(this.GRAPH,this.HWND,this.HDC ,this.HBM ,this.OBM ,g_ID,this.BRUSH, this.PEN,BoxX,BoxY,BoxW,BoxH,"TYP_FILLEDBOX")
return bID
}
return this.SetLastError("GDIP ERROR: UpdateLayeredWindow() failed to Update the GUI in Func: " A_ThisFunc)
}
CreateEditBox(BoxX,BoxY,BoxW,BoxH,pText,pColor:=0xAA000000,pBorderColor:=0xFFFFFFFF)
{
if(!Main.GDITOKEN)
Main.GDITOKEN := Gdip_Startup()
g_ID := this.HandleGUIID("INC")
Gui %g_ID%: -Caption +E0x80000 +LastFound +AlwaysOnTop +ToolWindow +OwnDialogs
Gui %g_ID%: Show, % "x" BoxX " y" BoxY " w" BoxW " h" BoxH
this.HWND := WinExist()
this.HDC := CreateCompatibleDC()
this.HBM := CreateDIBSection(BoxW,BoxH, this.HDC ,32)
this.OBM := SelectObject(this.HDC, this.HBM)
this.GRAPH := Gdip_GraphicsFromHDC(this.HDC)
this.BRUSH := Gdip_BrushCreateSolid(pColor)
Gdip_FillRectangle(this.GRAPH, this.BRUSH,0,0,BoxW,BoxH)
if(UpdateLayeredWindow(this.HWND,this.HDC) != 0){
bID:=this.ADDStruct(this.GRAPH,this.HWND,this.HDC ,this.HBM ,this.OBM ,g_ID,this.BRUSH, -1,BoxX,BoxY,BoxW,BoxH,"TYP_FILLEDBOX")
If(IsObject(pBorder) && pBorder[1] == True)
this.CreateBoxOutline(BoxX,BoxY,BoxW,BoxH,pBorder[2],pBorder[3])
return bID
}
return this.SetLastError("GDIP ERROR: UpdateLayeredWindow() failed to Update the GUI in Func: " A_ThisFunc)
}
;############################################################################################################
;BorderArray := [State,Size,Color] on Todo!
;TextArray := [State,Text,Font,Size,Pos,Color] - Done
CreateButton(pX,pY,pW,pH,pButtonName,pColor:=0xAA000000,TextArr:="")
{
Default_Values_Text := [False,"Button",Arial,10,"vCentre",0xAA000000]
if(!TextArr)
{
for _i,_v in Default_Values_Text
{
TextArr[_i] <> "" ? continue : TextArr[_i] := _v
}
this.SetLastError("Handling Error: The Text Array Parameter in the Func: " A_ThisFunc " has been setted to Default.`nParams: PosX, PosY, PosW, PosH, TextArray[State,Text,Font,Size,Pos,Color]")
}
if(!Main.GDITOKEN)
Main.GDITOKEN := Gdip_Startup()
if(!pButtonName)
return this.SetLastError("Handling Error: Insert a Label in Function: " A_ThisFunc "`nParams: PosX, PosY, PosW, PosH, Label (for response), ButtonColor, TextArray(Text,Font,Size,Color),BorderArray(UseBorder, Heigth, Color)")
g_ID := this.HandleGUIID("INC")
Gui %g_ID%: -Caption +E0x80000 +LastFound +AlwaysOnTop +ToolWindow +OwnDialogs
Gui %g_ID%: add, button, w%pW% h%pH% hwndhBTN
_F := Func(DEFAULTBUTTONHANDLE).Bind(pButtonName,(TextArr[2] <> "" ? TextArr[2] : "NONE"))
GuiControl +g, % hBTN, % _F
Gui %g_ID%: Show, % "x" pX " y" pY " w" pW " h" pH
this.HWND := WinExist()
this.HDC := CreateCompatibleDC()
this.HBM := CreateDIBSection(pW,pH, this.HDC ,32)
this.OBM := SelectObject(this.HDC, this.HBM)
this.GRAPH := Gdip_GraphicsFromHDC(this.HDC)
this.BRUSH := Gdip_BrushCreateSolid(pColor)
Gdip_FillRectangle(this.GRAPH, this.BRUSH,0,0,pW,pH)
TextArr[1] ? Gdip_TextToGraphics(this.GRAPH, TextArr[2], "c" (instr(TextArr[6],"0x") ? StrReplace(TextArr[6],"0x","") : TextArr[6]) " s" TextArr[4] " " TextArr[5], TextArr[3], pW,pH) :
if(UpdateLayeredWindow(this.HWND,this.HDC) != 0){
return this.ADDStruct(this.GRAPH,this.HWND,this.HDC ,this.HBM ,this.OBM ,g_ID,this.BRUSH, -1,pX,pY,pW,pH,"TYP_BUTTON")
}
return this.SetLastError("GDIP ERROR: UpdateLayeredWindow() failed to Update the GUI in Func: " A_ThisFunc "`nParams(" ("x" pX " y" pY " w" pW " h" pH " g" pLabel " c" pColor) ")")
}
;############################################################################################################
DrawStringEx(pText,pFont,pSize,pColor,pX,pY,pW,pH,pPos:="vCenter")
{
if(!Main.GDITOKEN)
Main.GDITOKEN := Gdip_Startup()
g_ID := this.HandleGUIID("INC")
Gui %g_ID%: -Caption +E0x80000 +LastFound +AlwaysOnTop +ToolWindow +OwnDialogs
Gui %g_ID%: Show, % "x" pX " y" pY " w" pW " h" pH
this.HWND := WinExist()
this.HDC := CreateCompatibleDC()
this.HBM := CreateDIBSection(pW,pH, this.HDC ,32)
this.OBM := SelectObject(this.HDC, this.HBM)
this.GRAPH := Gdip_GraphicsFromHDC(this.HDC)
RC := Gdip_TextToGraphics(this.GRAPH, pText, "c" pColor " s" pSize " " pPos, pFont, pW,pH)
if(UpdateLayeredWindow(this.HWND,this.HDC) != 0){
return this.ADDStruct(this.GRAPH,this.HWND,this.HDC ,this.HBM ,this.OBM ,g_ID,-1, -1,pX,pY,pW,pH,pSize,pColor,pFont,pPos,"TYP_STRINGEX")
}
return this.SetLastError("GDIP ERROR: UpdateLayeredWindow() failed to Update the GUI in Func: " A_ThisFunc)
}
ADDStruct(pGraph=-1,phwnd=-1,pHDC=-1,pHBM=-1,pOBM=-1,pgID=-1,pBrush=-1,pPen=-1,_X=-1,_Y=-1,_W=-1,_H=-1,pSize=-1,pColor=-1,pFont=-1,pPos=-1,_Typ=-1)
{
this._tmpSTRUCTID := -1
if(_GUISTRUCT.MaxIndex() == ""){
_GUISTRUCT.Push([ 1 , pGraph , phwnd , pHDC , pHBM , pOBM , pBrush , pPen , pgID, _X , _Y , _W , _H , pSize , pColor , pFont , pPos , _Typ])
this._tmpSTRUCTID:= 1
return this._tmpSTRUCTID
}
Loop
{
if(_GUISTRUCT[ A_Index ][1] == "" || _GUISTRUCT[ A_Index ][1] == -1){
_GUISTRUCT.Push([ A_Index , pGraph , phwnd , pHDC , pHBM , pOBM , pBrush , pPen , pgID, _X , _Y , _W , _H , pSize , pColor , pFont , pPos , _Typ])
if(_GUISTRUCT[ A_Index ][1] != -1)
return this._tmpSTRUCTID:=A_Index
break
}
if(A_Index >= 1000)
break
}
if(this._tmpSTRUCTID != -1){
return this._tmpSTRUCTID
}else
return this.SetLastError("Fehler: Keine Freie Strukturen ID gefunden | MaxSize(" _GUISTRUCT.MaxIndex() ")")
}
RemoveID(pID)
{
While(A_Index <= _GUISTRUCT.MaxIndex())
{
if(_GUISTRUCT[ A_Index ][1] == pID)
{
if(_GUISTRUCT[ A_Index ][7] != -1)
Gdip_DeleteBrush(_GUISTRUCT[ A_Index ][7])
if(_GUISTRUCT[ A_Index ][8] != -1)
Gdip_DeletePen(_GUISTRUCT[ A_Index ][8])
SelectObject(_GUISTRUCT[ A_Index ][4], _GUISTRUCT[ A_Index ][6])
DeleteObject(_GUISTRUCT[ A_Index ][5])
DeleteDC(_GUISTRUCT[ A_Index ][4])
Gdip_DeleteGraphics(_GUISTRUCT[ A_Index ][2])
g_ID := _GUISTRUCT[ A_Index ][9]
Gui, %g_ID%: Destroy
this.HandleGUIID("DEC")
Main._ERROR := False
Loop % _GUISTRUCT[ A_Index ].MaxIndex()
_GUISTRUCT[ pID ][ A_Index ] := -1
break
}
}
return
}
GetLastError(){
if(Main._ERROR != False){
Msgbox % Main._ERROR
this.SetLastError(False)
}
return
}
SetLastError(ERRORMSG){
Main._ERROR := ERRORMSG
return
}
HandleGUIID(Typ:="INC",pVal:=0)
{
if(Typ == "INC"){
return GUICOUNT++
}else if(Typ == "DEC"){
return GUICOUNT--
}else if(Typ == "GET"){
return GUICOUNT
}else if(Typ == "SET"){
return GUICOUNT:= pVal
}
return this.SetLastError("Handling ERROR: Wrong Param setted to Func: " A_ThisFunc)
}
}
}
return
BTN_Handle(ButtonName,ButtonText)
{
Msgbox % "ButtonName: " ButtonName "`nButtonText: " ButtonText
}
return
Re: DirectX Hook im Gui (via GDIP(?))
Moin,
wenn sich das Ganze dem Betrachter als ein Fenster darstellen soll, ist das Konzept, für unterschiedliche Gui-Bereiche unterschiedliche Top-Level-Fenster zu erstellen, gelinde gesagt suboptimal. Ich halte in diesem Fall eine Bitmap, in die alle Bestandteile des 'Gui-Fensters' nacheinander gezeichnet werden, für besser. Deine Klassenstruktur muss dafür aber massiv überarbeitet werden.
Zur Klasse an sich: Kompliment!
wenn sich das Ganze dem Betrachter als ein Fenster darstellen soll, ist das Konzept, für unterschiedliche Gui-Bereiche unterschiedliche Top-Level-Fenster zu erstellen, gelinde gesagt suboptimal. Ich halte in diesem Fall eine Bitmap, in die alle Bestandteile des 'Gui-Fensters' nacheinander gezeichnet werden, für besser. Deine Klassenstruktur muss dafür aber massiv überarbeitet werden.
Zur Klasse an sich: Kompliment!
Re: DirectX Hook im Gui (via GDIP(?))
just me wrote:Moin,
wenn sich das Ganze dem Betrachter als ein Fenster darstellen soll, ist das Konzept, für unterschiedliche Gui-Bereiche unterschiedliche Top-Level-Fenster zu erstellen, gelinde gesagt suboptimal.
Ja, ich bemerke es auch langsam...
Das werde ich denk ich in angriff nehmen, diese Version ruhen lassen und V2 mit Bitmap schreiben...just me wrote:Ich halte in diesem Fall eine Bitmap, in die alle Bestandteile des 'Gui-Fensters' nacheinander gezeichnet werden, für besser.
Deine Klassenstruktur muss dafür aber massiv überarbeitet werden.
Diese ganzen Gui´s sind auch nicht sehr performant, schon alleine beim aufbau, hatte das mal mit 100+ getestet, irgendwann bei 30-40 ca. verzögert sich schon die Darstellung ...
Dankejust me wrote:Zur Klasse an sich: Kompliment!
Who is online
Users browsing this forum: No registered users and 49 guests