Win32 控件篇(1)

6.1 如何通过控件ID获得控件窗口指针

使用GetDlgItem方法根据控件的ID来查询窗体指针

void CDemoDlg::OnTest() 
{
    //获得控件窗口指针
    CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT);

    CString strText = _T("");
    strText.Format("pEdit=0x%X\n&m_ctrlEdit=0x%X\n", pEdit, &m_ctrlEdit);
    AfxMessageBox(strText);
}

6.2 如何通过控件窗口指针获得控件ID

根据控件本身的GetDlgCtrlID方法查询控件ID

void CDemoDlg::OnTest() 
{
    //获得控件ID
    int nID = m_ctrlEdit.GetDlgCtrlID();

    CString strText = _T("");
    strText.Format("nID=%d\nIDC_EDIT=%d", nID, IDC_EDIT);
    AfxMessageBox(strText);
}

6.3 如何获得指定点的控件指针

使用ChildWindowFromPoint方法

void CDemoDlg::OnTest() 
{
    CRect rect;
    GetClientRect(&rect);

    //获得中指定点控件窗口指针
    CWnd* pWnd = ChildWindowFromPoint(CPoint(rect.Width() / 2, 15), CWP_ALL);

    //获得Edit控件窗口指针
    CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT);

    if (pWnd != NULL)
    {
         CString strText = _T("");
        strText.Format("pWnd=0x%X\npEdit=0x%X\n", pWnd, pEdit);
        AfxMessageBox(strText);
    }
}

结果都是获取到TextBox的指针

image

6.4 如何遍历控件

  1. 使用GetTopWindow方法获取第一个控件
  2. 使用GetNextWindow方法获取下一个控件(也可以是上一个,默认是下一个)
//获得第一个子窗口
CWnd* pChildWnd = GetTopWindow();
while (pChildWnd != NULL)
{
    //获得控件ID
    int nID = pChildWnd->GetDlgCtrlID();
    CString strText = _T("");
    strText.Format(_T("%d"), nID);
    pChildWnd->SetWindowText(strText);

    //获得下一个子窗口
    pChildWnd = pChildWnd->GetNextWindow();
}

效果:显示每个控件的ID

image

6.5 如何根据父窗口的大小改变控件的大小和位置

Windows窗体并没有自动缩放的功能,所以开发起来并不是这么简单

void CDemoDlg::OnSize(UINT nType, int cx, int cy) 
{
    CDialog::OnSize(nType, cx, cy);

    //根据父窗口的大小移动窗口
    CWnd* pWnd = GetDlgItem(IDC_LIST);
    if (pWnd != NULL)
    {
        pWnd->MoveWindow(10, 10, cx - 20, cy - 20);
    }
}

效果如下:
未根据父窗体改变控件大小

image

使用上面代码根据父窗体改变控件大小

image

原文地址:https://www.cnblogs.com/Clingingboy/p/1989752.html