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);
View Code

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);
View Code

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);
View Code

获取窗口或控件句柄

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);
    }

 

posted @ 2021-11-02 15:40  liweiyin  阅读(1965)  评论(0编辑  收藏  举报