泛谈HWND和CWnd

一、略析

HWND:Windows系统中对所有窗口的一种标识,即窗口句柄。一个SDK概念而已,并没有实际对象操作的地址空间。它只是一个32位的无符号整型数值,代表了句柄号handle。

CWnd:MFC类库中所有窗口类的基类。MFC中所有窗口的通用操作都封装到了这个类中,如ShowWindow等等,同时也封装了窗口句柄,即m_hWnd成员。


二、如何得到窗口对象指针CWnd* pCWnd

1.窗体中,直接用this-> //this就是本窗体的窗口对象指针

2.主窗体的类对象指针:AfxGetApp()->m_pMainWnd->//AfxGetApp()->m_pMainWnd就是主窗体的窗口对象指针

3.pCWnd = GetDlgItem(ID_EDIT1);//得到特定控件的窗口对象指针


三、如何得到窗口句柄HWND Handle

1. Handle = this->m_hWnd

2. GetDlgItem(ID_EDIT1);

3. Handle = ::GetDlgItem(this, IDC_STATIC1);//得到本窗体内特定控件的句柄


四、转换

1.HWnd转换成CWnd

CWnd cwnd;

HWnd hWnd;

cwnd.Attach(hWnd);

通常一个窗口资源已经和一个CWnd类的对象相关联,而这个类对象是自己创建的,所以很容易得到指向这个类的指针。但是,若是只是创建了一个CWnd对象,可以将这个对象与窗口资源的hWnd句柄关联起来呢。

 

Static CWnd* CWnd::FromHandle(HWND hWnd);//返回值是一个暂时的CWnd对象,并且确保返回值不为空。

Static CWnd* Cwnd::FromHandlePermanent(HWND hWnd);//返回的是一个永久的对象,只有返回的CWnd在类表中存在,返回值才不为空,否则则为空。

 

2.CWnd转换成HWnd

CWnd中封装了HWnd,即成员m_hWnd;

cwnd->m_hWnd;//这样即可获取HWnd;

或者cwnd->GetSafeHwnd();//这种方式更安全

3.安全性问题

从 hWnd 转换到 CWnd * 一个可以使用的方法是 CWnd::FromHandle:

CWnd *pTempWnd = CWnd::FromHandle(hWnd); // 如果 hWnd 存在对应的 CWnd* ,则返回其指针,否则,创建一个 MFC 临时窗体并返回其指针。
注意:这个函数会返回临时窗体的指针,如果需要更安全,调用 CWnd::FromHandlePermanent ,他在不存在对应的 CWnd* 时返回 NULL。

4.实例

CWnd* mark;

mark=FindWindow(NULL,"TEST");//TEST是我的当前实例窗口的title
//从CWND*转换成HWND

HWND tmp=mark->GetSafeHwnd();     //得到它的HWND 

 

//从HWND转换成CWND*
pCWnd=FromHandle(tmp);
pCWnd->SetWindowText("ASDFASDF");//随便改个title

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子建莫敌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值