今天用MFC做了一个动太生成控件的小程序,有关生成的控件
在网上查了一些资源,在这里整理一下
首先生成控件(这里以CButtonST为例,其它类似):
//生成按钮
void CdlgDlg::OnBnClickedButton2()
...{
// TODO: 在此添加控件通知处理程序代码
int width,height,left,space;
width=height=22;
left=100;
space=5;
char cNum[10];
for(int i=1;i<10;i++)
...{
itoa(i,cNum,10);
CButtonST* m_pBtnST=new CButtonST();
m_pBtnST->Create(cNum, WS_VISIBLE | WS_CHILD,CRect(CPoint(left,100),CSize(width,height)),this,IDC_SELECTBUTTON);
m_pBtnST->ShowWindow(SW_SHOW);
this->SelectButton(*m_pBtnST);
left+=width+space;
}
}
方法1:
#define IDC_SELECTBUTTON 1011
//添加消息处理
afx_msg void OnBnClickedSelectButton();
BEGIN_MESSAGE_MAP(CdlgDlg, CDialog)
ON_BN_CLICKED(IDC_SELECTBUTTON,&CdlgDlg::OnBnClickedSelectButton)
END_MESSAGE_MAP()
//添加消息处理函数
void CdlgDlg::OnBnClickedSelectButton()
...{
MessageBox("clicked");
}
方法2(此方法更佳,可以具体得到是哪个控件触发的消息):
在.h文件添加
private:
virtual BOOL OnCommand(WPARAM wParam,LPARAM lParam);
在.cpp文件添加
BOOL CdlgDlg::OnCommand(WPARAM wParam,LPARAM lParam)
...{
if(LOWORD(wParam)==IDC_SELECTBUTTON && HIWORD(wParam)==BN_CLICKED) //选择按钮
...{
HWND hWnd=(HWND)lParam; //触发消息控件的句柄
CButtonST* pST=(CButtonST*)CButtonST::FromHandle(hWnd); //获取控件指针
if(this->IsSelected(*pST))
...{
this->CancelSelectButton(*pST);
}
else
...{
this->SelectButton(*pST);
}
}
return CDialog::OnCommand(wParam,lParam);
}
就这样就完成了动态添加控件的消息处理...
方法3(网上收集,跟方法2有点相似,还没有测试过):
LRESULT CmmsgDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
...{
switch(message)
...{
case WM_COMMAND:
...{
DWORD nID = LOWORD(wParam);//低字空件ID
DWORD nEv = HIWORD(wParam);//高字窗体句柄
switch(nID)
...{
case 0:
...{
switch(nEv)
...{
case BN_CLICKED://BN_CLICKED 二次消息
...{
AfxMessageBox("Create Button is Cilcked.");
}
break;
//case BN_XXXX; 此控件的其它消息
}
}
}
//case other:
}
break;
}
return CDialog::DefWindowProc(message, wParam, lParam);
}
哈哈...就写到这...