Forum | | | | Jörg Sellmeyer | Hallo,
In diesem schönen Code von Uwe Pascal Niemeyer wird ein Treeview erzeugt.
Leider gelingt es mir nicht einen Rechtsklick auf ein Item auszuwerten. Der Focus hüpft immer sofort zurück auf den vorher gewählten Eintrag. Mit einem simulierten Mausklick (Danke iF) bleibt zwar der Focus aber erst ein Doppelklick mit Rechts liest das Item aus. Wie kann man also mit einem einfachen Rechtsklick die Informationen auslesen. KompilierenMarkierenSeparieren $H Windows.ph
$H messages.ph
$H CommCtrl.ph
window 50,50-600,400
usefont MS Sans Serif,15,7,0,0,0
setdialogfont 1
usermessages 16-------Fenster schließen abfangen
numwidth 6
strwidth 10
declare IcoList&,Tv&,Tv#
declare a&,b&,c&,d&
-----------------------------------------------------------------------------------ImageList
def ImageList_Create(5) !COMCTL32,ImageList_Create
def ImageList_AddIcon(2) !COMCTL32,ImageList_AddIcon
def ImageList_Destroy(1) !COMCTL32,ImageList_Destroy
def LoadIcon(2) !USER32,LoadIconA
IcoList&=ImageList_Create(16,16,1,1,0)---Parameter 1+2: Grösse der Icons
ImageList_AddIcon(IcoList&,LoadIcon(0,32512))---SystemIcons laden
ImageList_AddIcon(IcoList&,LoadIcon(0,32513))
ImageList_AddIcon(IcoList&,LoadIcon(0,32514))
ImageList_AddIcon(IcoList&,LoadIcon(0,32515))
----------------------------------------------------------------------------------Funktionen
def TvGetSelect(1) sendmessage(&(1),4362,9,0)-------TVM_GETNEXTITEM , TVIS_SELECTED
def TvInsertItem(1) sendmessage(&(1),4352,0,Tv#)----TVM_INSERTITEM
def TvGetItem(1) sendmessage(&(1),4364,0,Tv#+8)-----TVM_GETITEM
struct TV=Parent&,InsertAfter&,Mask&,Item&,State&,StateMask&,Text&,TextMax&,Ico1&,Ico2&,Children&,Data&,Text$(100)
dim Tv#,TV
clear Tv#
Tv#.Text& = Tv#+48
Tv#.TextMax&= 100
Tv&=control(SysTreeView32,,$5000002f,0,0,0,0,%hwnd,200,%Hinstance,$200)
sendmessage(Tv&,4361,0,IcoList&)---TVM_SETIMAGELIST
Tv#.Mask& =1+2+4+32---TVIF_IMAGE + TVIF_PARAM + TVIF_SELECTEDIMAGE + TVIF_TEXT
Tv#.Ico1& =0
Tv#.Ico2& =1
Tv#.Parent&=0----------oberste Ebene
Tv#.Text$ =Eintrag 1
Tv#.Data& =1111
a&=TvInsertItem(Tv&)
Tv#.Parent&=a&---------unter Eintrag 1 einordnen
Tv#.Text$=Eintrag 2
Tv#.Data& =3333
b&=TvInsertItem(Tv&)
Tv#.Parent&=b&---------unter Eintrag 2 einordnen
Tv#.Text$=Eintrag 3
Tv#.Data& =4444
TvInsertItem(Tv&)
Tv#.Ico1& =3
Tv#.Ico2& =2
Tv#.Parent&=0----------oberste Ebene
Tv#.Text$=Eintrag 4
Tv#.Data& =123
TvInsertItem(Tv&)
Tv#.Text$=Eintrag 5
Tv#.Data& =234
b&=TvInsertItem(Tv&)
Tv#.Text$=Eintrag 7
Tv#.Data& =345
TvInsertItem(Tv&)
Tv#.InsertAfter&=b&----------oberste Ebene, aber unterhalb von Eintrag 5
Tv#.Text$=Eintrag 6
Tv#.Data& =456
TvInsertItem(Tv&)
setwindowpos Tv&=250,10-300,300---Neuzeichnen wg. Baumstruktur
while 1
waitinput
case %umessage=16:break------------------Fenster schließen
locate 0,0
If GetFocus(TV&) AND (%childmessage = ~WM_LBUTTONDOWN)
Tv#.Item&=TvGetSelect(Tv&)
TvGetItem(Tv&)
print Tv#.Parent& :,Tv#.Parent&
print Tv#.Item& :,Tv#.Item&
print Linksklick Tv#.Text$ :,Tv#.Text$
print Tv#.Ico1& :,Tv#.Ico1&
print Tv#.Ico2& :,Tv#.Ico2&
print Tv#.Data& :,Tv#.Data&
ElseIf GetFocus(TV&) AND (%childmessage = ~WM_RBUTTONDOWN)
Mit MouseEvent bleibt zwar der Focus auf dem Item aber erst mit rechtem
Doppelklick füllt sich die Struktur
~Mouse_Event(~MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
~Mouse_Event(~MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
Tv#.Item&=TvGetSelect(Tv&)
TvGetItem(Tv&)
Print Rechtklick Tv#.Item$ :,Tv#.Text$
EndIf
endwhile
destroywindow(Tv&)
case IcoList&:ImageList_Destroy(IcoList&)
dispose Tv#
Gruß Jörg |
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 06.10.2006 ▲ |
| |
| | | Probier mal: KompilierenMarkierenSeparieren $H Windows.ph
$H Messages.ph
$H Commctrl.ph
Window 50,50-600,400
Usefont MS Sans Serif,15,7,0,0,0
Setdialogfont 1
Usermessages 16-------Fenster schließen abfangen
Numwidth 6
Strwidth 10
Declare Icolist&,Tv&,Tv#
Declare A&,B&,C&,D&
-----------------------------------------------------------------------------------ImageList
Def Imagelist_create(5) !COMCTL32,ImageList_Create
Def Imagelist_addicon(2) !COMCTL32,ImageList_AddIcon
Def Imagelist_destroy(1) !COMCTL32,ImageList_Destroy
Def Loadicon(2) !USER32,LoadIconA
Icolist&=Imagelist_create(16,16,1,1,0)---Parameter 1+2: Grösse der Icons
Imagelist_addicon(Icolist&,Loadicon(0,32512))---SystemIcons laden
Imagelist_addicon(Icolist&,Loadicon(0,32513))
Imagelist_addicon(Icolist&,Loadicon(0,32514))
Imagelist_addicon(Icolist&,Loadicon(0,32515))
----------------------------------------------------------------------------------Funktionen
Def Tvgetselect(1) Sendmessage(&(1),4362,9,0)-------TVM_GETNEXTITEM , TVIS_SELECTED
Def Tvinsertitem(1) Sendmessage(&(1),4352,0,Tv#)----TVM_INSERTITEM
Def Tvgetitem(1) Sendmessage(&(1),4364,0,Tv#+8)-----TVM_GETITEM
Struct Tv=Parent&,Insertafter&,Mask&,Item&,State&,Statemask&,Text&,Textmax&,Ico1&,Ico2&,Children&,Data&,Text$(100)
Dim Tv#,Tv
Clear Tv#
Tv#.Text& = Tv#+48
Tv#.Textmax&= 100
Tv&=Control(SysTreeView32,,$5000002F,0,0,0,0,%Hwnd,200,%Hinstance,$200)
Sendmessage(Tv&,4361,0,Icolist&)---TVM_SETIMAGELIST
Tv#.Mask& =1+2+4+32---TVIF_IMAGE + TVIF_PARAM + TVIF_SELECTEDIMAGE + TVIF_TEXT
Tv#.Ico1& =0
Tv#.Ico2& =1
Tv#.Parent&=0----------oberste Ebene
Tv#.Text$ =Eintrag 1
Tv#.Data& =1111
A&=Tvinsertitem(Tv&)
Tv#.Parent&=A&---------unter Eintrag 1 einordnen
Tv#.Text$=Eintrag 2
Tv#.Data& =3333
B&=Tvinsertitem(Tv&)
Tv#.Parent&=B&---------unter Eintrag 2 einordnen
Tv#.Text$=Eintrag 3
Tv#.Data& =4444
Tvinsertitem(Tv&)
Tv#.Ico1& =3
Tv#.Ico2& =2
Tv#.Parent&=0----------oberste Ebene
Tv#.Text$=Eintrag 4
Tv#.Data& =123
Tvinsertitem(Tv&)
Tv#.Text$=Eintrag 5
Tv#.Data& =234
B&=Tvinsertitem(Tv&)
Tv#.Text$=Eintrag 7
Tv#.Data& =345
Tvinsertitem(Tv&)
Tv#.Insertafter&=B&----------oberste Ebene, aber unterhalb von Eintrag 5
Tv#.Text$=Eintrag 6
Tv#.Data& =456
Tvinsertitem(Tv&)
Setwindowpos Tv&=250,10-300,300---Neuzeichnen wg. Baumstruktur
While 1
Waitinput
Case %Umessage=16:Break------------------Fenster schließen
Locate 0,0
If Getfocus(Tv&) And (%Childmessage = ~Wm_lbuttondown)
Tv#.Item&=Tvgetselect(Tv&)
Tvgetitem(Tv&)
print Tv#.Parent& :,Tv#.Parent&
print Tv#.Item& :,Tv#.Item&
Print Linksklick Tv#.Text$ :,Tv#.Text$
print Tv#.Ico1& :,Tv#.Ico1&
print Tv#.Ico2& :,Tv#.Ico2&
print Tv#.Data& :,Tv#.Data&
Elseif Getfocus(Tv&) And (%Childmessage = ~Wm_rbuttondown)
Mit MouseEvent bleibt zwar der Focus auf dem Item aber erst mit rechtem
Doppelklick füllt sich die Struktur
~Mouse_event(~Mouseeventf_leftdown, 0, 0, 0, 0)
~Mouse_event(~Mouseeventf_leftup, 0, 0, 0, 0)
dulcoiF
Tv#.Item&=Tvgetselect(Tv&)
Tvgetitem(Tv&)
Print Rechtklick Tv#.Item$ :,Tv#.Text$
Endif
Endwhile
Destroywindow(Tv&)
Case Icolist&:Imagelist_destroy(Icolist&)
Dispose Tv#
proc dulcoiF
settimer 1;waitinput;killtimer
endproc
|
| | | | |
| | Jörg Sellmeyer | Funktioniert leider auch nicht Die Auswertung erfolgt wohl über NM_TREEVIEW. Dann wird eine NMHDR-Struktur gefüllt und die sagt einem dann, ob mit Rechts geklickt wurde. Dazu wird dann aber noch eine TV_HITTESTINFO -Struktur und die Message TVM_HITTEST versendet.
Leider raucht mir bei diesen ganzen Strukturen mit entsprechenden Masken u.s.w. immer der der Kopf. So ganz blick ich da noch nicht durch.
In einem Power Basic-Forum habe ich mal diesen Code gefunden: KompilierenMarkierenSeparieren So wie ich das verstehe, simuliert er auch einen Mausklick mit Links aber dann eben diese HitTest-Geschichte... Ich hab mal noch ne Textdatei mit mehr PB-Code angehängt. Da muß ich mich noch mühsam durcharbeiten, da ich außer Profan keine Programmierkenntnisse habe. Vielleicht kann daraus jemand leichter was erkennen.
Gruß Jörg |
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 06.10.2006 ▲ |
| |
| | | Hm bei mir funktioniert mein Beispiel unter XPHome. |
| | | | |
| | Jörg Sellmeyer | Das ist ja n Ding... Bei mir funktioniert es immer erst nach dem zweiten Klick mit Rechts (XP Professional) |
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 06.10.2006 ▲ |
| |
| | | Und so? KompilierenMarkierenSeparieren $H Windows.ph
$H Messages.ph
$H Commctrl.ph
Window 50,50-600,400
Usefont MS Sans Serif,15,7,0,0,0
Setdialogfont 1
Usermessages 16-------Fenster schließen abfangen
Numwidth 6
Strwidth 10
Declare Icolist&,Tv&,Tv#
Declare A&,B&,C&,D&
-----------------------------------------------------------------------------------ImageList
Def Imagelist_create(5) !COMCTL32,ImageList_Create
Def Imagelist_addicon(2) !COMCTL32,ImageList_AddIcon
Def Imagelist_destroy(1) !COMCTL32,ImageList_Destroy
Def Loadicon(2) !USER32,LoadIconA
Icolist&=Imagelist_create(16,16,1,1,0)---Parameter 1+2: Grösse der Icons
Imagelist_addicon(Icolist&,Loadicon(0,32512))---SystemIcons laden
Imagelist_addicon(Icolist&,Loadicon(0,32513))
Imagelist_addicon(Icolist&,Loadicon(0,32514))
Imagelist_addicon(Icolist&,Loadicon(0,32515))
----------------------------------------------------------------------------------Funktionen
Def Tvgetselect(1) Sendmessage(&(1),4362,9,0)-------TVM_GETNEXTITEM , TVIS_SELECTED
Def Tvinsertitem(1) Sendmessage(&(1),4352,0,Tv#)----TVM_INSERTITEM
Def Tvgetitem(1) Sendmessage(&(1),4364,0,Tv#+8)-----TVM_GETITEM
Struct Tv=Parent&,Insertafter&,Mask&,Item&,State&,Statemask&,Text&,Textmax&,Ico1&,Ico2&,Children&,Data&,Text$(100)
Dim Tv#,Tv
Clear Tv#
Tv#.Text& = Tv#+48
Tv#.Textmax&= 100
Tv&=Control(SysTreeView32,,$5000002F,0,0,0,0,%Hwnd,200,%Hinstance,$200)
Sendmessage(Tv&,4361,0,Icolist&)---TVM_SETIMAGELIST
Tv#.Mask& =1+2+4+32---TVIF_IMAGE + TVIF_PARAM + TVIF_SELECTEDIMAGE + TVIF_TEXT
Tv#.Ico1& =0
Tv#.Ico2& =1
Tv#.Parent&=0----------oberste Ebene
Tv#.Text$ =Eintrag 1
Tv#.Data& =1111
A&=Tvinsertitem(Tv&)
Tv#.Parent&=A&---------unter Eintrag 1 einordnen
Tv#.Text$=Eintrag 2
Tv#.Data& =3333
B&=Tvinsertitem(Tv&)
Tv#.Parent&=B&---------unter Eintrag 2 einordnen
Tv#.Text$=Eintrag 3
Tv#.Data& =4444
Tvinsertitem(Tv&)
Tv#.Ico1& =3
Tv#.Ico2& =2
Tv#.Parent&=0----------oberste Ebene
Tv#.Text$=Eintrag 4
Tv#.Data& =123
Tvinsertitem(Tv&)
Tv#.Text$=Eintrag 5
Tv#.Data& =234
B&=Tvinsertitem(Tv&)
Tv#.Text$=Eintrag 7
Tv#.Data& =345
Tvinsertitem(Tv&)
Tv#.Insertafter&=B&----------oberste Ebene, aber unterhalb von Eintrag 5
Tv#.Text$=Eintrag 6
Tv#.Data& =456
Tvinsertitem(Tv&)
Setwindowpos Tv&=250,10-300,300---Neuzeichnen wg. Baumstruktur
While 1
Waitinput
Case %Umessage=16:Break------------------Fenster schließen
Locate 0,0
If Getfocus(Tv&) And (%Childmessage = ~Wm_lbuttondown)
Tv#.Item&=Tvgetselect(Tv&)
Tvgetitem(Tv&)
print Tv#.Parent& :,Tv#.Parent&
print Tv#.Item& :,Tv#.Item&
Print Linksklick Tv#.Text$ :,Tv#.Text$
print Tv#.Ico1& :,Tv#.Ico1&
print Tv#.Ico2& :,Tv#.Ico2&
print Tv#.Data& :,Tv#.Data&
endif
if Getfocus(Tv&) And (%Childmessage = ~Wm_rbuttondown)
Mit MouseEvent bleibt zwar der Focus auf dem Item aber erst mit rechtem
Doppelklick füllt sich die Struktur
~Mouse_event(~Mouseeventf_leftdown, 0, 0, 0, 0)
~Mouse_event(~Mouseeventf_leftup, 0, 0, 0, 0)
getmessage
Tv#.Item&=Tvgetselect(Tv&)
Tvgetitem(Tv&)
Print Rechtklick Tv#.Item$ :,Tv#.Text$
Endif
Endwhile
Destroywindow(Tv&)
Case Icolist&:Imagelist_destroy(Icolist&)
Dispose Tv#
|
| | | | |
| | | Nachtrag: Bitte als Prc oder Exe testen. |
| | | | |
| | Jörg Sellmeyer | Funktioniert auch erst ab dem 2. Klick - und dann wird das Editcontrol aktiviert. |
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 06.10.2006 ▲ |
| |
| | | Ich denke mal, das entspricht auch nicht deinen Vorstellungen, oder? KompilierenMarkierenSeparierenDef @GetCursorPos(1) !USER32,GetCursorPos
Def @ScreenToClient(2) !USER32,ScreenToClient
$H Windows.ph
$H Messages.ph
$H Commctrl.ph
Window 50,50-600,400
Usefont MS Sans Serif,15,7,0,0,0
Setdialogfont 1
Usermessages 16-------Fenster schließen abfangen
Numwidth 6
Strwidth 10
Declare Icolist&,Tv&,Tv#
Declare A&,B&,C&,D&
-----------------------------------------------------------------------------------ImageList
Def Imagelist_create(5) !COMCTL32,ImageList_Create
Def Imagelist_addicon(2) !COMCTL32,ImageList_AddIcon
Def Imagelist_destroy(1) !COMCTL32,ImageList_Destroy
Def Loadicon(2) !USER32,LoadIconA
Icolist&=Imagelist_create(16,16,1,1,0)---Parameter 1+2: Grösse der Icons
Imagelist_addicon(Icolist&,Loadicon(0,32512))---SystemIcons laden
Imagelist_addicon(Icolist&,Loadicon(0,32513))
Imagelist_addicon(Icolist&,Loadicon(0,32514))
Imagelist_addicon(Icolist&,Loadicon(0,32515))
----------------------------------------------------------------------------------Funktionen
Def Tvgetselect(1) Sendmessage(&(1),4362,9,0)-------TVM_GETNEXTITEM , TVIS_SELECTED
Def Tvinsertitem(1) Sendmessage(&(1),4352,0,Tv#)----TVM_INSERTITEM
Def Tvgetitem(1) Sendmessage(&(1),4364,0,Tv#+8)-----TVM_GETITEM
Struct Tv=Parent&,Insertafter&,Mask&,Item&,State&,Statemask&,Text&,Textmax&,Ico1&,Ico2&,Children&,Data&,Text$(100)
Dim Tv#,Tv
Clear Tv#
Tv#.Text& = Tv#+48
Tv#.Textmax&= 100
Tv&=Control(SysTreeView32,,$5000002F,0,0,0,0,%Hwnd,200,%Hinstance,$200)
Sendmessage(Tv&,4361,0,Icolist&)---TVM_SETIMAGELIST
Tv#.Mask& =1+2+4+32---TVIF_IMAGE + TVIF_PARAM + TVIF_SELECTEDIMAGE + TVIF_TEXT
Tv#.Ico1& =0
Tv#.Ico2& =1
Tv#.Parent&=0----------oberste Ebene
Tv#.Text$ =Eintrag 1
Tv#.Data& =1111
A&=Tvinsertitem(Tv&)
Tv#.Parent&=A&---------unter Eintrag 1 einordnen
Tv#.Text$=Eintrag 2
Tv#.Data& =3333
B&=Tvinsertitem(Tv&)
Tv#.Parent&=B&---------unter Eintrag 2 einordnen
Tv#.Text$=Eintrag 3
Tv#.Data& =4444
Tvinsertitem(Tv&)
Tv#.Ico1& =3
Tv#.Ico2& =2
Tv#.Parent&=0----------oberste Ebene
Tv#.Text$=Eintrag 4
Tv#.Data& =123
Tvinsertitem(Tv&)
Tv#.Text$=Eintrag 5
Tv#.Data& =234
B&=Tvinsertitem(Tv&)
Tv#.Text$=Eintrag 7
Tv#.Data& =345
Tvinsertitem(Tv&)
Tv#.Insertafter&=B&----------oberste Ebene, aber unterhalb von Eintrag 5
Tv#.Text$=Eintrag 6
Tv#.Data& =456
Tvinsertitem(Tv&)
Setwindowpos Tv&=250,10-300,300---Neuzeichnen wg. Baumstruktur
While 1
Waitinput
Case %Umessage=16:Break------------------Fenster schließen
Locate 0,0
If Getfocus(Tv&) And (%Childmessage = ~Wm_lbuttondown)
Tv#.Item&=Tvgetselect(Tv&)
Tvgetitem(Tv&)
print Tv#.Parent& :,Tv#.Parent&
print Tv#.Item& :,Tv#.Item&
Print Linksklick Tv#.Text$ :,Tv#.Text$
print Tv#.Ico1& :,Tv#.Ico1&
print Tv#.Ico2& :,Tv#.Ico2&
print Tv#.Data& :,Tv#.Data&
Elseif Getfocus(Tv&) And (%Childmessage = ~Wm_rbuttondown)
Mit MouseEvent bleibt zwar der Focus auf dem Item aber erst mit rechtem
Doppelklick füllt sich die Struktur
DIM H_TEST#,16
Clear H_TEST#
@GetCursorPos(H_TEST#)
@ScreenToClient(TV&,H_TEST#)
@Sendmessage(TV&,$1111,0,H_TEST#)
@Sendmessage(TV&,$110B,$9,@long(H_TEST#,12))
Dispose H_Test#
Tv#.Item&=Tvgetselect(Tv&)
Tvgetitem(Tv&)
Print Rechtklick Tv#.Item$ :,Tv#.Text$
Endif
Endwhile
Destroywindow(Tv&)
Case Icolist&:Imagelist_destroy(Icolist&)
Dispose Tv#
Hatte leider keine lauffähigen Text von dir und will hoffen, das es klappt.
Gruß
Andreas |
| | | | |
| | Jörg Sellmeyer | Super Andreas! Danke, das hat mir sehr weitergeholfen. Du hast also die Screenkoordinaten der Maus via Hittest-Message an das TV gesandt. Das war genau das, was ich gesucht habe aber wie gesagt: bei Strukturen verstehe ich oft nur Bahnhof.
Hier nochmal die Bedeutungen der Messages:
Sendmessage(Tv&,$1111,0,H_test#)~TVM_HitTest Sendmessage(Tv&,$110B,$9,@Long(H_test#,12))~TVM_SELECTITEM
A. Hötker
Hatte leider keine lauffähigen Text von dir und will hoffen, das es klappt.
Was meint er damit bloß? Was ist denn das, was ich mitgeschickt habe? Daß der Code von mir ist, habe ich ja gar nicht behauptet. Im Gegenteil: Ich hab den Autor ja extra genannt! |
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 06.10.2006 ▲ |
| |
| | | %Childmessage kennt mein Profan nicht
|
| | | | |
| | Jörg Sellmeyer | Na dann umso größeren Dank! |
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 06.10.2006 ▲ |
| |
|
AntwortenThemenoptionen | 1.281 Betrachtungen |
ThemeninformationenDieses Thema hat 3 Teilnehmer: |