窗口句柄、窗口类对象的关系

el/2024/6/13 17:45:28

HWND hwnd;//窗口句柄

CWnd wnd;//窗口类对象

窗口类对象中有一个成员是窗口句柄。

 

 窗口句柄,提供了窗口的一个标识,类似于指针的概念,每一个窗口都对应了一个窗口句柄作为其标识,通过句柄可以方便的从内存中索引到资源。窗口类的对象则是对应窗口类的一个实例化,在MFC程序中,通过子类对象访问类的函数时就不需要提供窗口句柄作为资源标识。

举例说明:

SDK编程中创建一个窗口首先要定义一个窗口句柄,然后调用API函数创建并显示窗口,此时需要向函数传递窗口句柄,具体如下:
HWND hwnd;

hwnd=::CreateWindowEx();

::ShowWindow(hwnd,SW_SHOW);

::UpdateWindow(hwnd);

利用MFC开发程序时,在CWnd类中定义了一个类型为句柄的成员变量HWND m_hWnd, 类中有函数

HWND CreateWindowEx(DWORD dwExStyle,      // extended window styleLPCTSTR lpClassName,  // registered class nameLPCTSTR lpWindowName, // window nameDWORD dwStyle,        // window styleint x,                // horizontal position of windowint y,                // vertical position of windowint nWidth,           // window widthint nHeight,          // window heightHWND hWndParent,      // handle to parent or owner windowHMENU hMenu,          // menu handle or child identifierHINSTANCE hInstance,  // handle to application instanceLPVOID lpParam        // window-creation data
);
利用MFC开发程序时,在CWnd类中定义了一个类型为句柄的成员变量HWND m_hWnd, 类中有函数其返回值为一个句柄,在函数体内部利用API函数CreateWindowEx来完成窗口的创建。将其返回值保存到m_hWnd中,在实例化一个对象CWnd wnd;

wnd.CreatEx(...);

wnd.ShowWindow(SW_SHOW);

wnd.UpdateWindow();

可见利用对象创建窗口不需要向函数传递窗口句柄资源。因为在CWnd中定义了一个成员变量m_hWnd,由它保存了这个窗口句柄,调用CreateWindowEx时把句柄保存到CWnd类中,

所以再次调用ShowWindow中就不用传递句柄。

 

这里需要声明一点此处的wnd对象并不是窗口,将窗口关闭的时候这个对象并没有销毁,仅仅是将句柄设置为NULL,对象和窗口生存周期之间没有必然联系,对象和窗口唯一联系的纽带是在类的内部有一个窗口句柄的成员变量,保存了相关窗口的句柄,所以当对象销毁的时候这个窗口是要销毁的。一般的说在执行到右大括号之前对象都是没有被销毁的,而此时若调用DestroyWindow则是销毁窗口

常用转换如下

指针->句柄:hWnd = pWnd->GetSafeHwnd();

ID->句柄:hWnd = ::GetDlgItem(hParentWnd, ID);

句柄->指针:pWnd = CWnd::FromHandle(hWnd);

ID->指针:pWnd = Cwnd::GetDlgItem();

指针->ID:ID = GetWindowLong(pWnd->GetSafeHwnd(), GWL_ID);

句柄->ID:ID = GetWindowLong(hWnd, GWL_ID);


 


http://www.ngui.cc/el/5545769.html

相关文章

OpenCV 图像清晰度评价算法(相机自动对焦)

相机的自动对焦要求相机根据拍摄环境和场景的变化,通过相机内部的微型驱动马达,自动调节相机镜头和CCD之间的距离,保证像平面正好投影到CCD的成像表面上。这时候物体的成像比较清晰,图像细节信息丰富。 相机自动对焦的过程&#…

一种新的图像清晰度评价函数

自动聚焦是机器人视觉、数字视频系统中的关键技术之--,是决定图像质量的重要因素,是获取清晰图 像的第1步。聚焦性能取决于调焦评价函数的准确性和有效性,即评价函数必须具有无偏性好、单峰性强和 较好的抗噪性能。图像模糊的本质是高频分量的损失,聚焦图像比离焦图像包含更多的…

委托事件的线程问题

事件注册方法或委托后,事件所在的线程执行注册的方法或委托,所以如果方法中有跨线程控件就需要使用invoke等处理。

图像灰度图,直方图,像素通道问题

1.图像直方图概述   直方图广泛运用于很多计算机视觉运用当中,通过标记帧与帧之间显著的边缘和颜色的统计变化,来检测视频中场景的变化。在每个兴趣点设置一个有相近特征的直方图所构成 “标签”,用以确定图像中的兴趣点。边缘、色彩、角度…

信号傅里叶变换后的实数和虚数部分理解

傅里叶(FFT、DFT、傅立叶、Fourier)傅里叶变换的结果为什么含有复数? 为什么傅里叶变换的结果含有复数成份? 看了很多关于FFT的资料,现在看到一个资料说FFT转换的结果是实部虚部,所以不理解为什么从时域转…

C++ 简单实现HTTP GET/POST 请求

HTTP(超文本传输协议)是一种客户端与服务端的传输协议,最早用于浏览器和服务器之间的通信,后来因为其使用灵活、方便等特点,广泛用于客户端与服务端的通信。文章将简单介绍HTTP协议,同时以C方式分别实现HTTP GET、POST 请求 HTTP …

C#无损高质量压缩图片实现代码

最近,项目上涉及到了图像压缩,发现原有的图像压缩功能,虽然保证了图像的大小300K以内,但是压缩后的图像看的不在清晰,并且,限定了图片的Height或者是Width。 在CSDN上看到了一个压缩算法:C#无损…

vs中c++项目的配置

首先,我们一般不会修改解决方案的属性,而是设置每个项目各自的属性. 接着上一篇文章,我们来看看我们应该怎样来设置各项目的项目属性更好: 我们以NYOJ_001项目的Debug版的设置为例: 在常规选项里,我们一…

关于opencv中Mat赋值(浅拷贝,深拷贝)原理

问题点: 有两个垫对象:mat_1和mat_2将mat_2赋值给mat_1(mat_1 mat_2)后,改变mat_1,mat_2也会被改变(这里的改变是指图像处理)。 原因: mat_1 mat_2是浅拷贝&#xff0…

c#中获取控件窗体句柄,获取窗体等的一些操作

1.Control.Handle 就是获取控件绑定到的窗口句柄。 2.control.IsHandleCreated 控件是否有与其关联的句柄 3.WinForm自定义函数FindControl实现按名称查找控件 public static Control FindControl(Control parentControl, string findCtrlName) { Control _findedCon…