永发信息网

如何封装一个窗口类

答案:1  悬赏:40  手机版
解决时间 2021-02-14 10:59
如何封装一个窗口类
最佳答案
窗口类大概声明如下. 
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. 

如上, 这样就用窗口类自己的成员函数替换掉了窗口过程.
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
深圳市桦林达装饰设计有限公司(揭阳分公司)地
鹏威家纺地址在什么地方,我要处理点事
捷务电脑网在什么地方
连云港伍江数码科技公司地址有知道的么?有点
word插入excel组合图后散开了(不组合了)
有没有那种音乐软件可以一直循环音乐中某一句
斜面AB倾角α=30,B点高h=2m,一物体以初速度v0
剩女年龄越大就得倒贴越多的房子和钱给剩男,
人的性格会因为一个人而改变吗?
淇滨区鹤壁哈尼罕植物养发我想知道这个在什么
路路通电器这个地址在什么地方,我要处理点事
屈臣氏蒸馏水有解毒的功效么?
有发灯饰电器商行地址在什么地方,我要处理点
我想换份工作,但是舍不得离开他们,该怎么办
大自然烧烤场在什么地方啊,我要过去处理事情
推荐资讯
花之恋鲜花(黑龙江中路夏庄街道国际工艺品城A
博罗县杨侨镇塔下办事处这个地址在什么地方,
想要I7 7700CPU和1080的显卡最低需要多少钱配
巴黎三城(永旺店)地址好找么,我有些事要过去
扶风县交警大队地址好找么,我有些事要过去
托县电厂的待遇这么样,月薪多少?
美国的卡车是不是都很干净?
H3C交换机如何接IP电话???
芜湖福祥模具科技有限公司在哪里啊,我有事要
微博动漫地址在哪,我要去那里办事
资深影迷 谁知道英雄本色里的歌曲是粤语还是
国内3D游戏做的好一点的游戏都有哪些?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?