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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM