MFC窗口核心类CWnd
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); }