men*_*raz 4 delphi clipboard winapi custom-component
这是一个后续问题.
我之前的问题:
我的问题:
TComponent没有像TWinControl这样的窗口句柄.我不想依赖外部的.
这是我的自定义组件的片段
type
TMyClipBoardListener = class(TComponent)
private
FInnerWindowHandle: HWnd;
FNextHWnd: HWnd;
//...
protected
procedure Loaded; override;
procedure WndProc(var Msg: TMessage); // <<< This is my wouldbe Window to handle messages
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
// ...
published
// ...
end;
Run Code Online (Sandbox Code Playgroud)
我的自定义组件的实现摘录
constructor TMyClipBoardListener .Create(AOwner: TComponent);
begin
inherited;
//
FInnerWindowHandle := ...; // <<< What to do here ? Should I pass it to a function/procedure I missed?
end;
destructor TMyClipBoardListener .Destroy;
begin
if not(csDesigning in ComponentState) then
begin
ChangeClipboardChain(FInnerWindowHandle, FNextHWnd);
end;
//
// <<< Are there some cleaning code related to FInnerWindowHandle to implement here or elsewhereCreates a window that implements a specified window procedure. ?
//
inherited;
end;
procedure TMyClipBoardListener.Loaded;
begin
inherited;
//
if not(csDesigning in ComponentState) then
begin
FNextHWnd:= SetClipboardViewer(FInnerWindowHandle);
end;
end;
procedure TMyClipBoardListener.WndProc(var Msg: TMessage);
begin
with Msg do
begin
// Message to handle : WM_CHANGECBCHAIN and WM_DRAWCLIPBOARD
// ...
else
Result := DefWindowProc(FInnerWindowHandle, Msg, WParam, LParam); // <<< Is this the right way to do default handling properly?
end;
end;
Run Code Online (Sandbox Code Playgroud)
我的问题:
如何为我的自定义组件获取实现嵌入式窗口过程的内部窗口?
Rob*_*edy 12
AllocateHwnd从Classes单元调用(不是表单).
FInnerWindowHandle := AllocateHwnd(WndProc);
Run Code Online (Sandbox Code Playgroud)
完成后,请致电DeallocateHwnd.