本文主要是介绍窗口句柄、窗口类对象的关系,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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);
这篇关于窗口句柄、窗口类对象的关系的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!