如何封装一个窗口类
答案:1 悬赏:40 手机版
解决时间 2021-02-14 10:59
- 提问者网友:别再叽里呱啦
- 2021-02-14 04:52
如何封装一个窗口类
最佳答案
- 五星知识达人网友:患得患失的劫
- 2021-02-14 06:24
窗口类大概声明如下.
class cwndframe
{
public:
hwnd m_hwnd;
lresult handlemessage().
void create();
}
其实封装的关键,就是用类自己handlemessage, 替换掉窗口过程。或者说, 在窗口过程中, 能任意地调用cwndframe的函数, 这样就需要把cwndframe的this指针传递到窗口过程中去.
windows在创建窗口的时候, 允许传入一个自定义字段, 而这个字段就是我们可以利用的.
cwndframe::create()
{
m_hwnd = ::createwindowex(dwexstyle, szwindowclass, sztitle, dwstyle, x, y, cx, cy, hwndparent, hmenu, hinst, this);
//这里的最后一个参数就是我们传入的this指针.
}
这样, 在窗口过程中,
处理wm_nccreate消息时.
pthis = static_cast(lpcs->lpcreateparams);
//lparam是createstruct的指针, 其中就有我们需要的this指针.
至于为什么在处理这个消息的时候做这件事, 因为这是消息循环的开始.
然后
::setwindowlongptr(hwnd, gwlp_userdata, reinterpret_cast(pthis));
把this指针存放在窗口的一个特殊的extra位置gwlp_userdata, 这个位置部分用途就是 用来存自定义内容.
然后, 每次窗口过程启动的时候,
调用getwindowlongptr取出this指针, 然后在窗口过程中调用this->handlemessage.
如上, 这样就用窗口类自己的成员函数替换掉了窗口过程.
class cwndframe
{
public:
hwnd m_hwnd;
lresult handlemessage().
void create();
}
其实封装的关键,就是用类自己handlemessage, 替换掉窗口过程。或者说, 在窗口过程中, 能任意地调用cwndframe的函数, 这样就需要把cwndframe的this指针传递到窗口过程中去.
windows在创建窗口的时候, 允许传入一个自定义字段, 而这个字段就是我们可以利用的.
cwndframe::create()
{
m_hwnd = ::createwindowex(dwexstyle, szwindowclass, sztitle, dwstyle, x, y, cx, cy, hwndparent, hmenu, hinst, this);
//这里的最后一个参数就是我们传入的this指针.
}
这样, 在窗口过程中,
处理wm_nccreate消息时.
pthis = static_cast
//lparam是createstruct的指针, 其中就有我们需要的this指针.
至于为什么在处理这个消息的时候做这件事, 因为这是消息循环的开始.
然后
::setwindowlongptr(hwnd, gwlp_userdata, reinterpret_cast
把this指针存放在窗口的一个特殊的extra位置gwlp_userdata, 这个位置部分用途就是 用来存自定义内容.
然后, 每次窗口过程启动的时候,
调用getwindowlongptr取出this指针, 然后在窗口过程中调用this->handlemessage.
如上, 这样就用窗口类自己的成员函数替换掉了窗口过程.
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯