• 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);
        }
  • 相关阅读:
    关于程序员的段子,你能读懂几个?网友:你若全对算我输!
    【C++学习笔记】超详细C++注释的使用方法,不赶紧收藏就错过啦!
    做编程容易短命?衷心建议:三十六计,“保命”要紧
    【C++学习笔记】C++异常处理!你绝对不能错过的干货!
    Linux Socket套接字出现问题怎么办?教你5个方法“有备无患”
    【致敬伟大的程序员】写代码写进国博,这么牛的还有谁?
    重要的事情说三遍:局部变量一定要初始化!你做到了吗?
    自我介绍
    .NET应用程序中嵌入VB6表单
    在VB6中使用。net DLL
  • 原文地址:https://www.cnblogs.com/shuzhongke/p/15439957.html
Copyright © 2020-2023  润新知