MFC下动态添加控件
来源:互联网 发布:自贡网络电视台 编辑:程序博客网 时间:2024/06/05 17:45
敢于拼搏,乐于奉献
本文主要是以作者在实习期间用MFC为公司开发的一款定制工具软件的蓝本,着重介绍一下作者在开发软件时遇到的一些难点,跟解决方法。由于作者在去公司实习之前没有接触过MFC,因此必须需要掌握一些MFC最基础的开发环境,常用控件等,这里要感谢下鸡啄米大神的网站:http://www.jizhuomi.com/software/257.html,详细介绍了MFC编程的入门教程,对MFC还不熟悉的朋友可以先去学习下MFC开发的基础知识,搭建MFC开发环境。作者用的是vc6.0的开发环境,闲话不多说,我们直接进入主题。
图1 对话框
如图1所示,这是MFC的对话框模式下的对话框,一般的控件的添加都是静态的添加,将控件直接加入对话框中即可,但是有些控件的添加有着不确定的因素,当运行的程序满足一定的条件时,需要添加某个控件,这里作者以动态创建组合框控件(ComboBox)为例。我所知道的是有两种方法:方法一是以添加ID的方式,将ID与控件想关联,然后添加并使用控件。方法二是直接用控件的类定义一个新的控件的名称,然后可以直接使用定义的新控件进行创建。
1.方法一步骤:
图2 String Table
(1)如图2所以,我们点击String Talble进入界面之后如图3所示。
图3 String Table 界面
(2)点击图3中的蓝色的区域,添加自己控件的ID以及名称,图3中的IDC_COMBO_1——IDC_COMBIO_10是作者添加的ID。
(3)添加完之后需要我们需要用CComboBox定义组合框控件的变量,这里为了方便作者定义了一个结构体
public:
typedef struct{
CComboBox *COMBO1;
CComboBox *COMBO2;
CComboBox *COMBO3;
CComboBox *COMBO4;
CComboBox *COMBO5;
}tl_comboBox_t;
tl_comboBox_t tl_comboBox;
(4)定义完之后就需要创建组合框了,这里这这定义了一个函数名为OnAddComboBox()的函数,用来动态的创建两个组合框,并向组合框中添加选项。
void CTl_hm_tool_testDlg::OnAddComboBox()
{
CString STR_J;
DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_TABSTOP | CBS_DROPDOWN;
CRect m_rect;
m_ListCtrl.GetSubItemRect(2,2,LVIR_LABEL,m_rect);//获取List Control的第2行第2列的rect
tl_comboBox.COMBO1 = new CComboBox;
m_rect.bottom += 180;
tl_comboBox.COMBO1->Create(dwStyle, m_rect, CWnd::FromHandle(m_ListCtrl.m_hWnd),IDC_COMBO_1);//IDC_COMBO_1是我们定义的ID
tl_comboBox.COMBO1->SetParent(&m_ListCtrl);
tl_comboBox.COMBO1->SetFocus();
int N = 10;
foreach(j,N)
{
STR_J.Format("%d",j);
tl_comboBox.COMBO1->AddString(_T(STR_J));
}
tl_comboBox.COMBO1->SetCurSel(0);
CRect m_rect_1;
m_ListCtrl.GetSubItemRect(13,2,LVIR_LABEL,m_rect_1);
tl_comboBox.COMBO2 = new CComboBox;
m_rect_1.bottom += 180;
tl_comboBox.COMBO2->Create(dwStyle, m_rect_1, CWnd::FromHandle(m_ListCtrl.m_hWnd),IDC_COMBO_2);
tl_comboBox.COMBO2->SetParent(&m_ListCtrl);
tl_comboBox.COMBO2->SetFocus();
N = 5;
foreach(k,N)
{
STR_J.Format("%d",k);
tl_comboBox.COMBO2->AddString(_T(STR_J));
}
tl_comboBox.COMBO2->SetCurSel(1);
}
由于我们的组合框是list Control控件中的,所以必须得到list Control中的某行某列的rect,这需要这个函数m_ListCtrl.GetSubItemRect(2,2,LVIR_LABEL,m_rect);来实现。
(5)这个函数的在对话框初始化函数OnInitDialog()中被调用,也可以在其他函数中被调用。到此方法一就可以完成动态的创建的控件了。
2,.方法二的步骤:
(1).直接定义.这里作者也创建了一个结构体
public:
struct Combobox_Create
{
int return_row;//创建Combobox时返回所在的行数
int Row_Insert;//需要插入组合框的行数
CRect rect; //存放需要创建的组合框的范围
CStringArray Config_value;//创建字符串列,用来存放Config_value的值
CMyComboBox combobox;//CComboBox类,用来创建组合框
};
(2).定义了一个数组
Combobox_Create m_combobox[100];
(3).动态创建组合框
for(i=0; i<combobox_nub; i++)
{
m_ListCtrl.GetSubItemRect(m_combobox[i].return_row,2,LVIR_LABEL,m_combobox[i].rect);
m_combobox[i].rect.bottom+=320;
m_combobox[i].combobox.Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | CBS_DROPDOWN, m_combobox[i].rect
,CWnd::FromHandle(m_ListCtrl.m_hWnd), IDC_COMBOBOX);
m_combobox[i].combobox.SetParent(&m_ListCtrl);
m_combobox[i].combobox.SetFocus();
CFont* font = new CFont;
m_combobox[i].combobox.SetFontSize(90,font);
m_combobox[i].combobox.SetItemHeight(0,22);
for(j=0; j<m_combobox[i].Row_Insert; j++)
{
int k = m_combobox[i].return_row;
int sheet_row = Level_nub[k];
SS.ReadRow(Rows,sheet_row+j);
StrContent = Rows.GetAt(7);
m_combobox[i].combobox.AddString(_T(StrContent));
StrContent = Rows.GetAt(8);
m_combobox[i].Config_value.Add(StrContent);
}
m_combobox[i].combobox.SetCurSel(CurSelIndex[i]);
m_combobox[i].combobox.ShowWindow(SW_SHOW);
}
图5 运行的结果
两种方法都可以实现动态的创建组合框控件,读者可以试一下。下一章将会讲将组合框嵌入到List Control控件中,然而由于界面大小的问题,动态创建的组合框无法显示出来,即使拉动滚动条或者滚动鼠标都无法显示组合框的解决方法。并且会在下一章将源码贴出。
- MFC下动态添加控件
- MFC动态添加控件及响应函数
- MFC 单文档 动态控件添加
- Netbean下动态添加控件
- MFC动态创建控件及添加消息响应
- MFC动态创建控件及添加消息响应
- MFC动态创建控件及添加消息响应
- MFC动态创建控件及添加消息响应
- MFC为动态创建的控件添加消息
- MFC 动态创建控件及添加消息响应函数
- MFC动态创建控件及添加消息响应
- MFC动态创建控件(按钮)及添加消息响应
- MFC动态创建控件及添加消息响应
- MFC 手动添加控件
- MFC 添加richedit控件
- MFC 控件添加ToolTip
- MFC 控件添加热键
- MFC 添加动态菜单
- 删除指定目录下所有文件 可以用于指定清空缓存
- C++运算符优先级
- 轮播图+性能分析
- 黑马程序员--Java基础--IO
- 初学Android——闪光灯当做手电筒使用
- MFC下动态添加控件
- Eclipse 安装SVN插件
- EA建模-绘制状态图
- 【Error】JavaWeb: 严重: Failed to initialize end point associated with ProtocolHandler ["http-bio-8080"]
- 2、MyBatis.NET学习笔记-之CodeSmith使用
- poj-3061
- 关于android:configChanges="keyboardHidden|orientation"
- 站在巨人的肩膀上,C++开源库大全
- 谈谈测试用例的分类