窗口句柄、窗口类对象的关系
HWND hwnd;//窗口句柄
CWnd wnd;//窗口類對象
窗口類對象中有一個成員是窗口句柄。
?
?窗口句柄,提供了窗口的一個標識,類似于指針的概念,每一個窗口都對應了一個窗口句柄作為其標識,通過句柄可以方便的從內(nèi)存中索引到資源。窗口類的對象則是對應窗口類的一個實例化,在MFC程序中,通過子類對象訪問類的函數(shù)時就不需要提供窗口句柄作為資源標識。
舉例說明:
SDK編程中創(chuàng)建一個窗口首先要定義一個窗口句柄,然后調用API函數(shù)創(chuàng)建并顯示窗口,此時需要向函數(shù)傳遞窗口句柄,具體如下:
HWND hwnd;
hwnd=::CreateWindowEx();
::ShowWindow(hwnd,SW_SHOW);
::UpdateWindow(hwnd);
利用MFC開發(fā)程序時,在CWnd類中定義了一個類型為句柄的成員變量HWND m_hWnd, 類中有函數(shù)
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開發(fā)程序時,在CWnd類中定義了一個類型為句柄的成員變量HWND m_hWnd, 類中有函數(shù)其返回值為一個句柄,在函數(shù)體內(nèi)部利用API函數(shù)CreateWindowEx來完成窗口的創(chuàng)建。將其返回值保存到m_hWnd中,在實例化一個對象CWnd wnd;wnd.CreatEx(...);
wnd.ShowWindow(SW_SHOW);
wnd.UpdateWindow();
可見利用對象創(chuàng)建窗口不需要向函數(shù)傳遞窗口句柄資源。因為在CWnd中定義了一個成員變量m_hWnd,由它保存了這個窗口句柄,調用CreateWindowEx時把句柄保存到CWnd類中,
所以再次調用ShowWindow中就不用傳遞句柄。
?
這里需要聲明一點此處的wnd對象并不是窗口,將窗口關閉的時候這個對象并沒有銷毀,僅僅是將句柄設置為NULL,對象和窗口生存周期之間沒有必然聯(lián)系,對象和窗口唯一聯(lián)系的紐帶是在類的內(nèi)部有一個窗口句柄的成員變量,保存了相關窗口的句柄,所以當對象銷毀的時候這個窗口是要銷毀的。一般的說在執(zhí)行到右大括號之前對象都是沒有被銷毀的,而此時若調用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);
?
總結
以上是生活随笔為你收集整理的窗口句柄、窗口类对象的关系的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot 之集成 Sprin
- 下一篇: 图解 IDEA 中 springboo