40、VCL组件和窗口控件的结合
constructor TWinControl.Create(AOwner: TComponent); begin … FObjectInstance := Classes.MakeObjectInstance(MainWndProc); … end; function MakeObjectInstance(Method: TWndMethod): Pointer; const BlockCode: array[1..2] of Byte = ( $59, { POP ECX } $E9); { JMP StdWndProc } PageSize = 4096; var Block: PInstanceBlock; Instance: PObjectInstance; begin if InstFreeList = nil then begin Block := VirtualAlloc(nil, PageSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); Block^.Next := InstBlockList; Move(BlockCode, Block^.Code, SizeOf(BlockCode)); Block^.WndProcPtr := Pointer(CalcJmpOffset(@Block^.Code[2], @StdWndProc)); Instance := @Block^.Instances; repeat Instance^.Code := $E8; { CALL NEAR PTR Offset } Instance^.Offset := CalcJmpOffset(Instance, @Block^.Code); Instance^.Next := InstFreeList; InstFreeList := Instance; Inc(Longint(Instance), SizeOf(TObjectInstance)); until Longint(Instance) - Longint(Block) >= SizeOf(TInstanceBlock); InstBlockList := Block; end; Result := InstFreeList; Instance := InstFreeList; InstFreeList := Instance^.Next; Instance^.Method := Method; end;
type PInstanceBlock = ^TInstanceBlock; TInstanceBlock = packed record Next: PInstanceBlock; Code: array[1..2] of Byte; WndProcPtr: Pointer; Instances: array[0..InstanceCount] of TObjectInstance; end; |
41、VCL Framework的自定义消息
VCL Framework之中的自定义消息主要分成两类: ·VCL控件消息 ·VCL控件通知消息 VCL控件消息主要是映对相关的窗口消息,而VCL控件通知消息则是用来在VCL类中相互通知发生的事件的。 VCL控件消息: const CM_BASE = $B000; CM_ACTIVATE = CM_BASE + 0; CM_DEACTIVATE = CM_BASE + 1; CM_GOTFOCUS = CM_BASE + 2; CM_LOSTFOCUS = CM_BASE + 3; CM_CANCELMODE = CM_BASE + 4; CM_DIALOGKEY = CM_BASE + 5; CM_DIALOGCHAR = CM_BASE + 6; CM_FOCUSCHANGED = CM_BASE + 7; CM_PARENTFONTCHANGED = CM_BASE + 8; CM_PARENTCOLORCHANGED = CM_BASE + 9; CM_HITTEST = CM_BASE + 10; CM_VISIBLECHANGED = CM_BASE + 11; CM_ENABLEDCHANGED = CM_BASE + 12; CM_COLORCHANGED = CM_BASE + 13; CM_FONTCHANGED = CM_BASE + 14; CM_CURSORCHANGED = CM_BASE + 15; CM_CTL3DCHANGED = CM_BASE + 16; CM_PARENTCTL3DCHANGED = CM_BASE + 17; CM_TEXTCHANGED = CM_BASE + 18; CM_MOUSEENTER = CM_BASE + 19; CM_MOUSELEAVE = CM_BASE + 20; CM_MENUCHANGED = CM_BASE + 21; CM_APPKEYDOWN = CM_BASE + 22; CM_APPSYSCOMMAND = CM_BASE + 23; CM_BUTTONPRESSED = CM_BASE + 24; CM_SHOWINGCHANGED = CM_BASE + 25; CM_ENTER = CM_BASE + 26; CM_EXIT = CM_BASE + 27; CM_DESIGNHITTEST = CM_BASE + 28; CM_ICONCHANGED = CM_BASE + 29; CM_WANTSPECIALKEY = CM_BASE + 30; CM_INVOKEHELP = CM_BASE + 31; CM_WINDOWHOOK = CM_BASE + 32; CM_RELEASE = CM_BASE + 33; CM_SHOWHINTCHANGED = CM_BASE + 34; CM_PARENTSHOWHINTCHANGED = CM_BASE + 35; CM_SYSCOLORCHANGE = CM_BASE + 36; CM_WININICHANGE = CM_BASE + 37; CM_FONTCHANGE = CM_BASE + 38; CM_TIMECHANGE = CM_BASE + 39; CM_TABSTOPCHANGED = CM_BASE + 40; CM_UIACTIVATE = CM_BASE + 41; CM_UIDEACTIVATE = CM_BASE + 42; CM_DOCWINDOWACTIVATE = CM_BASE + 43; CM_CONTROLLISTCHANGE = CM_BASE + 44; CM_GETDATALINK = CM_BASE + 45; CM_CHILDKEY = CM_BASE + 46; CM_DRAG = CM_BASE + 47; CM_HINTSHOW = CM_BASE + 48; CM_DIALOGHANDLE = CM_BASE + 49; CM_ISTOOLCONTROL = CM_BASE + 50; CM_RECREATEWND = CM_BASE + 51; CM_INVALIDATE = CM_BASE + 52; CM_SYSFONTCHANGED = CM_BASE + 53; CM_CONTROLCHANGE = CM_BASE + 54; CM_CHANGED = CM_BASE + 55; CM_DOCKCLIENT = CM_BASE + 56; CM_UNDOCKCLIENT = CM_BASE + 57; CM_FLOAT = CM_BASE + 58; CM_BORDERCHANGED = CM_BASE + 59; CM_BIDIMODECHANGED = CM_BASE + 60; CM_PARENTBIDIMODECHANGED = CM_BASE + 61; CM_ALLCHILDRENFLIPPED = CM_BASE + 62; CM_ACTIONUPDATE = CM_BASE + 63; CM_ACTIONEXECUTE = CM_BASE + 64; CM_HINTSHOWPAUSE = CM_BASE + 65; CM_DOCKNOTIFICATION = CM_BASE + 66; CM_MOUSEWHEEL = CM_BASE + 67; CM_ISSHORTCUT = CM_BASE + 68; {$IFDEF LINUX} CM_RAWX11EVENT = CM_BASE + 69; {$ENDIF} VCL控件通知消息: { VCL control notification IDs }
const CN_BASE = $BC00; CN_CHARTOITEM = CN_BASE + WM_CHARTOITEM; CN_COMMAND = CN_BASE + WM_COMMAND; CN_COMPAREITEM = CN_BASE + WM_COMPAREITEM; CN_CTLCOLORBTN = CN_BASE + WM_CTLCOLORBTN; CN_CTLCOLORDLG = CN_BASE + WM_CTLCOLORDLG; CN_CTLCOLOREDIT = CN_BASE + WM_CTLCOLOREDIT; CN_CTLCOLORLISTBOX = CN_BASE + WM_CTLCOLORLISTBOX; CN_CTLCOLORMSGBOX = CN_BASE + WM_CTLCOLORMSGBOX; CN_CTLCOLORSCROLLBAR = CN_BASE + WM_CTLCOLORSCROLLBAR; CN_CTLCOLORSTATIC = CN_BASE + WM_CTLCOLORSTATIC; CN_DELETEITEM = CN_BASE + WM_DELETEITEM; CN_DRAWITEM = CN_BASE + WM_DRAWITEM; CN_HSCROLL = CN_BASE + WM_HSCROLL; CN_MEASUREITEM = CN_BASE + WM_MEASUREITEM; CN_PARENTNOTIFY = CN_BASE + WM_PARENTNOTIFY; CN_VKEYTOITEM = CN_BASE + WM_VKEYTOITEM; CN_VSCROLL = CN_BASE + WM_VSCROLL; CN_KEYDOWN = CN_BASE + WM_KEYDOWN; CN_KEYUP = CN_BASE + WM_KEYUP; CN_CHAR = CN_BASE + WM_CHAR; CN_SYSKEYDOWN = CN_BASE + WM_SYSKEYDOWN; CN_SYSCHAR = CN_BASE + WM_SYSCHAR; CN_NOTIFY = CN_BASE + WM_NOTIFY;
|
42、TButton类
TButtonControl = class(TWinControl) private FClicksDisabled: Boolean; … protected procedure WndProc(var Message: TMessage); override; … end;
|