【www.gdgbn.com--其它】

今天用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);   
  }   

哈哈...就写到这...

本文来源:http://www.gdgbn.com/luyouqishezhi/13155/