![]() |
eXeL@B —› Вопросы новичков —› APi PopupMenu |
Посл.ответ | Сообщение |
|
Создано: 20 февраля 2009 18:56 · Личное сообщение · #1 Проблема: вызываю попменю (окно в трее), меню норм отображается, обрабатываю все клики в меню, но... меню не исчезает, если клик был на другом окне, или вне области меню. т.е. оно видно, пока на нем не нажмешь на какой нибудь пункт. Var P : TPoint; I, I2, I3 : Integer; GWnd : HWnd; Buffer : Array [0..127] Of Char; TempWinStr : Array [0..127] Of String; PAC : PAnsiChar; Begin MenuClear; I := 0; GWnd := GetWindow(Wnd, gw_HWndFirst); For I2 := 0 To GWnd do Begin IF (GWnd <> Wnd) AND //ñîïñíà îêíî (IsWindowVisible(GWnd)) AND //âñå âèäèìûå (GetWindow(GWnd, gw_Owner) = 0) AND //íå äî÷åðíèå (GetWindowText(GWnd, Buffer, sizeof(Buffer)) <> 0) AND //áåç çàãîëîâêà (Buffer <> 'Program Manager')THEN //åñëè íå ìåíåäæåð çàäà÷ BEGIN GetWindowText(GWnd, Buffer, sizeof(Buffer)); CreateMenuItem (Menu, 0, Buffer, 0, I + 100, false, False); Inc (I); END; GWnd := GetWindow(GWnd, gw_hWndNext); END; I3 := 0; For I2 := 0 To 127 Do If WinStr [I2] <> '' Then Begin PAC := PChar (WinStr [I2]); GWnd := FindWindow (Nil, PAC); If (GWnd <> 0) And Not (IsWindowVisible(GWnd)) Then Begin TempWinStr [I3] := WinStr [I2]; Inc (I3); End; End Else Break; For I2 := 0 To 127 Do Begin WinStr [I2] := TempWinStr [I2]; If TempWinStr [I2] = '' Then Break; CreateMenuItem (Menu, 0, PChar (WinStr [I2]), 0, I + 100, false, True); Inc (I); TempWinStr [I2] := ''; End; CreateMenuItem (Menu, 0, '', 0, 99, True, False); CreateMenuItem (Menu, 0, 'Âûõîä', 0, 500, false, False); GetCursorPos (P); // DrawMenuBar (Menu); TrackPopUpMenu (Menu, TPM_LEFTALIGN, P.X, P.Y, 0, WND, Nil); Function CreateMenuItem (Menu, SubMenu : HMenu; Cap : PAnsiChar; _Uid, _Wid : Uint; Sep, Checked : Boolean) : Boolean; Var MII : MenuItemInfo; Begin MII.cbSize := SizeOf (MII); //âûäåëÿåì ïàìÿòü MII.fMask := //MIIM_FTYPE or MIIM_STATE or MIIM_STRING; Miim_State Or Miim_Type Or //Miim_SubMenu Or //ñóáìåíþ Miim_ID; //ócòàíàâëèâàåì ÈÄ If Not Sep Then //Åñëè íå íàäà ñåïàðàòîð, òî MII.fType := MFT_String // ïîêàçûâàåì ïðîñòî ñòðîêó Else MII.fType := MFT_Separator; //çíà÷èòü ðàçäåëèòåëü If Checked Then MII.fState := MFS_Enabled or MFS_CHECKED //ìåíþ âêëþ÷åíî Else MII.fState := MFS_Enabled; MII.wID := _Wid; //èä ìåíþ MII.hSubMenu := SubMenu; MII.dwItemData := 0; MII.dwTypeData := Cap; //còðîêà ìåíþ MII.cch := SizeOf (Cap);//ïàìÿòü äëÿ íàçâàíèÿ InsertMenuItem (Menu, _Uid, False, MII); End; Menu := CreatePopUpMenu; //Ñîçäàåì ìåíþ //çàïîëíÿåì ñòðóêòóðó TWndClassEx äëÿ ìåíþ************************************ TWCE.cbSize := SizeOf (TWCE); //îïðåäåëÿåì ðàçìåð äëÿ ñòðóêòóðû TWCE.style := CS_HREDRAW or //ïåðåðèñîâûâàòü ïðè ãîðèçîíòàëüíîì èçìåíåíèè ðàçìåðà îêíà CS_VREDRAW or //ïðè âåðòèêàëüíîì CS_DBLCLKS; //îáðàáîòàêà äâîéíîãî êëèêà, ë.êëèêà è ï.êëèêà TWCE.lpfnWndProc := @WindowProc; //óêàçàòåëü íà îêîííóþ ôóíêó TWCE.cbClsExtra := 0; //äîï áàéòû íå íàäà TWCE.cbWndExtra := 0; //äîï áàéòû íå íàäà TWCE.hInstance := HInstance; //ïðîã ìîäóëü TWCE.hbrBackground := Color_Window; //çàëèâêà TWCE.lpszMenuName := @Menu; //èìÿ ìåíþ TWCE.lpszClassName := WndClass; // TWCE.hIcon := LoadIcon (0, IDI_Application);//èêîíêà, íàõ? TWCE.hCursor := LoadCursor (0, IDc_Arrow); //êóðñîð RegisterClassEx (TWCE); //ðåãèñòðèðóåì êëàññ //******************************************************************** ******** ![]() |
![]() |
eXeL@B —› Вопросы новичков —› APi PopupMenu |