动态生成控件的消息处理

作者:袖梨 2022-07-02

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

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

相关文章

精彩推荐