| |
|
|
Uwe ''Pascal'' Niemeier | Hi Roland!
Habe gerade festgestellt, daß sich SubClassProc nicht auf OwnerDraw-Menüs anwenden läßt, weil selbige per TrackPopupMenu -API aufgerufen werden müssen und SubClassProc dabei nicht greift (nur bei WaitInput oder dem Profan-Internen TrackMenu )
Vorschlag: Ein SubClassMode oder Ähnliches, bei dem die Proc permanent aufgerufen wird, auch wenn das Prog nicht explizit auf irgendwas wartet (also analog zur Methode mit ProcAddr ). Möglicherweise nicht ganz unproblematisch bei der Anwendung, aber: No Risk, No Fun Wäre per Sonderfälle jedenfalls nützlich.
SeeYou Pascal |
|
|
| |
|
|
|
Andreas Miethe
| Uwe Pascal Niemeier
Hi Roland! Habe gerade festgestellt, daß sich SubClassProc nicht auf OwnerDraw-Menüs anwenden läßt, weil selbige per TrackPopupMenu -API aufgerufen werden müssen und SubClassProc dabei nicht greift (nur bei WaitInput oder dem Profan-Internen TrackMenu ) Vorschlag: Ein SubClassMode oder Ähnliches, bei dem die Proc permanent aufgerufen wird, auch wenn das Prog nicht explizit auf irgendwas wartet (also analog zur Methode mit ProcAddr ). Möglicherweise nicht ganz unproblematisch bei der Anwendung, aber: No Risk, No Fun Wäre per Sonderfälle jedenfalls nützlich. SeeYou Pascal
Warum müssen die denn per TrackPopupMenu aufgerufen werden ? Das kapier ich irgendwie nicht. Ich nehme an, Du beziehst Dich hier auf Trackmenüs ? Oder auch Fenstermenüs ? |
|
|
| Gruss Andreas ________ ________ ________ ________ _ Profan 3.3 - XProfanX2 Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher Homepage : [...] | 14.02.2009 ▲ |
|
|
|
|
Uwe ''Pascal'' Niemeier | Hi Andreas!
Warum müssen die denn per TrackPopupMenu aufgerufen werden ? Ich nehme an, Du beziehst Dich hier auf Trackmenüs ?
Yepp! Und die müssen ja per API angelegt werden, um sie zu manipulieren (OwnerDraw setzen), weil das profane CreateMenu kein Handle zurückgibt. Umgekehrt bezieht sich Profans TrackMenu nur auf Menüs, die eben per Profan erzeugt wurden. Oder gibts dafür schon ne Systemvariable?
Es sei denn...(Bin ich eben erst drauf gekommen ) Wenn man kein TrackMenü anlegt und trotzdem versucht, eines aufzurufen, erscheint stattdessen das letzte Popup-Menü des Fensters, an das man ja per &hMenu drankommt.
Abgesehen davon kann es ja auch Fälle geben, in denen man SubClassing generell nutzen will, während das Programm gerade mit irgendwas beschäftigt ist (auch wenn das Timing da vielleicht etwas haarig werden potuto)
SeeYou Pascal |
|
|
| |
|
|
|
Andreas Miethe
| Uwe Pascal Niemeier
Hi Andreas!
Yepp! Und die müssen ja per API angelegt werden, um sie zu manipulieren (OwnerDraw setzen), weil das profane CreateMenu kein Handle zurückgibt. Umgekehrt bezieht sich Profans TrackMenu nur auf Menüs, die eben per Profan erzeugt wurden. Oder gibts dafür schon ne Systemvariable?
Das Beispiel zeigt, dass es auch anders geht. Ist auf die Schnelle zusammenkopiert, also noch nicht ganz ausgereift. KompilierenMarkierenSeparierenHeader-Dateien
$H windows.ph
$H messages.ph
Declare Ende&
Declare Rect1#,hIcon1&,lpmis#,Size#
Dim Rect1#,16
Dim lpmis#,24
Dim Size#,8
Declare MyItem#[3]reicht für 4 Einträge
Struct Item = Eintrag&,Icon&
Dim MyItem#[],Item
Var Text$ = Info
Var Text2$ = Beenden
MyItem#[0].Eintrag& = Addr(Text$)
MyItem#[1].Eintrag& = Addr(Text2$)
MyItem#[0].Icon& = ~LoadIcon(%hInstance,A)
MyItem#[1].Icon& = ~LoadIcon(%hInstance,Eimer)
Proc Menue
CreateMenu
AppendMenu 101, Info
~ModifyMenu(&hMenu,101,~MF_BYCOMMAND | ~MF_OWNERDRAW,101,MyItem#[0])
AppendMenu 103, Beenden
~ModifyMenu(&hMenu,103,~MF_BYCOMMAND | ~MF_OWNERDRAW,103,MyItem#[1])
Return @TrackMenu()
EndProc
Windowstyle 26 + 512
WindowTitle Test
Window 0,0-640,480
SubClass %HWnd, 1
Whilenot Ende&
Waitinput
If %MousePressed = 2Rechter Mausbutton gedrückt
Menue()
If (%MenuItem = 101)
@Messagebox(Programmiert in XProfan 11,Hinweis,64)
ElseIf (%MenuItem = 103)
Ende&=1
EndIf
Endif
Endwhile
Dispose Rect1#,lpmis#,Size#
End
SubClassProc
If SubClassMessage(%hWnd,~WM_MEASUREITEM)
lpmis# = &slParam
~GetTextExtentPoint32(%hdc,Long(Long(&slParam,20),0),Len(String$(Long(Long(&slParam,20),0),0)),Size#)
Long lpmis#,12 = Long(Size#,0)
Set(WinProc, 0)
ElseIf SubClassMessage(%hWnd,~WM_DRAWITEM)
IF Long(&slParam,16) & 1wenn selektiert
~SetTextColor(Long(&slParam,24),$FFFFFF)
~SetBkColor(Long(&slParam,24),$8000)
Else
~SetTextColor(Long(&slParam,24),0)
~SetBkColor(Long(&slParam,24),$FCFDC8)
EndIf
Rechteck für die Ausgabe ermitteln
Long Rect1#,0 = Long(&slParam,28)X
Long Rect1#,4 = Long(&slParam,32)Y
Long Rect1#,8 = Long(&slParam,36)Breite
Long Rect1#,12 =Long(&slParam,40)Höhe
Ausgabe
~ExtTextOut(Long(&slParam,24),Long(&slParam,28)+20,Long(&slParam,32),~ETO_OPAQUE,Rect1#,Long(Long(&slParam,44),0),Len(String$(Long(Long(&slParam,44),0),0)) ,0)
~DrawIconEx(Long(&slParam,24),0,Long(&slParam,32),Long(Long(&slParam,44),4),13,13,0,0,~DI_NORMAL)
Set(WinProc, 0)
EndIf
EndProc
|
|
|
| Gruss Andreas ________ ________ ________ ________ _ Profan 3.3 - XProfanX2 Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher Homepage : [...] | 14.02.2009 ▲ |
|
|
|
|
| Das funktioniert super bei mir! |
|
|
| |
|
|
|
| |
|
| |
|
|
|
Uwe ''Pascal'' Niemeier | *sichvordenkopfschlag*
Ich sag ja: Ich und die Systemvariablen... (irgendwie denke ich immer, die Biester wären konstant )
Trotzdem lasse ich meinen Vorschlag mal so stehen
@ Andreas: Leite deinen Code doch mal an HoHo weiter!
SeeYou Pascal |
|
|
| |
|
|
|
RGH | Ciao, zwischen CreateMenu und TrackMenu() hat &Menu das Handle des PopUp-Menüs!
Saluto Roland |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 14.02.2009 ▲ |
|
|
|