子类化窗口在高级开发中的重要利器。受c#中NativeWindow的启发,实现了下面这样一个简单的类,来帮助更容易地对窗口实现子类化。
unit NativeWindow;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
Type TzwNativeWindow = class private m_OldWinProc:FARPROC ; m_NewWinProc:FARPROC ; m_Handle:THandle; protected procedure WndProc(var Message: TMessage); virtual; public constructor Create; destructor Destroy;override; procedure AssignHandle(WndHandle:THandle); procedure ReleaseHandle; property Handle:THandle read m_Handle; end;
implementation
{ TzwNativeWindow }
procedure TzwNativeWindow.AssignHandle(WndHandle: THandle);begin if (m_Handle<>WndHandle) then begin ReleaseHandle; end; m_Handle := WndHandle; m_NewWinProc := MakeObjectInstance (WndProc ); m_OldWinProc := pointer(GetWindowLong (m_Handle ,GWL_WNDPROC )); SetWindowLong(m_Handle , GWL_WNDPROC, LongInt(m_NewWinProc));end;
constructor TzwNativeWindow.Create;begin m_Handle := INVALID_HANDLE_VALUE; m_OldWinProc := nil; m_NewWinProc := nil;end;
destructor TzwNativeWindow.Destroy;begin ReleaseHandle; inherited;end;
procedure TzwNativeWindow.ReleaseHandle;begin if (m_Handle<>INVALID_HANDLE_VALUE) then try SetWindowLong(m_Handle,GWL_WNDPROC,LongInt(m_OldWinProc)); finally m_Handle := INVALID_HANDLE_VALUE; m_OldWinProc := nil; m_NewWinProc := nil; end;end;
procedure TzwNativeWindow.WndProc(var Message: TMessage);begin with Message do begin Result := CallWindowProc(m_OldWinProc , m_Handle , Msg, wParam, lParam); end;end;
end.