原始翎风CLIENT8位 (5) DWinCtl单元

原始翎风CLIENT8位 DWinCtl单元
DWinCtl单元
它注册了组件,可以显示在D7的组件栏上
RegisterComponents('MirGame', [TDWinManager, TDControl, TDButton, TDGrid, TDWindow]);
组件名MirGame,里面有5个组件,

在WIL单元,也注册了组件
RegisterComponents('MirGame', [TWmImages]);

所以在 D7的组件栏上MirGame页 有TWmImages TDWinManager, TDControl, TDButton, TDGrid, TDWindow 这6个组件

 


TDWinManager = class (TComponent)

这个感觉是作为一个祖类用来,
里面没有什么属性
只有一些 方法和一个DWinList: TList;

像是对整个的dcon: TDControl 进行管理,
指定出
ModalDWindow
FocusedControl

不它没有指定,只是在构建的时候对它们指向了nil

将KeyPress,KeyDown传递给他们 ModalDWindow FocusedControl 的控件中去处理


在CLMmain中有个全局变量g_DWinMan:=TDWinManager.Create(Self)

g_DWinMan.DirectPaint (DxDraw.Surface);


TfrmMain.FormKeyDown中会将调用g_DWinMan.KeyDown ,且是优先处理
TfrmMain.FormKeyPress 调用 g_DWinMan.KeyPress
TfrmMain.DXDrawMouseMove调用 g_DWinMan.MouseMove (Shift, X, Y)
TfrmMain._DXDrawMouseDown 调用 g_DWinMan.MouseDown (Button, Shift, X, Y
TfrmMain.DXDrawDblClick 调用 g_DWinMan.DblClick (pt.X, pt.Y)
TfrmMain.DXDrawMouseUp 调用 g_DWinMan.MouseUp
TfrmMain.DXDrawClick 调用 g_DWinMan.Click (pt.X, pt.Y)

 

问题,它是管理所有的控件呢还是只对第2层的控件进行管理呢?
就是说添加到它的DWinList: TList;中去?

好吧,在FState 单元中找到了它
TFrmDlg.Initialize; 方法中
对g_DWinMan.ClearAll;
再 g_DWinMan.AddDControl (DBackground, TRUE);

也就是说它只对第一层的DBackground: TDWindow 背景板加入到了它的控制中,
g_DWinMan.AddDControl (DBackground, TRUE);


TDWindow.ShowModal: integer;
这个控件会对ModalDWindow
FocusedControl设置。

TDWindow 在FrmDlg 就是第 一层的底板DBackground 第2层的各种面板

 

 

然后是层层的将KeyDown KeyPress MouseMove 这些传递了下去。

在TfrmMain.ProcOnIdle;中,会进行绘图
g_DWinMan.DirectPaint (DxDraw.Surface);

 

在处理一个 mousedown 事件过程中调用这个方法来把全部的鼠标事件重新定向到这个元素,直到鼠标按钮被释放或者 document.releaseCapture() 被调用。

 


Parent属性
对应对象:TControl
声明:property Parent:TwinControl;
功能:属性用来指出控件的父类(容器)。控件的父类是可视的,包含了控件的窗口控件。控件在它的父类被撤消时将被自动地撤消。

TControl 中声明的 Parent 属性类似于 TComponent 中声明的 Owner 属性,因为 Parent 控件释放控件的过程就像 Owner 组件释放组件的过程。

DWinCtl
做一个各种控件类的定义,做成一个组件

其使用它组件的的FState
显示的各种面板三层结构
1 DBackground: TDWindow 背景板 所有的面板都在上面 它没有DParent 而且只有它的DBackground.Background设置为TRUE;
2 DBottom DGuildDlg DStateWindow 对话框,功能 面板 有10来个,他们的DParent 就是DBackground
3,DBelt1 DMsgDlgYes DGroupDlg 按钮,格子,小筐。他们的DParent 是放置它的第2层的对话框,功能面板。

另外,这些组件所有的Parent,没有分层,都是TFrmDlg = class(TForm)


TDControl = class (TCustomControl)
这个是个比较关键的类,所有的面板 都是继承于它的。

它里面有几个关键点
DControls: TList,一个列表,用来存放作为一个面板,上面可以存放的按钮,格子,小筐,之类的控件,其实就放在这里。

FDParent: TDControl; 放着这个控件的的容器

它定义了一些对象方法类型字段,如同整数类型的变量,整数类型的字段
作为鼠标,键盘 事件的响应,回调?
还有一个FOnDirectPaint: TOnDirectPaint; 这个大概就是要区别于自带控件的地方,用DX来绘制控件图片

当然还有一些必要的方法
构建,析构,
坐标 对于本控件,上级,屏幕坐标的转换
对于DControls: TList的操作
本控件显示图片的操作。

 

TDButton = class (TDControl)在TDControl的功能的上进行进一步的扩张

加入了声音
对鼠标 的进一步 功能加强

Downed: Boolean; 一个字段,用来标示这个控件的状态

TDGrid = class (TDControl) 增加的格子功能,用来做背包功能,已经固定了行列和格子大小。
FColCount := 8;
FRowCount := 5; 40格
FColWidth := 36;
FRowHeight:= 32;

 

在TDGrid.DirectPaint (dsurface: TDirectDrawSurface);中
对应于属性 事件 FOnGridPaint: TOnGridPaint;
TOnGridPaint
TOnGridPaint = procedure(Sender: TObject; ACol, ARow: integer; Rect: TRect; State: TGridDrawState; dsurface: TDirectDrawSurface) of object;

到了FSate中,的事件中,才有了实际的方法 实现
procedure TFrmDlg.DItemGridGridPaint(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState; dsurface: TDirectDrawSurface);


TDWindow = class (TDButton)
这个继承于TDButton的

增加了FFloating
增加了Visible

Visible
1,设置在TDControl里面的的基础FVisible

2,在本控件中进行了增加判断,
如果Floating 调整显示在最上面的 面板,意思大概是有些面板是可以移动的,像是浮动在屏幕上面
有些面板是不能移动的,比如 控制台面板 还有小地图,改变他们浮动显示的顺序,

此功能应该只对在第2层的的面板TDWindow 有效。


继承图

 


TCustomControl(VCL)- TDControl - TDButton - TDWindow
- TDGrid

 

posted @ 2023-10-31 10:14  D7mir  阅读(111)  评论(0)    收藏  举报