在窑洞里有下载,没有ts_Girds.pas文件,不过并不影响我们分析。
我周末跟了一下,已经高清楚部分结构。
画网格是由Paint虚函数来完成。大致调用如下:
DrawGridLine
DrawCells
DrawEmptyArea;
在仔细跟下去应该没有问题。
其用户交互事件主要由KeyDown和MouseDown来处理。
对于键盘事件,KeyDown经过判断后分别由KeyDownVK_Up,KeyDownVk_Down等过程来处理。
鼠标事件也大致如此。
看了一个下午,看懂了一些,也有一些看的一头雾水,如TtsDropDownForm类我就很不明白,其代码
比较简单,使用来作下拉网格的ParentForm用的。
对于这两个虚函数有一直不明白。
procedure CreateParams(var Params: TCreateParams); override;
begin
inherited CreateParams(Params);
if DropDownForm then
begin
with Params do
begin
Style := 0;
WndParent := 0;
if not (csDesigning in Owner.ComponentState) then
WndParent := TWinControl(Owner).Handle;
Style := Style or WS_POPUP;
WindowClass.Style := CS_DBLCLKS;
end;
end;
end
procedure CreateWnd; override;
begin
var
Style: Longint;
begin
inherited CreateWnd;
if DropDownForm then
begin
Style := WS_CHILD;
Windows.SetWindowLong(Handle, GWL_STYLE, Style);
//就在这里:调用SetWindowLong后窗口的Style应该是WS_Child,但当我在
//CreateParams过程如果设置Style:=WS_Child将会使DropDownForm变成
//一个子窗口(被限制在其Parent中),其实在CreateParams中只要把Style
//设为Style:=Style and not WS_Child其显示就没问题。我不明白为什么这
//两个过程作相反的动作
end;
end;
还有下面这三个消息函数,我试过将其去掉,好像也没不影响工作,他究竟有什么作用?
procedure WMWindowPosChanged(var Message: TWMWindowPosChanged); message WM_WINDOWPOSCHANGED;
procedure WMSize(var Message: TWMSize); message WM_SIZE;
procedure WMMove(var Message: TWMMove); message WM_MOVE;
以上是我的一点成果和疑问,请感兴趣的网友关注一下。谢谢!