如何在VC++中建立如同VB中的控件数组?

lifanxi 2000-05-20 03:57:00
如何在VC++中建立如同VB中的控件数组?
...全文
504 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lifanxi 2001-09-28
  • 打赏
  • 举报
回复
总算在大家和MSDN的帮助下实现了我理想中的控件数组。下面把方法写一写与大家一起分享。
如果是静态(已知)个数的控件数组,实现还是比较简单的。
1.在Menu\View\Resource Symbols中建立一些连续的ID,比如IDC_MYBUTTONS值为900,在此之后要留出足够多连续的空的ID。
2.以做按钮数组为例:在头文件中定义一组按钮指针,我这里定义4个。
CButton * m_pButton[4];
3.在需要建立控件数组的地方,比如Dialog的InitDialog()中,生成按钮。
for(int i=0;i<=3;i++)
{
m_pButton[i]=new CButton;
m_pButton[i]->Create(TEXT("按钮标题"),BS_PUSHBUTTON|WS_CHILD|WS_VISIBLE,CRect(0,i*40,100,i*40+40),this,IDC_MYBUTTONS+i); //CRect中指定按钮的位置与大小。
}
4.控件生成后要自己做消息映射,ClassWizard不支持。
在CPP文件中建立消息映射:
ON_COMMAND_RANGE(IDC_MYBUTTONS,IDC_MYBUTTONS+3,OnButton)
在头文件中声明响应消息的函数:
afx_msg void OnButton(UINT nID);
在CPP文件中实现消息响应函数:
void CKJSZDlg::OnButton(UINT nID)
{
// TODO: Add your control notification handler code here

}
上面比较关键的是在做响应函数时要带UINT nID参数,否则在函数中就无法分辨是一组控件中的哪一个产生的消息。
有了nID就可以很方便的用GetDlgItem(nID)来获得指向该控件的指针,并对控件进行必要的操作。
wuhf 2001-07-03
  • 打赏
  • 举报
回复
请问楼上的:
在my()函数中如何判断为哪个button的时间呢?
korn 2000-05-26
  • 打赏
  • 举报
回复
经过长时间的实践:赫赫,终于知道了
如果是要静态数组的话(即个数事先确定的话还是较简单的):
1.选择Menu--View菜单项底下的resource symbols 中声明一些连续的资源ID.
比如:IDMYBUTTON VALUE 102 .....后面的一些Value值空着就可以了.
2.在控件创建时,使用上面的资源ID就可以乐!
在.H文件中定义控件数组:
CButton * m_pButton[4];
在.CPP文件中(一般是在比如Dialog 的InitDialog()函数中实现):
for(inti=0;i<4;i++)
{
m_pButton[i]=new CButton;
m_pButton[i]->Create(_T("HeHe"),WS_CHILD and WS_VISVIBLE,
CRect(0,0,100,24),NULL,this,IDMYBUTTON+i);
}
3. 动态生成控件以后,肯定是要完成一定的功能了,你手工加上消息映射,找到
afg_msg 你的消息函数 my();
declare_message_map() // (*.h 文件中)
begin_message_map()
ON_CONTROL_RANGE(BN_CKLICKED,IDMYBUTTON,IDMYBUTTON+4,my)
.......
end_message_map() //( *.cpp文件中)
4.然后就是编写你的my()函数了..
赫赫...
korn 2000-05-23
  • 打赏
  • 举报
回复
我正想问这个问题那,我的工程中也是要用到控件数组,控件的个数是根据需要而定的
各位大虾,能不能写的详细写,,,拜托了!
lifanxi 2000-05-23
  • 打赏
  • 举报
回复
我是C++菜鸟,前面的回答,除了Asima的回答我觉得有点用外,其他就......
我想问,有没有更简单的方法?用Wizard等方便的工具实现.
Asima 2000-05-23
  • 打赏
  • 举报
回复
sorry 应该是
DDX_Control(pDX, IDOK+i, m_button[i]);//刚才写成IDOK+1写错了
另外就是控件是事先建立的
比如说以IDOK为第一个id其后的控件随之增加IDOK+1,IDOK+2.......等等
Asima 2000-05-23
  • 打赏
  • 举报
回复
sorry 应该是
DDX_Control(pDX, IDOK+i, m_button[i]);//刚才写成IDOK+1写错了
Asima 2000-05-23
  • 打赏
  • 举报
回复
其实也可以做成控件数组
这个我使用过的,有兴趣可以给你看看我写的一个例子
以按钮为例
在头文件中定义一个控件数组
在DoDataExchanged()中
写一个for循环
for(int i=0;i<Count;i++)
DDX_Control(pDX, IDOK+1, m_button[i]);
不过这样一来用ClassWinzard时就会有问题
但是不影响程序运行的正确性
hustwjz 2000-05-22
  • 打赏
  • 举报
回复
控件数组的目的不过是让相似的功能集中在一起处理。在VC中你并没有必要使用控件数组,而可以使用ON_COMMAND_RANGE宏实现这一功能,使用方法如下
ON_COMMAND_RANGE(FIRST_ID,LAST_ID,DoWhat)
对应的消息响应函数的写法为?我忘了。不过你自己可以查阅一下
wxj_ipcv 2000-05-20
  • 打赏
  • 举报
回复
用控件指针,动态生成!

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧