Super, danke!
OFrame.dll: Verschieb- und skalierbare Controls
-
-
-
Ein Problem habe ich noch und komme im Moment nicht weiter. Der Mauszeiger ändert sich, nach dem er überm OFrame war zum Kreuz, beim Verlassen nicht mehr zum Pfeil zurück. Erst wenn er überm Hauptfenster war. Vermutlich ist bei:
dialog&=Control("DIALOG","",$54001100,0,25,600,600,T&,0,%hinstance,$0)
der Style falsch. Hat jemand einen Tip?Code
Alles anzeigenDeclare owndll&,dialog& Declare test1& Declare x&,y&,z&,text$,rect# Dim rect#,16 Def GetSysColor(1) !"USER32","GetSysColor" Def GetCurrentObject(2) !"GDI32","GetCurrentObject" Def GetClientRect(2) !"USER32","GetClientRect" Def ATest(1) !"oframe","ATest" Def OF_SetMoveRect(5) !"oframe","OF_SetMoveRect" Def OF_SetSizeRect(5) !"oframe","OF_SetSizeRect" Def OF_SetBitmap(4) !"oframe","OF_SetBitmap" owndll&=UseDll("OFrame.dll") Cls GetSysColor(15) var T& = CREATE("TABCTRL",%HWND,"Tab1",0,1,600,600) var TAB1&=@InsertTab(T&,1,"Tab2") dialog&=Control("Static","",$54000000,0,25,600,600,T&,0,%hinstance,$0) GetClientRect(dialog&,rect#) test1&=Control("OFRAME", "", $40000001, 140, 110, 200, 40, dialog&, 0, %hInstance, $0) OF_SetBitmap(test1&,0,0,1) OF_SetSizeRect(test1&,50,50,250,250) OF_SetMoveRect(test1&,0,0,Long(rect#,8),Long(rect#,12)) var dialog1&=Control("DIALOG","",$54001100,0,25,600,600,T&,0,%hinstance,$0) CreateText(dialog1&,"zweiter TAB",10,100,100,30) Showwindow(dialog&,1) Showwindow(dialog1&,0) ShowWindow(test1&,1) While 1 WaitInput Case %key=2:Break case @TabChanged(T&): TAB_WECHSEL GetActiveTab(T&) Endwhile DestroyWindow(test&) FreeDll owndll& Dispose rect# End PROC TAB_WECHSEL Parameters T_nr% IF T_nr% = 0 Showwindow(dialog&,1) Showwindow(dialog1&,0) ELSEIF T_nr% = 1 Showwindow(dialog&,0) Showwindow(dialog1&,1) ENDIF ENDPROC
Gruß Thomas
Edit: ist behoben. Ersetzt durch:
dialog&=Control("STATIC","",$54000000,0,25,600,600,T&,0,%hinstance,$0) -
Ah, ok. Jede Eventualität kann die Dll natürlich nicht abfangen.
Bei der Transparenz war es auch mitunter ein Spagat zwischen Wollen und Nicht Möglich. -
Die oFrame.dll hilft mir aber echt weiter bei der Verwaltung der z.Z. je 40 Objekten auf z.Z. 4 Grundplänen.
Zwei Punkte würde ich noch gerne vebessern:
1. Gibt es eine undokumentierte Funktion in der dll, die das Handle des Objekts unter dem Mauszeiger übergeben kann?
2. Als Gafiklaie habe ich im Moment noch keine Lösung für das automatische Neuzeichnen.Gruß Thomas
Code
Alles anzeigen$H Windows.ph DEF Redraw(1) ~RedrawWindow(&(1),0,0,~RDW_FRAME | ~RDW_INVALIDATE | ~RDW_ALLCHILDREN | ~RDW_ERASE) Def GetCursorPos(1) !"USER32","GetCursorPos" Def WindowFromPoint(2)!"USER32","WindowFromPoint" Declare owndll&,dialog& Declare test1& Declare x&,y&,z&,text$,rect# Dim rect#,16 Def GetSysColor(1) !"USER32","GetSysColor" Def GetCurrentObject(2) !"GDI32","GetCurrentObject" Def GetClientRect(2) !"USER32","GetClientRect" Def ATest(1) !"oframe","ATest" Def OF_SetMoveRect(5) !"oframe","OF_SetMoveRect" Def OF_SetSizeRect(5) !"oframe","OF_SetSizeRect" Def OF_SetBitmap(4) !"oframe","OF_SetBitmap" owndll&=UseDll("OFrame.dll") Cls GetSysColor(15) var T& = CREATE("TABCTRL",%HWND,"Tab1",0,1,600,600) var TAB1&=@InsertTab(T&,1,"Tab2") dialog&=Control("Static","",$54000000,0,25,600,600,T&,0,%hinstance,$0) CreateText(dialog&,"Mausklick rechts für weitere Aktionen",10,40,300,30) GetClientRect(dialog&,rect#) MCls 100, 30 ,RGB(255,255,255) StartPaint -1 Set("Orientation", 0) UseFont "Arial",16,0,0,0,0 DrawText 2, 6, "Mustermann" Endpaint -1 var bmp1&=Create("hPic",0,"&MEMBMP" ) test1&=Control("OFRAME", "", $40000001, 100, 110, 100, 30, dialog&, 0, %hInstance, $0) OF_SetBitmap(test1&,bmp1&,0,1) OF_SetSizeRect(test1&,100,30,250,250) OF_SetMoveRect(test1&,0,0,Long(rect#,8),Long(rect#,12)) var dialog1&=Control("DIALOG","",$54001100,0,25,600,600,T&,0,%hinstance,$0) CreateText(dialog1&,"zweiter TAB",10,100,100,30) Showwindow(dialog&,1) Showwindow(dialog1&,0) ShowWindow(test1&,1) Declare p#,o.h& Dim p#,12 While 1 clear p# clear o.h& WaitInput Case %key=2:Break case @TabChanged(T&): TAB_WECHSEL GetActiveTab(T&) GetCursorPos(p#) o.h&=WindowFromPoint(Long(p#,0),Long(p#,4)) If (%MouseKey = 2) and (GetActiveTab(t&)=0) If o.h&=test1& MessageBox("Dieses Objekt löschen?","Ernstgemeinte Frage",292) Else MessageBox " Neues Objekt erstellen!","Information",$40040 EndIf EndIf redraw (dialog&) Endwhile DeleteObject bmp1& DestroyWindow(test&) FreeDll owndll& Dispose p# Dispose rect# End PROC TAB_WECHSEL Parameters T_nr% IF T_nr% = 0 Showwindow(dialog&,1) Showwindow(dialog1&,0) ELSEIF T_nr% = 1 Showwindow(dialog&,0) Showwindow(dialog1&,1) ENDIF ENDPROC
-
Ich nehme für Dialog den Style "$54000000", da klappt das bei Gamsav ganz gut mit dem Neuzeichnen (per Subclassing und ohne OFrame.dll). Ich hoffe das hilft die vielleicht weiter.
-
Zitat
1. Gibt es eine undokumentierte Funktion in der dll, die das Handle des Objekts unter dem Mauszeiger übergeben kann?
2. Als Gafiklaie habe ich im Moment noch keine Lösung für das automatische Neuzeichnen.Zu 1.: Nein, es gibt keine undokumentierten Funktionen.
Zu 2.: Was genau funktioniert nicht mit deinem Code? Konnte nichts feststellen. Der Mauszeiger wird immer wieder zurück gebildet zum Pfeil unter Windows 7. -
Mein Problem ist die automatische Erneuerung nach Öffnen der MessageBox, kann auch ein TrackMenu sein,von:
Wenn ich redraw (dialog&) nicht einbaue, werden alle mit Create erstellten Objekte bei mir -unter XP SP2- grau. Nach einem TAB-Wechsel, überfahren mit der Maus oder einem Fremdfenster wird alles wieder sichtbar.
Ist also im Prinzip keine Frage zur oFrame.dll .Gruß
Thomas -
Für das Neuzeichnen ist natürlich das Parentfenster verantwortlich. Die OFrames haben diese Möglichkeit nicht, da sie erst Messages erhalten, wenn der Mauszeiger über ihnen liegt.
Ein Static als Parent zu wählen ist sicher nicht die beste Möglichkeit, weil diese "von Haus aus" weniger Messages absetzen. -
Kleines Problem bei kleinen Objekten. Die kann ich unter XP SP2 nicht mehr verschieben. Frank, kannst du die "Empfindlichkeit" noch verändern?
Code
Alles anzeigenDef GetTextExtentPoint32(4) !"GDI32","GetTextExtentPoint32A" Def ReleaseDC(2) !"USER32","ReleaseDC" Def GetDC(1) !"USER32","GetDC" declare x%,y% '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Declare owndll&,pic1& Declare rect# Dim rect#,16 Def GetClientRect(2) !"USER32","GetClientRect" Def OF_SetMoveRect(5) !"oframe","OF_SetMoveRect" Def OF_SetSizeRect(5) !"oframe","OF_SetSizeRect" Def OF_SetBitmap(4) !"oframe","OF_SetBitmap" Def OF_SetText(4) !"oframe","OF_SetText" Def OF_SetIcon(5) !"oframe","OF_SetIcon" Def OF_SetStyle(6) !"oframe","OF_SetStyle" Def OF_SetGdi(6) !"oframe","OF_SetGdi" owndll&=UseDll("OFrame.dll") Window 0,0-800,600 Cls GetClientRect(%hwnd,rect#) Declare b.obj&[],b.x%[],b.x1%[],b.y%[],b.y1%[] Declare b.xn% b.xn%=1 b.x%[b.xn%]=48 b.y%[b.xn%]=20 Boot_obj "Frank", "W", 16 b.xn%=2 b.x%[b.xn%]=48 b.y%[b.xn%]=120 Boot_obj "Frank", "W", 12 While 1 WaitInput Case %key=2:Break Endwhile FreeDll owndll& Dispose rect# End Proc Boot_obj Parameters b.text$,b.lage$,Font_H% Set("CharSet", 0) UseFont "Arial",Font_H%,0,0,0,0 GetTextExtent b.text$,1 b.x1%[b.xn%] = &(0)+4 'Breite GetTextExtent b.text$,0 b.y1%[b.xn%] = &(0)+4 'Höhe If trim$(b.lage$="S") x%=b.y1%[b.xn%] b.y1%[b.xn%]=b.x1%[b.xn%] b.x1%[b.xn%]=x% endif MCls b.x1%[b.xn%], b.y1%[b.xn%] ,RGB(255,255,255) StartPaint -1 TextColor @RGB(0,0,0), -1 If trim$(b.lage$="W") Set("Orientation", 0) UseFont "Arial",Font_H%,0,0,0,0 DrawText 0, 2, b.text$ ElseIf trim$(b.lage$="S") Set("Orientation", 2700) UseFont "Arial",(16-1),0,0,0,0 DrawText b.x1%[b.xn%]-2, 0, b.text$ Endif Endpaint Set("Orientation", 0) pic1&=Create("hPic",0,"&MEMBMP" ) b.obj&[b.xn%]=Control("OFRAME", "", $40000001, b.x%[b.xn%], b.y%[b.xn%], b.x1%[b.xn%], b.y1%[b.xn%], %hWnd, 3, %hInstance, $0) OF_SetBitmap(b.obj&[b.xn%],pic1&,0,2) OF_SetStyle(b.obj&[b.xn%],1,0,0,0,0) ShowWindow(b.obj&[b.xn%],1) Endproc Proc GetTextExtent Parameters _t$,_w% declare _size#,_text#,_result&,_hdc& dim _text#,Len(_t$) + 1 dim _size#,8 String _text#,0 = _t$ _hdc& = GetDC(GetActiveWindow()) GetTextExtentPoint32(_hdc&,_text#,Len(_t$),_size#) _result& = Long(_size#,4) Case _w% : _result& = Long(_size#,0) ReleaseDC(GetActiveWindow(),_hdc&) dispose _text# dispose _size# return _result& EndProc
Gruß Thomas
-
Von der Objektgröße wird die Größe der Greifer noch abgezogen. Was übrigbleibt ist der greifbare Bereich. So ist das Konzept. Auch wenn später die Greifer unsichtbar zu schalten geworden sind. Um das zu ändern müsste ich alles ummodeln, was ich nur sehr ungerne machen würde.
Müssen deine Objekte denn so winzig sein? Ich würde eine gewisse Größe nicht unterschreiten. -
Frank, das ich dachte mir schon und begrenze die Schriftverkleinerung, bzw. gebe entsprechend mehr "Rand" hinzu. Das kleinste Objekt ist 20*20 mit 15er Vollkreis wo es noch ging.
Gruß Thomas
-
Ich schau mir meinen Programmcode aber trotzdem nochmal bei Gelegenheit näher an. Ist schon recht komplex, wenn man 'ne Zeitlang nicht damit gearbeitet hat. Vielleicht hab ich was übersehen.
-
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!