MFC 窗口的句柄与指针
-
- 一、句柄
-
- (1)句柄的含义
-
-
- 句柄实际上是一种指向某种资源的指针,但与指针又有所不同:指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据。Windows并不希望一般程序修改其内部数据结构,因为这样太不安全。所以Windows给每个使用GlobalAlloc等函数声明的内存区域指定一个句柄(本质上仍是一个指针,但不要直接操作它),平时你只是在调用API函数时利用这个句柄来说明要操作哪段内存。当你需要对某个内存进行直接操作时,可以使用GlobalLock锁住这段内存并获得指针来直接进行操作。
- 句柄虽然是一个能相互区别的号码,但与我们普通的ID号又有区别,普通的ID号是可以由程序员自己定义的,而句柄不行,它是对象生成时系统指定的,是为了区别系统中存在的各个对象,这个句柄不是由程序员赋给的。实际应用中,最常用的就是文件句柄和窗口句柄。例如,窗口句柄的值是一个长整数,每个窗体都用一个句柄来表示。所以句柄是不会重复的,很多的函数都会用到窗体的句柄。
- 句柄其实就是指针,但是他和指针最大的不同是:给你一个指针,你可以通过这个指针做任何事情,也许是好事,也许是通过这个指针破坏内存,干一些捣乱的事情。这个我想大家都会碰到过,因为乱用指针导致程序崩溃。
- 句柄就没有这个缺点,通过句柄,你只能干一些windows让你干的事情(调用一些api函数等等),没有了指针的坏处。
- 句柄是一些表的索引也就是指向指针的指针,句柄和指针都是地址,句柄是Windows编程的一个关键性的概念,编写Windows应用程序总是要和各种句柄打交道。
- 所谓句柄,就是一个唯一的数,用以标识许多不同的对象类型,如窗口、菜单、内存、画笔、画刷等。在Win32里,句柄是指向一个“无类型对象”(void*)的指针,也就是一个4字节长的数据。
-
- (2)获取句柄
-
- 1、获取主窗口的句柄
-
- a、主窗口或者子窗口的类中
- 都可以使用:AfxGetMainWnd()->m_hWnd
- 在多线程中,因为不支持不支持通过AfxGetMainWnd()获取窗口句柄,改为:AfxGetApp()->m_pMainWnd->m_hWnd
- 备注:在提取到各个句柄之后,因为初次提取的都是标准类句柄,所以,在使用时要注意将标准句柄转换成自己的类的句柄
- AfxGetApp()//得到的是WinApp类的句柄,所以操作前记得转换成自己定义的类的句柄。
- 如:((CMyApp*)AfxGetApp())->XXXX();//这的xxxx()就是你定义的类中间的成员。
- b、在子窗口类中
- 可以使用:this->GetSafeHwnd()
- 或者:this->m_hWnd
- 或者:this->GetParent()->m_hWnd (注意可能需要使用多个GetParent()才能得到主窗口的句柄)
- 2、获取子窗口句柄
-
- a、使用:FindWindow()
- 函数原型:HWND FindWindow(LPCSTR lpClassName,LPCSTR lpWindowName); //成功返回一个窗口的句柄,否则返回零。
- 参数:lpClassName 如果该参数为null时,将会寻找任何与lpWindowName参数匹配的窗口。
- lpWindowName 指向一个以NULL字符结尾的、用来指定窗口名(即窗口标题)的字符串。如果此参数为NULL,则匹配所有窗口名。
- b、最安全还是使用:GetSafeHwnd() //得到窗口指针句柄。
- CWnd *pwnd = FindWindow(“Window name”,NULL);
- HWND hwnd = pwnd->GetSafeHwnd(); //得到它的HWND
- 3、获取窗口中控件的句柄
- 二、句柄、指针、ID的转换
-
-
-
- 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);
- GetDlgCtrlID();
- 指针--->句柄--------hWnd=cWnd.GetSafeHandle() or mywnd->m_hWnd;
- HICON--->ID--------HICON hIcon = AfxGetApp()->LoadIcon(nIconID);
- HICON hIcon = LoadIcon(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(nIconID));
-
-