永发信息网

如何封装一个窗口类

答案: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. 

如上, 这样就用窗口类自己的成员函数替换掉了窗口过程.
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯