| |
|
|
- Seite 1 - |
|
| Hör oft so etwas wie 1000 Buttonhandle in Arrays und frägt diese dann in der Hauptschleife mit mouseouver und clicked ab.
Hierzu mal ein Tip wie ich sowas erledigen würde ohne Schleife, also deutlich performanter. KompilierenMarkierenSeparieren Das Ganze lässt sich beliebig verbessern,- und auch jede mögliche Abprüfung derart integrieren. Statt einfach das Buttonhandle ins gänzlich unbenutzte h zu packen könnte man auch createbutton in eine Funktion Trash umleiten trash(createbutton(hwnd,knop+str$(i),x,y,40,10)). Funktion trash könnte eine Liste mit den Handles füllen und beim beenden des Programmes könnte man diese Liste für Destroywindows nutzen. Usw... Das wiederum mache ich u.a. im Source von okrea [...] vor. |
|
|
| |
|
|
|
| |
|
- Seite 1 - |
|
Frank Abbing | In dem Zusammenhang ist Get/SetWindowLong mit GWL_ID oder GWL_USERDATA interessant. Anhand einer dieser Speicherplätze kann jedes Control erkannt werden, ohne irgendwelche Umwege und wahrscheinlich noch schneller. Ich persönlich würde diesen Weg gehen. |
|
|
| |
|
|
|
| @Jörg: Rolf würde warscheinlich eher das hier interessieren: [...] (exe anhängig)
@Frank: Natürlich hatte ich auch an gwl_userdata gedacht. Hiermit wäre es auch möglich in/per gwl_userdata wiederum das Handle eines weiteren Controls abzuspeichern welches wiederum noch viel mehr Daten tragen könnte. (z.B. ne ListBox)
Ich hatte den Umweg gewählt da dieser auch so ein paar xprofansche Problemfälle demonstriert und zeigt das es für manche Aufgaben vlt. vorgefertigte Native (in XProfan eingebaute) Lösungen geben sollte.
Nach gwl_userdata würde das so aussehen: KompilierenMarkierenSeparieren//Version:0.0.1
{$cleq}
const maxNumObjects=1000
set(ErrorLevel,0)
lm_{;return if(getasynckeystate(1)==0,false,true);}// lm steht für leftMouse(pressed)
declare objekt.H&[maxNumObjects],
objekt.X&[maxNumObjects],
objekt.Y&[maxNumObjects],
objekt.XX&[maxNumObjects],
objekt.YY&[maxNumObjects],
objekt.T$[maxNumObjects]
windowstyle 8 | 16 | 512
cls
//decimals 0 damit das unten genutzte str$ keine Kommazahlen auswirft
decimals 0
long x,
y,
h,
i,
//hier erstellen wir die buttons mal, auch wenn Du die sicher anders erzeugst:
usefont MS Sans Serif,10,0,0,0,0
setdialogfont 1
sendmessage(hwnd,wm_setredraw,0,0)//damits controlerstellen schneller geht anzeige abschalten
for y:=0 to height(hwnd) step 15 do begin
for x:=0 to width(hwnd) step 40 do begin
//handle im Array merken - tust du ja auch
h=createstatic(hwnd,str$(i),x,y,39,14)
// hier trick 15 wir merken uns die ID auch im string und nutzen eine Helferfunktion
i+
objekt.pushID(i,h,x,y,39,14)
/* natürlich ist der Umweg über long h hier unnötig, man könnte auch direkt
objekt.pushID(i,createbutton(hwnd,knop+str$(i),x,y,40,10))
schreiben, wäre aber net so anschaulich */
end
end
sendmessage(hwnd,wm_setredraw,1,0)//nun wieder alles anzeigen und neuzeichnen
invalidateRect(hwnd,0,0)
updatewindow(hwnd)
//Hauptereignisschleife
usermessages wm_close,wm_lbuttondown,wm_keydown
do {
getmessage
select umessage//select Konstrukt damit umessage auch nur einmal geprüft wird und sich - warum auch immer - später ruhig ändern könnte ohne das wir falsch reagieren würden
caseof wm_close:break
caseof wm_lbuttondown:klickProc()// hier in der bildlich benannten Klickprog schauen wir ob ein Control verschoben werden möchte
caseof wm_keydown:keybProc()
endselect
}
end//ende
objekt.pushID(long n,h,x,y,xx,yy){
objekt.H&[n]=h
objekt.X&[n]=x
objekt.Y&[n]=y
objekt.XX&[n]=xx
objekt.YY&[n]=yy
objekt.T$[n]=BLUB von +str$(n)
setwindowlong(h,gwl_userdata,n)
}
objekt.h2ID(long h){//der rückweg über gwl_userdata
return getwindowlong(h,gwl_userdata)
}
objekt.moveTo(long item,_dx,_dy){
long h=objekt.h&[item]
objekt.x&[item]=objekt.x&[item]+_dx
objekt.y&[item]=objekt.y&[item]+_dy
setwindowpos h=objekt.x&[item],objekt.y&[item] - objekt.xx&[item],objekt.yy&[item];0
invalidaterect(h,0,0)
updatewindow(h)
}
keybProc{
//wurde eines unserer Objekte bemaust? Holen wir uns erstmal das Handle des Controls:
long h=childWindowFromPoint(hwnd,mousex,mousey)// control unter maus?
long item=objekt.h2ID(h)//hiermit haben wir jetzt in H die ArrayItemID
case item<1 : return false/*kein static geklickt?*/
case getasynckeystate(37)<0 : objekt.moveTo(item,-2,0)
case getasynckeystate(38)<0 : objekt.moveTo(item,0,-2)
case getasynckeystate(39)<0 : objekt.moveTo(item,2,0)
case getasynckeystate(40)<0 : objekt.moveTo(item,0,2)
//erstmal umessage per dulcoiF löschen - wichtig! @ Roland: umessage löschen können!
settimer 1;waitinput;killtimer
//weiter:
}
klickProc{
//erstmal umessage per dulcoiF löschen - wichtig! @ Roland: umessage löschen können!
settimer 1;waitinput;killtimer
//weiter:
//wurde eines unserer Objekte angeklickt? Holen wir uns erstmal das Handle des geklickten Controls:
long h=childWindowFromPoint(hwnd,mousex,mousey)// control unter maus?
long item=objekt.h2ID(h)//hiermit haben wir jetzt in H die ArrayItemID
case item<1 : return false/*kein static geklickt?*/
settext hwnd,objekt.t$[item]
//objekt nach vorne holen in der anzeigehirarchie
destroywindow(h)
h=createstatic(hwnd,str$(item-1),objekt.x&[item],objekt.y&[item],39,14)
objekt.h&[item]=h
setwindowlong(h,gwl_userdata,item)
//verschiebezeugs
long xd:=mousex-objekt.x&[item],yd:=mousey-objekt.y&[item]//xy differenz vom maus zu objektUrsprung merken
while lm_() {
objekt.x&[item]=(mousex-xd)
objekt.y&[item]=(mousey-yd)
setwindowpos h=objekt.x&[item],objekt.y&[item] - objekt.xx&[item],objekt.yy&[item];0
invalidaterect(h,0,0)
updatewindow(h)
}
return item
}
|
|
|
| |
|
|
|
Rolf Koch | Ich kenne das doch schon. Aussderdem ist durch die geniale Umsetzung von Andreas Miethe doch eine ansehliche Steuerung drin |
|
|
| |
|
|
| |
|
- Seite 2 - |
|
|
| Die aber schon etwas hakelig ist musste zugeben. |
|
|
| |
|
|
|
Rolf Koch | Nee iF Butterweich. ^^ Nee echt. Hackelig nur, wenn man unter Setup Am Raster ausrichten gewählt hat. Grad nochmal gekuckt. Blubbbbb wie Sahne ohne zu mucken! |
|
|
| |
|
|
|
| Ne ich meine es reagiert nicht wirklich richtig - z.B. wenn man mit der Maus einfach ein Control wegdraggen möchte. Man muss erst markieren, dann kann man bewegen/skalieren. Irgendwie ist immer ein Schritt zu viel nötig. (Hatte ich schon immer bemängelt ^^) |
|
|
| |
|
|
|
Rolf Koch | Jo überredet muss ich nochmal ran ^^ Hinweis: Gehts hier um Roc? *lol* |
|
|
| |
|
|
|
| Jetzt schon |
|
|
| |
|
|
|
GDL | Super, dann half mein Posting bei RGH doch noch wem. Wenn ich auch jetzt ein wenig dahinter kam wie es geht, in meinem Source bekomm ich es nicht auf die Reihe.
Servus Georg |
|
|
| |
|
|
|
GDL | Hi
iF sein Eingangsposting läuft bei mir unter Xprofan 11 nicht mehr. Es wird kein ausgewähltes Objekt in der Fenstertitelseite mehr angezeigt.
Mag das jemand mit Xprofan 11 mal testen.Danke.
Servus Georg |
|
|
| |
|
|
|
| Teste nochmal, die Quelltextvorschau hats verbockt wg. Umbauten. |
|
|
| |
|
|
|
GDL | |
|
| |
|
|