Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.038 c
1-1102006937
Delphin
2004-12-02 20:02
2004.12.19
Destroy


14-1101935717
Мирон
2004-12-02 00:15
2004.12.19
Читаю "Паттерны...". Есть вопрос.


14-1101975214
Ditrix
2004-12-02 11:13
2004.12.19
психология программра


3-1100778813
kaktus
2004-11-18 14:53
2004.12.19
Хранение и обработка данных


1-1101906743
Змей
2004-12-01 16:12
2004.12.19
colordialog





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский