DuiLib中例如我定义了一个窗口 class MainFrameWnd :public WindowImplBase 里面重写了InitWindow和Notify以及HandleMessage等函数,这些函数实在哪里调用的, MainFrameWnd* main_frame_wnd = new MainFrameWnd; main_frame_wnd->Create(nullptr, MainFrameWnd::kClassName, UI_WNDSTYLE_FRAME, 0);我只调用了Create(...)函数,并没有调用重写的虚函数
时间: 2024-04-10 20:32:05 浏览: 86
在DuiLib中,重写的虚函数如InitWindow、Notify和HandleMessage等函数是在创建窗口后自动被DuiLib框架调用的。当调用Create函数创建窗口时,DuiLib会根据窗口类的类型创建对应的窗口实例。然后,在创建窗口的过程中,DuiLib会自动调用重写的虚函数来完成一些初始化工作和消息处理。
具体的调用流程如下:
1. 调用Create函数创建窗口实例,此时会触发窗口的构造函数。
2. 在Create函数内部,会调用RegisterWindowClass函数注册窗口类。
3. 调用CreateWindowEx函数创建真实的Windows窗口,并将窗口句柄保存到窗口实例中。
4. 调用OnInitWindow函数来初始化窗口,包括设置窗口样式、加载布局等。
5. 调用Notify函数来处理窗口的通知消息,比如点击按钮、选择列表项等操作。
6. 当窗口收到消息时,会自动调用HandleMessage函数来处理消息。HandleMessage函数会根据消息类型和内容执行相应的逻辑。
所以,当你调用Create函数创建窗口时,重写的虚函数会在相应的时机被自动调用。你无需手动调用这些虚函数,DuiLib框架会负责在合适的时机去调用它们。
相关问题
DuiLib中的HandleMessage函数详细介绍
在DuiLib中,HandleMessage函数是用于处理窗口消息的关键函数。它位于CDuiControl类中,是一个虚函数,可以在派生类中进行重写,以实现自定义的消息处理逻辑。
HandleMessage函数的原型如下:
```cpp
LRESULT CDuiControl::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
```
参数解释:
- uMsg:表示收到的消息类型,比如WM_PAINT、WM_KEYDOWN等。
- wParam:表示消息的附加参数,具体含义根据消息类型而定。
- lParam:表示消息的附加参数,具体含义根据消息类型而定。
返回值:
- LRESULT:表示消息处理的结果,通常是0或者一个非零值。
在派生类中重写HandleMessage函数时,可以根据uMsg的不同值来处理不同的消息。常见的消息类型包括但不限于:
- WM_CREATE:窗口创建消息。
- WM_DESTROY:窗口销毁消息。
- WM_PAINT:绘制窗口消息。
- WM_SIZE:窗口大小改变消息。
- WM_KEYDOWN、WM_KEYUP:键盘按键消息。
- WM_MOUSEMOVE、WM_LBUTTONDOWN、WM_RBUTTONDOWN:鼠标消息等等。
重写HandleMessage函数时,可以根据具体需求进行相应的处理逻辑。例如,在WM_KEYDOWN消息中,可以判断按下的键盘按键是哪个键,并执行相应的操作。在WM_PAINT消息中,可以绘制窗口的内容。
需要注意的是,在重写HandleMessage函数时,需要调用父类的HandleMessage函数来处理未被重写的消息,以保证窗口的正常处理流程。
总之,HandleMessage函数是DuiLib中用于处理窗口消息的重要函数,通过重写该函数可以实现自定义的消息处理逻辑。
DuiLib中的notify函数用法
DuiLib是一个基于C++的UI框架,notify函数是该框架中的一个成员函数,用于向UI控件发送通知消息。该函数的用法如下:
```cpp
void CControlUI::Notify(TNotifyUI& msg);
```
其中,CControlUI是DuiLib中的一个基类,TNotifyUI是一个结构体,用于封装通知消息的相关信息。
在使用notify函数时,你需要创建一个TNotifyUI类型的对象,并设置相应的成员变量,然后将该对象作为参数传递给notify函数即可发送通知消息。
例如,假设你有一个按钮控件btn,你想向它发送一个点击事件的通知消息,可以按照以下步骤进行操作:
```cpp
// 创建一个TNotifyUI对象
TNotifyUI notify;
notify.sType = _T("click");
notify.pSender = btn; // 设置通知消息的发送者
// 发送通知消息
btn->Notify(notify);
```
在接收通知消息的地方,你需要重写相应的消息处理函数,例如在按钮控件所属的窗口类中,可以重写以下函数来处理按钮的点击事件:
```cpp
void CWindowWnd::Notify(TNotifyUI& msg)
{
if (msg.sType == _T("click") && msg.pSender == btn) {
// 处理按钮点击事件
// ...
}
}
```
这样,当按钮被点击时,DuiLib会自动调用Notify函数,将通知消息发送给窗口类的Notify函数进行处理。
请注意,具体的消息处理方式可能会因为你使用的DuiLib版本或框架的具体实现而有所差异,上述示例仅供参考,具体使用时请参考相关文档或示例程序。
阅读全文