Конференция "WinAPI" » Api PopupMenu [D7, WinXP]
 
  • Khim © (21.02.09 18:53) [0]
    Доброго времени суток!
    Уважаемые мастера, помогите решить проблему:
    Проблема: вызываю попменю (окно в трее), меню норм отображается, обрабатываю все клики в меню, но... меню не исчезает, если клик был на другом окне, или вне области меню. т.е. оно видно, пока на нем не нажмешь на какой нибудь пункт.

    За код прошу не пинать, пишу на Api  в первый раз.
    Заранее спс.

    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 //ïåðåðèñîâûâàò&# 252; ïðè ãîðèçîíòàëüíî&# 236; èçìåíåíèè ðàçìåðà îêíà
    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); //ðåãèñòðèðóåì êëàññ
    //******************************************************************** ********
 
Конференция "WinAPI" » Api PopupMenu [D7, WinXP]
Есть новые Нет новых   [134435   +34][b:0][p:0]