CWnd類介紹
CWnd類提供 Microsoft 基礎類庫中所有窗口類的基本功能。
當我們建立一個CMyWindowDlg 對話框時,該對話框與CWnd類之間的繼承關系如下:
CMyWindowDlg <- CDialogEx <- CDialog <- CWnd(通用窗口類,所有的窗口,包括控件) <- CCmdTarget <- CObject
MFC CWnd與VC_HWND概念以及轉換
CWnd是MFC類庫中所有窗口類的基類。微軟在MFC中將所有窗口的通用操作都封裝到了這個類中,如:ShowWindow等等,同時它也封裝了窗口句柄即m_hWnd成員。
HWND是Windows系統中對所有窗口的一種標識,即窗口句柄。這是一個windows SDK概念。
根據窗口或控件ID獲取其句柄(一般是先通過GetDlgItem得到CWnd指針,然后在獲取句柄)
HWND hwnd = GetDlgItem(控件的ID)->GetSafeHwnd(); //獲取句柄,GetSafeHwnd()比m_hWnd更安全,因為內部會判斷是否為NULL,推薦使用 HWND hwnd = GetDlgItem(控件的ID)->m_hWnd; //獲取句柄(一般要手動判空) CWnd *pWnd = GetDlgItem(控件的ID); //獲取控件句柄
假設對於同一個窗口而言,其指針是pWnd,句柄是hWnd,ID是nID 指針->句柄: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);
CWnd類公共方法
創建窗口或子控件
CWnd::CreateEx()
1.創建通用窗口(子窗口或主窗口)

WNDCLASS wc = {0}; wc.hbrBackground = CreateSolidBrush(RGB(105, 0, 100)); wc.hInstance = AfxGetInstanceHandle(); wc.lpfnWndProc = ::DefWindowProc; wc.lpszClassName = L"zhangsan"; wc.style = CS_HREDRAW | CS_VREDRAW; RegisterClass(&wc); CWnd* pWnd = new CWnd; pWnd->CreateEx(WS_EX_ACCEPTFILES, wc.lpszClassName, L"lisi", WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_MAXIMIZEBOX, 20, 20, 500, 400, m_hWnd, NULL, 0);//m_hWnd是CWnd的公共成員變量 pWnd->ShowWindow(SW_SHOW);
2.創建子控件

CWnd *pWnd = new CWnd; pWnd->CreateEx(WS_EX_ACCEPTFILES, L"BUTTON", L"weiyin", WS_CHILD|WS_BORDER | BS_PUSHBUTTON | WS_VISIBLE, CRect(200, 200, 300, 230), this, 1024);
CWnd::Create()
創建子控件

CWnd *pWnd = new CWnd; pWnd->Create(L"BUTTON", L"lisi", WS_BORDER | BS_PUSHBUTTON, CRect(200, 200, 300, 230), this, 1001); pWnd->ShowWindow(SW_SHOW);
獲取窗口或控件句柄
1.CWnd *pWnd = GetDlgItem(IDC_BIN);//檢索指向對話框或其他窗口中指定控件或子窗口的指針 HWND hButton = pWnd->m_hWnd;//拿到該窗口或控件的句柄,m_hWnd為窗口的句柄,是CWnd的公共成員。 2.HWND hButton = GetDlgItem(IDC_BIN)->GetSafeWnd();//拿到該窗口或控件的句柄
GetDlgItem返回的數據類型是CWnd*類型,是一個指針。它內部有一個 HWND m_hWnd 句柄成員,該句柄成員是一個4字節(64位程序中為8字節)的無符號整形,它代表內存中對象物理地址列表的索引,索引對應保存的內容是特定對象的物理地址。
關於句柄與指針的區別,參考:https://www.cnblogs.com/findumars/p/5928707.html
窗口文本信息操作
設置窗口文本
//設置ID為IDC_BTN_TEST窗口控件的文本信息為指定文本set a window CWnd* pWnd = GetDlgItem(IDC_BTN_TEST); pWnd->SetWindowText(L"set a window");
獲取指定窗口文本
//獲取ID為IDC_BTN_TEST窗口控件的文本信息,並彈窗顯示 CWnd* pWnd = GetDlgItem(IDC_BTN_TEST); pWnd->GetWindowText(str); MessageBox(str);
獲取窗口文本長度
CWnd* pWnd = GetDlgItem(IDC_BTN_TEST); int nLength = pWnd->GetWindowTextLength();//nLength=2
窗口功能操作
最小化窗口
CWnd* pWnd = GetDlgItem(IDC_BTN_TEST);
pWnd->CloseWindow();
銷毀窗口
CWnd* pWnd = GetDlgItem(IDC_BTN_TEST);
pWnd->DestroyWindow();
查找窗口
//注意,FindWindow查找主窗口,不能查找子控件,子控件采用FindWindowEx函數 //功能:查找記事本窗口,找到窗口后,關閉窗口 CWnd* pWnd = FindWindow(L"Notepad", NULL); if (pWnd != NULL) { pWnd->SendMessage(WM_CLOSE, 0, 0); }