If then else matters! - I5 12600KF, Asus Tuf GT501, Gigabyte Gaming OC 16G 5080 RTX, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router
Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR
Ik maak een nieuw component gebaseerd op een TPopupmenu, of bedoel je dat niet?
If then else matters! - I5 12600KF, Asus Tuf GT501, Gigabyte Gaming OC 16G 5080 RTX, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router
PS: Trap niet in de fout die in de win32 sdk help staat over prcRect parameter
We adore chaos because we like to restore order - M.C. Escher
Een goede grap mag vrienden kosten.
HoiLordLarry schreef op 28 januari 2004 @ 20:32:
Misschien moet je de vraag als algemene winapi vraag stellen zodat de VC++ guru's ook meedenken.
Ik weet ook niet hoe het Start-menu control-technisch werkt, alhoewel je daar met Spy++ best uit zou moeten kunnen komen. Tomatoman heeft gelijk dat popupmenu's niet bedoeld zijn om te blijven staan (en dat is dan ook default behaviour), echter als je bij Office op Customize... klikt kun je ook submenu's op alle menu's oppoppen. DevExpress ExpressBars ondersteunt deze feature ook... en helaas heb ik al een tijdje de sources daar niet meer van anders kon ik het voor je opzoeken.
Wellicht dat iemand anders met een ExpressBars license even kan neuzen?
Maar het is misschien wel technisch gezien niet netjes, maar wel super handig.
Ik hoop dat er een oplossing mogelijk is
If then else matters! - I5 12600KF, Asus Tuf GT501, Gigabyte Gaming OC 16G 5080 RTX, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| <smerig>
var
pt: TPoint;
procedure TForm1.PopupMenu1Popup(Sender: TObject);
begin
GetCursorPos(pt);
end;
procedure TForm1.MenuItem1Click(Sender: TObject);
begin
PopupMenu1.Popup(pt.x, pt.y);
end;
</smerig> |
Ik heb de source code van TPopupMenu (over smerig gesproken) bekeken, maar ik heb het idee dat het sluiten een Windows(tm) ding is waar je niet zo eenvoudig tussen komt.
Aye sir!curry684 schreef op 28 januari 2004 @ 20:44:
DevExpress ExpressBars ondersteunt deze feature ook... en helaas heb ik al een tijdje de sources daar niet meer van anders kon ik het voor je opzoeken.
Wellicht dat iemand anders met een ExpressBars license even kan neuzen?
Een goede grap mag vrienden kosten.
We adore chaos because we like to restore order - M.C. Escher
Ik gebruik het namelijk niet op een form, maar vanuit de systray
If then else matters! - I5 12600KF, Asus Tuf GT501, Gigabyte Gaming OC 16G 5080 RTX, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router
Verwijderd
(Geheel bekeken vanuit een MFC standpunt overigens... voor het zelfde geld kan het niet en klets ik maar wat)
Jawel dat kan. Of het het gewenste resultaat heeft is een tweedeVerwijderd schreef op 28 januari 2004 @ 22:38:
Kan je niet op een of andere manier in delphi de messageloop onderscheppen nog voor dat een message door delphi's framework wordt afgehandeld? Op die manier kan je rechtermuisklik events zelf afvangen en je ding doen. Vervolgens gooi je ze gewoon weg zodat delphi niet meer aan het afhandelen toe komt.
(Geheel bekeken vanuit een MFC standpunt overigens... voor het zelfde geld kan het niet en klets ik maar wat)
If then else matters! - I5 12600KF, Asus Tuf GT501, Gigabyte Gaming OC 16G 5080 RTX, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router
Ze werken er onder andere met een property IsCustomizing die aangeeft of het menu op dat moment wordt aangepast en dus niet automatisch mag sluiten. Het menu kan op een heleboel manieren gesloten worden, onder andere door een menu-item aan te klikken, door een andere applicatie te activeren en door op Escape te drukken. Er zijn dus heel veel plekken waar je zou moeten ondervangen dat het popupmenu gesloten wordt.
Het lijkt me beter om de window class te subclassen. Ieder popupmenu wordt toegevoegd aan de globale variabele PopupList (class TPopupList), die je kunt vinden in de unit Menus. Je zou zoiets kunnen doen:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
| unit MijnPopupMenus; interface uses Classes, Messages, Menus; type TMijnPopupList = class(TPopupList) protected procedure WndProc(var Message: TMessage); override; end; implementation procedure TMijnPopupList.WndProc(var Message: TMessage); var i: Integer; begin case Message.Msg of { meest voorkomende messages: WM_EXITMENULOOP WM_COMMAND WM_INITMENUPOPUP WM_UNINITMENUPOPUP WM_MENUSELECT WM_CANCELMODE WM_MENUCHAR WM_MENUCOMMAND } end; inherited WndProc(Message); end; var OriginalPopupList: TPopupList; initialization { unit Menus heeft PopupList geinitialiseerd } OriginalPopupList := PopupList; PopupList := TMijnPopupList.Create; finalization PopupList.Free; PopupList := OriginalPopupList; { unit Menus zal PopupList opruimen } end. |
Een goede grap mag vrienden kosten.