| Цитата(x77 @ 12.10.2004, 18:39) | | только не совсем понятно, зачем вообще здесь таймер? |
Вот и я не понял причем здесь ширина... высота... текста(TextWidth, TextHeight) и еже с ними...
Можно и так... (При этом не забыв повесить на OnPopup обработчик PopupMenu1Popup):
| Код | TGetPMRect = class(TThread) private { Private declarations } PMDisplacement:TPoint; //Необходимое смещение PopupMenu Wnd:THandle; //хэндл текущего окна protected procedure Execute; override; end; ... procedure TGetPMRect.Execute; var bMem:Pointer; h,h1,SysShadow,PM:THandle; pID,tPID,wExStyle,wStyle:Cardinal; f:boolean; i:integer; s:string; ssRect,pmRect:TRect; SizeWinPM,SizeWinSS:TPoint; begin pID:=0; GetWindowThreadProcessId(Wnd,@pID); try GetMem(bMem,256); except bMem:=nil; end; if (bMem=nil)or(pID=0) then exit; f:=true; while ((Terminated=false)and f) do begin h1:=Wnd; repeat h:=GetWindow(h1,GW_OWNER); if h<>0 then h1:=h; until(h=0); h:=GetWindow(h1,GW_HWNDFIRST); while (h<>0) do begin tPID:=0; GetWindowThreadProcessId(h,@tpID); wExStyle:=GetWindowLong(h,GWL_EXSTYLE); wStyle:=GetWindowLong(h,GWL_STYLE); if (tpID=pID)and((wStyle and WS_VISIBLE)=WS_VISIBLE)and ((wExStyle and WS_EX_TOPMOST)=WS_EX_TOPMOST) then begin i:=GetClassName(h,bMem,255); s:=trim(Copy(PChar(bMem),0,i)); if s[1]='#' then begin PM:=h; //Дискрептор PopupMenu SysShadow:=FindWindow('SysShadow',nil); //Дискрептор тени PopupMenu tPID:=0; GetWindowThreadProcessId(Wnd,@tpID); if tpID<>pID then SysShadow:=0; ssRect:=Rect(0,0,0,0); pmRect:=Rect(0,0,0,0); if Windows.GetWindowRect(PM,pmRect) then begin f:=false; SizeWinPM:=Point(pmRect.Right-pmRect.Left,pmRect.Bottom-pmRect.Top); //Размеры PopupMenu if (SysShadow<>0)then begin Windows.GetWindowRect(SysShadow,ssRect); SizeWinSS:=Point(ssRect.Right-ssRect.Left,ssRect.Bottom-ssRect.Top); //Размеры тени PopupMenu end; {Start: Изврат :) } Sleep(500); MoveWindow(PM,pmRect.Left-SizeWinPM.X,pmRect.Top,SizeWinPM.X,SizeWinPM.Y,True); //Тень перемещается АВТОМАТОМ! :) Sleep(500); MoveWindow(PM,pmRect.Left-SizeWinPM.X,pmRect.Top-SizeWinPM.Y,SizeWinPM.X,SizeWinPM.Y,True); //Тень перемещается АВТОМАТОМ! :) Sleep(500); MoveWindow(PM,pmRect.Left,pmRect.Top-SizeWinPM.Y,SizeWinPM.X,SizeWinPM.Y,True); //Тень перемещается АВТОМАТОМ! :) Sleep(500); MoveWindow(PM,pmRect.Left,pmRect.Top,SizeWinPM.X,SizeWinPM.Y,True); //Тень перемещается АВТОМАТОМ! :) Sleep(500); i:=1; while (i<SizeWinPM.X) do begin MoveWindow(PM,pmRect.Left-i,pmRect.Top,SizeWinPM.X,SizeWinPM.Y,True); MoveWindow(SysShadow,ssRect.Left+i,ssRect.Top,SizeWinSS.X,SizeWinSS.Y,True); //Тень перемещаем апосля :) inc(i); sleep(100); end; Sleep(500); MoveWindow(PM,pmRect.Left,pmRect.Top,SizeWinPM.X,SizeWinPM.Y,True); //Тень перемещается АВТОМАТОМ! :) Sleep(500); {End: Изврат :) } //Делаем заданное смещение :) MoveWindow(PM,pmRect.Left+PMDisplacement.X,pmRect.Top+PMDisplacement.Y,SizeWinPM.X,SizeWinPM.Y,True); //Тень перемещается АВТОМАТОМ! :) end; end; end; h:=GetWindow(h,gw_hWndNext); end; end; FreeMem(bMem,256); end;
procedure TForm1.PopupMenu1Popup(Sender: TObject); var GetPMRect:TGetPMRect; begin GetPMRect:=TGetPMRect.Create(True); GetPMRect.PMDisplacement:=Point(-100,-100); GetPMRect.Wnd:=Handle; GetPMRect.FreeOnTerminate:=true; GetPMRect.Resume; end; ...
| |