Здравствуйте. Нужно расположить компоненты сразу на рабочем столе, без вывода на форме. Причем такие вещи, как прозрачность и антиалайзинг должны остаться (средства и методы, показанные в статье http://forum.vingrad.ru/forum/topic-54390.html мне кажутся не слишком подходящими). Мне удалось заменить ParentWindow компонента на рабочий стол (получив его Handle). В результате компонент создается на рабочем столе, но помимо этого, в панели задач появляется его кнопка. А если компонент имеет переменчивую прозрачность (например, как у джинна из той статьи), то все что, должно было быть прозрачным - становится белым
Код | procedure TForm1.Button2Click(Sender: TObject); begin Button1.Parent:=nil; Button1.ParentWindow:=GetDesktopWindow; Button1.Show; end;
function GetDesktopListViewHandle: THandle; var S: string; begin Result := FindWindow('ProgMan', nil); Result := GetWindow(Result, GW_CHILD); Result := GetWindow(Result, GW_CHILD); SetLength(S, 40); GetClassName(Result, PChar(S), 39); if PChar(S) <> 'SysListView32' then Result := 0; end;
|
В общем идея я думаю ясна. Вопрос, как это нормально реализовать. Мне понравилось как это сделано тут - http://www.tmssoftware.com/site/advsmoothdock.asp?s=faq.
По-моему смысл кроется в следующих строчках исходного кода:
Код | procedure TAdvSmoothDockForm.FormHookDone; var f: TCustomForm; begin if Assigned(FDock) then begin f := GetParentForm(FDock); if Assigned(f) and f.HandleAllocated then begin if not FDock.DockOnDeskTop then SetWindowLong(f.Handle, GWL_WNDPROC, LongInt(OldWndProc)); end; end; end;
procedure TAdvSmoothDockForm.FormHookInit; var f: TCustomForm; begin if Assigned(FDock) then begin f := GetParentForm(Fdock); if not FDock.DockOnDeskTop and assigned(f) then begin { Hook parent } OldWndProc := TFarProc(GetWindowLong(f.Handle, GWL_WNDPROC)); {$IFDEF DELPHI9_LVL} NewWndProc := Classes.MakeObjectInstance(HookWndProc); {$ELSE} NewWndProc := MakeObjectInstance(HookWndProc); {$ENDIF}
SetWindowLong(f.Handle, GWL_WNDPROC, LongInt(NewWndProc)); end; end; end;
procedure TAdvSmoothDockForm.HookWndProc(var Msg: TMessage); var f: TCustomForm; begin if Assigned(Fdock) then begin f := GetParentForm(FDock); if Assigned(f) then begin Msg.Result := CallWindowProc(OldWndProc, f.Handle, Msg.Msg , Msg.wParam, Msg.lParam); case Msg.Msg of WM_ACTIVATE: begin if Fdock.Visible then PostMessage(Self.Handle, WM_USERACTIVATE, MSG.WParam, 0); end; WM_WINDOWPOSCHANGING: begin FDock.UpdateBounds := true; FDock.UpdateSize; end; WM_SIZE: begin if not FMouseEntered then begin FDock.UpdateBounds := true; Fdock.UpdateSize; FDock.Changed; end; end; end; end; end; end;
|
|