子类化窗口在高级开发中的重要利器。受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.
没有相关教程
|