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的指针
6.4 如何遍历控件
- 使用GetTopWindow方法获取第一个控件
- 使用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
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);
}
}
效果如下:
未根据父窗体改变控件大小
使用上面代码根据父窗体改变控件大小