在一个对话框类成员函数中,使用CWnd::GetWindow和CWnd::GetNextWindow即可。
void CTextView::Test()
{
CWnd* pWnd=NULL;
pWnd=GetWindow(GW_CHILD); //获取第一个子控件
while(pWnd)
{
//对控件进行处理
// if CWnd is a child window, the function searches for the next (or previous) child window.
pWnd=pWnd->GetNextWindow();
}
}
————————————————
在窗口中,用CWnd *pWndChild = GetWindow(GW_CHILD);得到控件指针后,如何判断其类型?是按钮还是编辑框或其它?
CString strClass;
::GetClassName(GetDlgItem(IDC_LIST1)->m_hWnd,strClass.GetBufferSetLength(255),255);
strClass.ReleaseBuffer();
AfxMessageBox(strClass);
if( pWnd->GetStyle()& BS_GROUPBOX )
{
//是Group Box
}
if( pWnd->GetStyle()& BS_PUSHBUTTON )
{
//是BUTTON
}
绑定变量和控件id
DDX_Control函数管理着在对话框、表格视或控件视中被子类化的控件与对话框、
表格视或控件视的CWnd数据成员之间的数据交换。
其实说白了,就是将资源(如按钮)与类对象(CButton)关联在一起,也就是绑定起来。
DDX_Control的使 用:
在对话框类头文件中定义m_btnOK对象
CButton m_btnOK;
然后在DoDataExchange函数中添加以下语句
DDX_Control(pDX, IDOK, m_btnOK);
上边说了DDX_Control的用法,其实DDX_Control的原理很简单就是
获取控件ID的HWND句柄,然后调用Attach(hWnd),将句柄绑定到对象上,最后初始化
对象,即调用对象类中重载的PreSubclassWindow()函数,之后再做一些显示工作。
原理很简单,接下来我用一段代码来代替DDX_Control语句,以便大家理解
在OnInitDialog()函数中添加以下语句,即可实现DDX_Control做的工作。
HWND hWndCtrl;
GetDlgItem(IDOK, &hWndCtrl);
m_btnOK.SubclassWindow(hWndCtrl);
上边的代码关键在SubclassWindow函数,SubclassWindow是基类CWnd中的函数主要做的就是
Attach(hWnd)以及调用对象类中重载的PreSubclassWindow()方法,并做一些显示工作。
其实mfc中已有一些自定义按钮,比如位图按钮。使用起来也很简单,方法如下
定义一个位图对象
CBitmapButton m_editCopy;
之后在OnInitDialog()中加入以下代码即可
m_editCopy.LoadBitmaps(IDB_BITMAP1);
m_editCopy.Attach(GetDlgItem(IDC_BUTTON1)->m_hWnd);
pBaseButton->SubclassDlgItem(id, this);
如果已经绑定再次绑定的时候程序会崩
最终结果
设置按钮样式
CWnd* pWnd = NULL;
pWnd = GetWindow(GW_CHILD);//获取第一个
while (pWnd)
{
pWnd = pWnd->GetNextWindow();
if (pWnd == nullptr)
{
break;
}
CString strClass;
::GetClassName(pWnd->m_hWnd, strClass.GetBufferSetLength(255), 255);
strClass.ReleaseBuffer();
if (strClass.CompareNoCase(CString("Button")) == 0)
{
CBaseButtonStyle* pBaseButton = new CBaseButtonStyle;
int id = GetWindowLong(pWnd->m_hWnd, GWL_ID);
pBaseButton->SubclassWindow(pWnd->GetSafeHwnd());
//pBaseButton->Attach(pWnd->m_hWnd);
//pBaseButton->SubclassDlgItem(id, this);
pBaseButton->SetBtnStyle();
}
}