Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.19;
Скачать: CL | DM;

Вниз

Координаты меню   Найти похожие ветки 

 
Wiz@rd   (2004-11-04 20:24) [0]

Как известно TrackPopupMenu показывает высплывающее меню. Внимание вопрос: Как перед показом меню узнать Rect где оно разместиться на экране?


 
Игорь Шевченко ©   (2004-11-04 21:28) [1]

GetMenuItemRect для всех элементов меню не поможет ?


 
Wiz@rd   (2004-11-04 23:41) [2]

да но это когда меню уже показано, если меню ещё нет, то возвращается 0, 0, 0, 0. Так что это неподходит


 
easy ©   (2004-11-05 13:32) [3]


> Игорь Шевченко ©   (04.11.04 21:28) [1]

туда не войдёт border

> если меню ещё нет

нет меню - нет и Rect
при WM_INITMENUPOPUP Rect TrackPopupMenu имеет размеры 100х100, по краиней мере так в 2к-ХР

> узнать Rect

можно перехватить что-то типа WM_WINDOWPOSCHANGED в оконной процедуре PopupMenu


 
clickmaker ©   (2004-11-05 14:31) [4]


> можно перехватить что-то типа WM_WINDOWPOSCHANGED в оконной
> процедуре PopupMenu

а как ее достать?


 
easy ©   (2004-11-05 14:53) [5]

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Forms, Menus;

type
 TForm1 = class(TForm)
   PopupMenu1: TPopupMenu;
   Item1: TMenuItem;
   Item2: TMenuItem;
   Item3: TMenuItem;
   Item4: TMenuItem;
   Item51: TMenuItem;
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
 private
   { Private declarations }
   FNewWndProc, FOldWndProc: Pointer;
   mHandle: hwnd;
   hHookID: HHOOK;
   procedure NewWndProc(var Message: TMessage);
   procedure DefineWndProc;
   procedure UnDefineWndProc(h: hwnd);
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

function HookCallWndProc(nCode: Integer; wParam, lParam: Longint): Longint; stdcall;
const
 MENU_CLASS = "#32768";
var
 cwps: TCWPStruct;
begin
 if (nCode = HC_ACTION) then
 begin
   CopyMemory(@cwps, Pointer(lParam), SizeOf(CWPSTRUCT));
   case cwps.message of
     WM_INITMENUPOPUP:
       begin
         with Form1 do begin
           mHandle := FindWindow(MENU_CLASS, nil);
           if (IsWindow(mHandle)) then begin
             DefineWndProc;
           end;
         end;
       end;
   end;
 end;
 Result := CallNextHookEx(WH_CALLWNDPROC, nCode, wParam, lParam);
end;

procedure TForm1.DefineWndProc;
begin
 FNewWndProc := Classes.MakeObjectInstance(NewWndProc);
 FOldWndProc := Pointer(GetWindowLong(mHandle, GWL_WNDPROC));
 SetWindowLong(mHandle, GWL_WNDPROC, Longint(FNewWndProc));
end;

procedure TForm1.NewWndProc(var Message: TMessage);
var
 r: trect;
begin
 case Message.Msg of

   WM_WINDOWPOSCHANGED: begin
       getwindowrect(mHandle, r);
       //тут лежит этот rect
       caption := "Left:" + inttostr(r.Left) +
         " Right:" + inttostr(r.Right) +
         " Top:" + inttostr(r.Top) +
         " Bottom:" + inttostr(r.Bottom);
     end;
   WM_NCDESTROY: begin
       UnDefineWndProc(mHandle);
       exit;
     end;
 end;
 Message.Result := CallWindowProc(FOldWndProc, mHandle, Message.Msg,
   Message.WParam, Message.LParam);
end;

procedure TForm1.UnDefineWndProc(h: hwnd);
begin
 SetWindowLong(h, GWL_WNDPROC, Longint(FOldWndProc));
end;

procedure TForm1.FormCreate(Sender: TObject);
var
 tpid: DWORD;
begin
 tpid := GetWindowThreadProcessId(Handle, nil);
 hHookID := SetWindowsHookEx(WH_CALLWNDPROC, HookCallWndProc, 0, tpid);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 if (hHookID <> 0) then
   UnhookWindowsHookEx(hHookID);
end;

end.


только надо-ли?

> Wiz@rd   (04.11.04 20:24) [0]

что с ректом-то потом делать?


 
Wiz@rd   (2004-11-06 12:15) [6]

Мне надо рисовать полупрозрачное меню, поэтому надо скопировать ту часть экрана, на которой оно появится, сейчас попробую ваш способ


 
easy ©   (2004-11-06 12:19) [7]

полупрозрачное меню -
http://www.codeproject.com/menu/trans_menu.asp


 
Wiz@rd   (2004-11-06 14:27) [8]

Там через win2k transparency - это не то, хотя там есть пара интересных моментов. Насчёт вашего примера - конечно это круто, но опять глюк как я и думал - если расстояние до конца экрана меньше ширины экрана, то Rect даётся неправильный, ладно бы только это - меню иногда упирается не только в экран, но и во всякие тулбары, в принципе всё норм кроме этого глюка, будем искать...



Страницы: 1 вся ветка

Текущий архив: 2004.12.19;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.026 c
4-1099409218
Vladik
2004-11-02 18:26
2004.12.19
Что тут неверно в функции API


1-1101953336
Kost
2004-12-02 05:08
2004.12.19
Как открыть файл в DOS формате?


14-1101395700
kdv
2004-11-25 18:15
2004.12.19
о Delphi 2005, если интересно


3-1101114512
Владимир С.
2004-11-22 12:08
2004.12.19
Изменение запроса - возможно ли?


1-1101965710
Анатолик
2004-12-02 08:35
2004.12.19
Господа! Кто нибудь подскажите идею, как можно генерировать