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控件中,然而由于界面大小的问题,动态创建的组合框无法显示出来,即使拉动滚动条或者滚动鼠标都无法显示组合框的解决方法。并且会在下一章将源码贴出。


0 0
原创粉丝点击