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

164 篇文章 11 订阅
12 篇文章 1 订阅

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 style
  LPCTSTR lpClassName,  // registered class name
  LPCTSTR lpWindowName, // window name
  DWORD dwStyle,        // window style
  int x,                // horizontal position of window
  int y,                // vertical position of window
  int nWidth,           // window width
  int nHeight,          // window height
  HWND hWndParent,      // handle to parent or owner window
  HMENU hMenu,          // menu handle or child identifier
  HINSTANCE hInstance,  // handle to application instance
  LPVOID 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);


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值