一、略析
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转换成CWND*
pCWnd=FromHandle(tmp);
pCWnd->SetWindowText("ASDFASDF");//随便改个title