泛谈HWND和CWnd

2023-11-17

一、略析

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

泛谈HWND和CWnd 的相关文章

  • vs+opencv环境配置出现程序无法启动及提示无法打开opencv_world400d.lib问题的解决方法

    vs opencv 1配置完成但是频频出错 1问题描述 无法启动程序 系统找不到指定的文件 我的原图忘记保存 故找了一张类似问题的图片做代替描述问题 在出现上述问题之后 点击确定后 程序报错 错误如下图 2解决方法 我已按照网上教程配置环境
  • 隐藏dlg窗口方法

    单独找到任务栏设置父窗口 并不能达到隐藏窗口的效果 还是有一个对话框在任务栏中出现 0 窗口属性设置步骤2 调整对话框属性ToolWindow为true步骤3 调整对话框属性Border为None 1 设置任务栏位父窗口 CWnd task
  • 使用窗函数设计FIR滤波器

    首先 先明白几个概念 通带 阻带 过渡带 通带纹波和阻带纹波分别是什么 看下图 范围称为通带 对于允许误差而言 这个范围 称为通带纹波 同样的 对于范围则是阻带 这个范围 称为阻带纹波 中间的黑色部分是过度带 角频率称为通带边缘频率 角频率
  • VC++ 教程

    基本概念 对象 面向对象编程2 定义实体后 可以不知道此实体的功能是怎样实现的 也能使用它们 核心概念 1 数据封装 将一个数据与这个数据有关的操作集合封装在一起 形成一个能动的实体 称为对象 2 继承 在面向对象语言中 类功能支持层次机制
  • C语言编程获取PE文件DOS头

    include
  • VC++ 获取文件版本号

    源码实现 pragma comment lib Version lib typedef struct VS VERSIONINFO WORD wLength WORD wValueLength WORD wType WCHAR szKey
  • VC++6.0 IDE的工程用Code::Blocks来打开、编译、调试终极配置方案

    引子 竟然可以用Code Blocks来打开 编译 调试VC 6 0的项目 感觉很神奇 通过配置也让我们更进一步了解VC 6 0的编译器 连接器 调试器 好多兄弟问到要是能支持最新的VS2008和VS2010就好了 其实Code Block
  • 用VC++来设计ActiveX控件

    用VC 来设计ActiveX控件 周勇生 2001年07月05日 14 03 ActiveX是Microsoft提出的一组使用COM ComponentObjectModel 部件对象模型 使得软件部件在网络环境中进行交互的技术集 它与具体
  • VC6 ”add files to project“功能失效的解决方案

    在Win7系统下 安装MS2007以后 VC6 0 add files to project 功能失效了 网上的资料表明 这是与MS2007不兼容导致的 其具体解决方案如下 1 到如下网址 http download microsoft c
  • Error code of Media server (MediaPlayer内核异常码说明)

    Error code of Media server HRESULT Description 0x000D0000 The requested operation is pending completion 0 0x000D0001 The
  • Error:fatal error C1010: unexpected end of file while looking for precompiled head

    场景 在VC6 0进行编写C 代码时 创建了一个 简单的程序 s 然后编译就爆出这个错误 场景复现 创建流程 点击左上角的 文件 然后点击 新建 在左上方选择工程 然后下方选择 Win32 Console Application 在右侧填写
  • VC++6.0的兼容性问题解决方案

    VC6 0 能够在 XP 下很好的运行 无需进行额外的设置 但在 Win7 Win8 和 Win10 下 安装完成后还要修改兼容模式才可以 在Win7或Win10下使用VC6 0 对于Win7和Win10 需要将VC6 0的兼容模式修改为
  • windows上bug崩溃定位分析(Qt或者VS)

    任何情况下 都不能保证自己写的代码不会发生崩溃 崩溃不可怕 可怕的是无法定位哪里崩溃 特别是客户那边崩溃 开发者这边不崩溃 问题陷入僵局 自从有了下面这个神奇的代码 再也不怕了 以下代码亲自测试没问题 1 如果是在VC 中 那么只需要将下列
  • CT2A

    1 CString转为char char szAsciiIP 64 memcpy szAsciiIP CT2A m pEncoder gt m strIP sizeof szAsciiIP 2 详见MSDN http msdn micros
  • C++学习日记和心得(一)(新手帖,高手勿笑)

    前言 我之前三年也学过其他语言 VB pascal 都不是非常主流 但有一定程序学习的基础 没学过程序的孩子也不要伤心 只要认认真真的学习还是可以学会的 我也是刚开始学C 所以希望大家跟我一同从0开始学习C 如果对我有一些疑问和批评欢迎提出
  • #pragma data_seg共享数据使用说明

    用 pragma data seg建立一个新的数据段并定义共享数据 其具体格式为 pragma data seg shareddata HWND sharedwnd NULL 共享数据 pragma data seg 1 pragma da
  • seaborn学习笔记(二):散点图、线图

    html font family sans serif ms text size adjust 100 webkit text size adjust 100 body margin 0 article aside details figc
  • VC下MFC程序自删除(自杀)几种方法的实践与探讨

    在VC下做了个MFC的程序 想让他运行后 自动删除自己 在网上看了些资料 方法也有一些 都实践了一下 感觉对MFC的程序 使用cmd exe可能更合适一些 其他的方法也蛮好 蛮经典的 不过我感觉用在MFC程序上就不太合适了 我实践的方法有三
  • VC++实现视频压缩编码标准 MPEG-4

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家提出意见 一起讨论 需要源码的请与我联系 参考书籍 lt
  • VC++设置与取得系统音量

    MMRESULT rc 多媒体函数返回结果变量 HMIXER hMixer 混合器设备句柄 MIXERLINE mxl 音频线路标准状态信息结构体 MIXERLINECONTROLS mxlc 音频线路控制器集合信息结构体 MIXERCON

随机推荐