VC_HWND和CWND的概念以及转换
来源:互联网 发布:造价预算软件 编辑:程序博客网 时间:2024/05/21 02:35
今天在VC6.0上自己做个测试,验证下HWMD和CWND的概念
自己的理解:下面先说下HWMD的概念,我也不是很理解,应该是SDK接口的概念,并没有实际对象操作的地址空间。
它只是一个32bit的无符号整型数值,代表了句柄号handle
摘自网上的理论:
HWND是Windows系统中对所有窗口的一种标识,即窗口句柄。这是一个SDK概念。
CWnd是MFC类库中所有窗口类的基类。微软在MFC中将所有窗口的通用操作都封装到了这个类中,如:ShowWindow等等,同时它也封装了窗口句柄即m_hWnd成员。
由HWnd得到CWnd*:
CWnd wnd;
HWnd hWnd;
wnd.Attach(hWnd);
通常一个窗口资源已经和一个CWnd类的对象关联起来的,由于一般来说这个类是自己创建的,所以自然知道怎么得到指向这个类的指针。如果没有就创建一个CWnd对象,将这个对象与窗口资源的hWnd句柄关联起来。(如上边的语句)。如果用
static CWnd* CWnd::FromHandle(HWND hWnd) ;
则返回值是一个暂时的CWnd对象,并且我们确保返回值为非空,也就是hWnd是有效的。
static CWnd* CWnd::FromHandlePermanent(HWND hWnd) ;
返回的是一个永久的对象。只有在返回的CWnd在类表里已经存在是返回值为非空。
由CWnd获取HWnd就容易多了,因为它的一个成员m_hWnd就是所对应窗口的句柄。
wnd->m_hWnd。
——————————————————————————————————————————————————————————
CWnd* 和 HWND 差别很大
HWND 是 SDK 定义的类型, 是一个无确切意义的 32-bit 值,在调用 API 时用于指代窗体。
CWnd* 是一个有确切意义的指针,指向一个 MFC 窗体类 CWnd 的实例。因为 MFC 对 SDK 做了封装,大部分调用都可以用 CWnd* 作为参数,所以很容易混淆。从一个 CWnd* 获取句柄的方法是 pWnd->GetSafeHwnd(), 他比 pWnd->m_hWnd 安全,因为前者在 pWnd == NULL 的时候返回 NULL 而后者出现 access violation
从 hWnd 转换到 CWnd * 一个可以使用的方法是 CWnd::FromHandle
CWnd *pTempWnd = CWnd::FromHandle(hWnd); // 如果 hWnd 存在对应的 CWnd* ,则返回其指针,否则,创建一个 MFC 临时窗体并返回其指针。
注意这个函数会返回临时窗体的指针,如果需要更安全,调用 CWnd::FromHandlePermanent ,他在不存在对应的 CWnd* 时返回 NULL。
——————————————————————————————————————————————————————————
CWnd是MFC的窗口基类。 HWND是Windows窗口句柄。 前者是一个C++对象,后者是一个类似于指针地址的数字型对象。
CWnd可以看成是对Windows窗口操作的封装,而封装的核心就是使用Windows窗口句柄(即HWND)来操作窗口.
CWnd可以通过CWnd::GetSafeHwnd()或成员变量m_hWnd来获得该窗口对象的HWND窗口句柄。
HWND可以通过CWnd的静态函数:CWnd::FromHandle()由句柄实例化一个CWnd对象出来。
CWnd* mark1;mark1=FindWindow(NULL,"TEST");//TEST是我的当前实例窗口的title
//从CWND*转换成HWND
pCWnd=FromHandle(tmp);
pCWnd->SetWindowText("ASDFASDF");//随便改个title
- VC_HWND和CWND的概念以及转换
- HWMD和CWND的转换
- CWnd *和HWnd转换
- HWND和CWnd的关系及互相转换
- MFC的CWnd和HWND之间互相转换方法
- MFC的CWnd和HWND之间互相转换方法
- MFC的CWnd和HWND之间互相转换方法
- MFC的CWnd和HWND之间互相转换方法 .
- MFC的CWnd和HWND之间互相转换方法
- MFC的CWnd和HWND之间互相转换方法
- 删除MFC单文档默认菜单栏的两种方法 以及 区别 cwnd:oncreate() 和 cwnd:create()
- CWnd与HWND的区别以、转换以及如何获取本窗体对象
- CWND和HWND之间的关系和转换 和获取方法
- CWnd和HWND的区别
- CWnd与HWND的区别与转换
- CWnd与HWND的区别与转换
- CWnd与HWND的区别与转换
- CWnd与HWND的区别与转换
- 在Android中通过jni方式使用编译好的FFmpeg库-Android中使用FFmpeg媒体库(二)
- Linux下查看Nginx Apache MySQL的并发连接数和连接状态
- oracle用户解锁与加锁
- fedora15安装NVIDIA官方显卡驱动
- 【C++】友元类和友元函数(转)
- VC_HWND和CWND的概念以及转换
- 用C#使用HtmlParser.NET的例子。
- liunx下完全卸载oracle10G
- 一个使用FFmpeg库读取3gp视频的例子-Android中使用FFmpeg媒体库(三)
- 求两个日期的间隔天数
- 修改临时表空间
- 【转载】消息钩子函数入门篇
- s3c6410 framebuffer分析
- oracle tablespace management