现在的位置: 首页 > 综合 > 正文

娃娃鸭深入核心VCL架构剖析(李维)笔记

2013年09月06日 ⁄ 综合 ⁄ 共 5307字 ⁄ 字号 评论关闭

 

40VCL组件和窗口控件的结合

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;

 

41VCL 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;

 

 

42TButton

TButtonControl = class(TWinControl)

  private

FClicksDisabled: Boolean;

  protected

   procedure WndProc(var Message: TMessage); override;

end;

抱歉!评论已关闭.