在类中声明并定义按钮控件的起始ID,以控件的类型和功能对动态控件ID进行分组,每组最好定义一个自己的起始ID方便管理:
#define IDC_CONTROL_START 1000
#define IDC_BTN_START IDC_CONTROL_START+100
#define IDC_STA_START IDC_CONTROL_START+200
#define IDC_EIT_START IDC_CONTROL_START+300
#define IDC_CMB_START IDC_CONTROL_START+400
起始ID可以设置大一点,避免与窗体内部的控件ID重复,上面定义了四种控件的起始ID。
根据动态控件的生命周期,在对应的作用域里面定义控件对象的指针,一般会定义在头文件里保证控件和窗体生命周期相同:
std::vector<CButton*>pBtn;
std::vector<CStatic*>pSta;
std::vector<CEdit*>pCet;
std::vector<CComboBox*>pCmb;
注:使用vector容器便于扩充控件数量,需添加头文件vector。
在类的OnInitDialog()函数中动态创建按钮:
int count = 3;
int width = 100;
int height = 50;
int space = 20;
pBtn.resize(count);
pSta.resize(count);
pCet.resize(count);
pCmb.resize(count);
int L, T, R, B;
CWnd* pWnd = this;
//可以使用其它控件作为父窗体,但消息处理会很麻烦
//pWnd = GetDlgItem(IDC_STATIC_GROUP);
DWORD dwStyle;
CRect rect;
for (size_t i = 0; i < count; i++)
{
L = 20 + i * (width + space);
T = 20 + 0 * (height + space);
dwStyle = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_FLAT;
rect = CRect(L, T, L + width, T + height);
pBtn[i] = new CButton();
pBtn[i]->Create(_T("按钮"), dwStyle, rect, pWnd, IDC_BTN_START + i);
T = 20 + 1 * (height + space);
dwStyle = WS_CHILD | WS_VISIBLE | SS_CENTER;
rect = CRect(L, T, L + width, T + height);
pSta[i] = new CStatic();
pSta[i]->Create(_T("文本"), dwStyle,rect, pWnd, IDC_CONTROL_START + 200);
T = 20 + 2 * (height + space);
dwStyle = ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER;
rect = CRect(L, T, L + width, T + height);
pCet[i] = new CEdit();
pCet[i]->Create(dwStyle,rect , pWnd, IDC_CONTROL_START + 300);
pCet[i]->SetWindowText(_T("编辑"));
//下拉框的高度必须设大一点,防止不能选中项
T = 20 + 3 * (height + space);
dwStyle = WS_VISIBLE | WS_CHILD | CBS_DROPDOWNLIST | CBS_HASSTRINGS;
rect = CRect(L, T, L + width, T + height + 100);
pCmb[i] = new CComboBox();
pCmb[i]->Create(dwStyle, rect, pWnd, IDC_CONTROL_START + 400);
pCmb[i]->AddString(_T("1"));
pCmb[i]->AddString(_T("2"));
pCmb[i]->AddString(_T("3"));
}
上面的控件布局可以按自己的来,重要的是Create()函数,每个控件的Create()函数不一样,以最底层CWnd类的Create()函数进行说明:
virtual BOOL Create(LPCTSTR lpszClassName,
LPCTSTR lpszWindowName, DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd, UINT nID,
CCreateContext* pContext = NULL);
参考:https://learn.microsoft.com/zh-cn/cpp/mfc/reference/cwnd-class?view=msvc-170#create
lpszClassName、lpszWindowName、pContext这三个参数不确定的情况下,可以传入NULL。
其它控件的Create()函数参考 MFC 类 中的控件类
运行效果如下图:

如果给定 WS_VISIBLE 样式,Windows发送按钮控件所需的所有信息激活和显示按钮,还可以将以下 窗口样式 应用于控件:
每种控件还有自己的样式,详细内容见 MFC使用的样式
一个MFC的消息响应函数在程序中有以下三部分:
关于消息映射的更多内容参考 消息映射(MFC)。
可以使用常规方法,根据ID为按钮绑定单击的消息响应函数:
ON_BN_CLICKED(IDC_BTN_START + 0, &CMFCApplication1Dlg::OnBtnClik)
如果生成的按钮比较多,一个个处理会很麻烦,需要使用批量绑定,批量绑定按钮单击消息响应函数的步骤:
afx_msg void OnBtnClick(UINT uID);
注:OnBtnClick函数的参数nID代表响应函数对应按钮控件的ID号,单个按钮可不设参数。
ON_COMMAND_RANGE(IDC_BTN_START + 0, IDC_BTN_START + 3, &CMFCApplication1Dlg::OnBtnClik)
注:在函数实现文件中的消息映射部分(BEGIN_MESSAGE_MAP与END_MESSAGE_MAP之间)定义按钮控件与其消息响应函数之间的映射关系。
void CMFCApplication1Dlg::OnBtnClik(UINT uID)
{
int id = uID -IDC_BTN_START;
CString str;
str.Format("当前ID %d", id);
int result = MessageBox(str, TEXT("确认"), MB_YESNO);
}
使用ON_CBN_SELCHANGE消息:
ON_CBN_SELCHANGE(IDC_CMB_START, &CMFCApplication1Dlg::OnSelComChange)
声明消息响应函数:
afx_msg void OnSelComChange();
实现消息响应函数:
void CMFCApplication1Dlg::OnSelComChange()//选择下拉框某一列的时候得到响应
{
for (size_t i = 0; i < pCmb.size(); i++)
{
if (pCmb[i]==GetFocus())
{
CString str(_T(""));//获取当前下拉框的值
pCmb[i]->GetLBText(pCmb[i]->GetCurSel(), str);//获取CComBox下拉框当前选中的值
MessageBox(str, TEXT("确认"), MB_OK);
}
}
}
疑问:明明对一个控件ID映射了消息响应函数,但后面的组合框控件都能进入OnSelComChange() 函数,后面有时间再研究。
出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
我有一个ModularSinatra应用程序,我正在尝试将Bootstrap添加到应用程序中。get'/bootstrap/application.css'doless:"bootstrap/bootstrap"end我在views/bootstrap中有所有less文件,包括bootstrap.less。我收到这个错误:Less::ParseErrorat/bootstrap/application.css'reset.less'wasn'tfound.Bootstrap.less的第一行是://CSSReset@import"reset.less";我尝试了所有不同的路径格式,但它
如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c