HWND是HANDLE的一种,但是HANDLE并不是HWND.
HANDLE是操作系统一系列内核对象的句柄。
HWND仅是窗口对象的句柄

 
VC的button控制只有两个事件,一个是单击事件,一个事双击事件。在这个方面VB就方便多了。但是我们有其他办法解决。首先我们先学一些基础知识。

1...关于PreTranslateMessage

PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗口的消息都要通过这里,比较常用,当你需要在MFC之前处理某些消息时,常常要在这里添加代码.

2...关于MSG结构体 typedef struct tagMSG { // msg HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG;

Members hwnd Handle to the window whose window procedure receives the message. message Specifies the message identifier. Applications can only use the low word; the high word is reserved by the system. wParam Specifies additional information about the message. The exact meaning depends on the value of the message member. lParam Specifies additional information about the message. The exact meaning depends on the value of the message member. time Specifies the time at which the message was posted. pt Specifies the cursor position, in screen coordinates, when the message was posted.

3...ID--HANDLE--HWND三者之间的互相转换 id->句柄、、、、、hWnd = ::GetDlgItem(hParentWnd,id); id->指针、、、、、CWnd::GetDlgItem(); 句柄->id、、、、、id = GetWindowLong(hWnd,GWL_ID); 句柄->指针、、、、CWnd *pWnd=CWnd::FromHandle(hWnd); 指针->ID、、、、、id = GetWindowLong(pWnd->GetSafeHwnd,GWL_ID); 指针->句柄、、、、hWnd=cWnd.GetSafeHandle() or mywnd->m_hWnd;

例程:

方法1:

BOOL AcameraCT::PreTranslateMessage(MSG* pMsg) { int buID; buID= GetWindowLong(pMsg->hwnd,GWL_ID);//由窗口句柄获得ID号,GetWindowLong为获得窗口的ID号。 if(pMsg->message==WM_LBUTTONDOWN) { if(buID==IDC_BUTTON_CT1) //按下 { //在这里添加单击按下事件的程序 } } if(pMsg->message==WM_LBUTTONUP) { if(buID==IDC_BUTTON_CT1) { //在这里添加单击松开事件的程序 } } return CDialog::PreTranslateMessage(pMsg); }

方法2:

BOOL AcameraCT::PreTranslateMessage(MSG* pMsg) { int buID; CWnd* pWnd=WindowFromPoint(pMsg->pt); //获得指定点句柄 buID=pWnd->GetDlgCtrlID();//获得该句柄的ID号。 if(pMsg->message==WM_LBUTTONDOWN) { if(buID==IDC_BUTTON_CT1) //按下 { //在这里添加单击按下事件的程序 } } if(pMsg->message==WM_LBUTTONUP) { if(buID==IDC_BUTTON_CT1) { //在这里添加单击松开事件的程序 } } return CDialog::PreTranslateMessage(pMsg);

}

VC_HWND和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对象出来。

以下是自己VC6.0上编译的情况,验证了以上的理论

CWnd* mark1;mark1=FindWindow(NULL,"TEST");//TEST是我的当前实例窗口的title

//从CWND*转换成HWND

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

												

HWND与HANDLE的区别相关推荐

  1. HINSTANCE/HWND/CWnd/HANDLE 的区别

    HINSTANCE是应用程序实例句柄, HWND是窗口对象句柄, HANDLE是任意对象的句柄, CWnd是MFC中的窗口类. MSDN里面对于HINSTANCE的解释是"handle   ...

  2. HWND、HANDLE、HMODULE、HINSTANCE的区别

    到底有什么区别? HWND是线程相关的,你可以通过HWND找到该窗口所属进程和线程. 比如FindWindow时候返回的窗口对象句柄,从WND也可以看出来是window窗口的缩写 HWND h_wnd ...

  3. INSTANCE/HWND/CWnd/HANDLE区别

    HINSTANCE是应用程序实例句柄, HWND是窗口对象句柄, HANDLE是任意对象的句柄, CWnd是MFC中的窗口类. MSDN里面对于HINSTANCE的解释是"handle   ...

  4. HANDLE HINSTANCE HWND等句柄的区别

    HINSTANCE是应用程序实例句柄, HWND是窗口对象句柄, HANDLE是任意对象的句柄, CWnd是MFC中的窗口类. MSDN里面对于HINSTANCE的解释是"handle to ...

  5. HINSTANCE和HANDLE的区别

    HANDLE是用来标记资源的,也就是handle to an object. HINSTANCE是Handle to an instance, 是HANDLE的一种特殊情况,常用来标记 App实例.用 ...

  6. C++|Qt工作笔记-Windows平台下的句柄与Qt中QWindow::winId()以及 QPlatformWindow::handle的区别与联系

    具体是这样的,当创建一个Qt窗口,调用window->winId()与window->handle()后,运行截图如下: 此时可以看到,这个窗口的handle为0x1e78de38 win ...

  7. LPSTR/LPCSTR/LPTSTR/HWND/HANDLE/HMODULE/HINSTANCE 等含义和区别

    文章目录 辨别区分标志 Windows Data Types 含义 Reference 简 述: Windows 编程中常见的一些类型意义.区别和讲解定义 PVOID 和 LPVOID LPSTR / ...

  8. HANDLE HMODULE HINSTANCE HWND

    Handle 是代表系统的内核对象,如文件句柄,线程句柄,进程句柄. HMODULE 是代表应用程序载入的模块,win32系统下通常是被载入模块的线性地址. HINSTANCE 在win32下与HMO ...

  9. handle与HWND的差别

    HANDLE:句柄,是Windows用来表示对象的(不是C++的对象),HWND是其中一种,HWND是HANDLE,但HANDLE不只是HWND,更具体的查MSDN吧. HANDLE(句柄)是Wind ...

最新文章

  1. java调用c库实例
  2. disp语句怎么格式 matlab_讲座回顾:Matlab使用教程
  3. html设置box设置长度自适应,CSS实现宽度自适应宽高16:9的矩形的示例
  4. 使用CSS选择器在页面中插入内容
  5. *【HDU - 1506】【POJ - 2559】Largest Rectangle in a Histogram(单调栈或动态规划)
  6. 什么叫做项目孵化_什么叫创业孵化服务?
  7. 当心异步刷新后的脚本文件加载
  8. 打开网页出现运行脚本错误的解决技巧
  9. 职场新鲜人必读:那些被“误读”的真经
  10. 北风网android,北风网JAVA/ASP.NET/Android系列公开课视频教程入门项目必学课程
  11. 外架小横杆外露长度规范要求_外架小横杆外露长度
  12. 初学者最容易学的六种编程语言
  13. 《激荡三十年》七、国企难破局—“裁缝神话”步鑫生
  14. 大数据可视化(六)文本数据可视化
  15. 如何在 FlowUs、Notion 等笔记软件中进行时间管理?
  16. MacM1本地navicat无法连接本地docker的mysql。
  17. 详解RAI I、C++中的智能指针以及一些常见的面试题
  18. Qgis教程13:照片上图 ImportPhotos
  19. Allegro PCB对某个网络进行高亮以及取消高亮
  20. AS400数据库事务处理机制

热门文章

  1. C. Hilbert's Hotel
  2. java 分页简单使用
  3. 计算机网络 5电路交换
  4. 日志查看 docker容器启动失败原因
  5. 常见的DNS攻击与防御
  6. 【大数据分析】2021“秋招”毕业生求职的网络舆论关注度分析
  7. 计算机维修技术在线阅读,西南大学19秋[0240] 计算机维修技术在线作业
  8. SpringBoot获取自身tomcat端口号的坑 @Value(${server.port})
  9. MYJ2C一款java2c混淆工具 java代码转C代码 交叉编译windows,linux,mac系统动态链接库
  10. 区块链学习入门简介(一)