MFC控件使用

转载至http://blog.163.com/copy00@126/blog/static/151149979201042585715350/

(一)List Control控件的使用

新近开发了一个摄像机标定的MFC程序,标定完成后期望将求得的摄像机参数直观地显示到应用程序的界面上来。起初的方案是为每一个参数都建立一个Edit控件,并对每一个控件设定一个控制变量,将该变量与相应参数对应起来。这样做是可行的,但当参数众多时比较繁琐。鉴于此,决定在程序中使用List Control控件,将参数以List的形式呈现在界面上。以下是我在基于对话框的MFC程序中添加List Control控件的步骤。
  1. 新加ListControl 控件,属性中的style属性页下的View选择Report。并设置其对应的控制变量如:m_ListCtrl。
  2. 初始化,即设置列。
  m_ListCtrl.InsertColumn(0,"参数名"); //插入列
   m_ListCtrl.InsertColumn(1,"参数值");
  m_ListCtrl.InsertColumn(2,"备注");
  CRect rect3;
  m_ListCtrl.GetClientRect(rect3); //获得当前客户区信息
  m_ListCtrl.SetColumnWidth(0,rect3.Width()/4); //设置列的宽度。
   m_ListCtrl.SetColumnWidth(1,rect3.Width()*2/4);
   m_ListCtrl.SetColumnWidth(2,rect3.Width()/4);
  这部分初始化操作,最好放在对话框类的 OnInitDialog()函数里,自动初始化。
  3. 插入数据
   m_ListCtrl.InsertItem(0,"参数1"); //插入第一个数据,即第0条数据。先插入,然后在修改其他的信息。
   m_ListCtrl.SetItemText(0,1,"参数1值"); //修改第0条数据的其他信息。
   m_ListCtrl.SetItemText(0,2,"无");
  SetItemText()函数负责向列表里添加字符串。当需要添加的是非字符串的数据类型时,需要先转换为字符串类型再用SetItemText()完成添加。假设所需要添加的是double类型的浮点数。
double dbl=1.2345678;
char str[16]={0};
sprintf(str, "%lf", dbl);
m_ListCtrl.InsertItem(0,"参数1");
m_ListCtrl.SetItemText(0,1,str); //等价于m_ListCtrl.SetItemText(0,1,“1.2345678”);
需要注意的是用sprintf族函数时,char数组一定要足够大,否则程序运行时会出现错误提示“ Stack around the variable 'str' was corrupted ”,解决方法是把数组改大一些。  
  4. 删除所有数据。有些程序中需要刷新显示数据,如果直接利用上述方法,则会将当前显示数据追加在前一次数据行的后面,造成随着刷新次数的增加数据行线性增加的问题。解决方法是每次在插入数据之前删除已有数据,使用下面语句:
  m_ListCtrl.DeleteAllItems();   
  5. 如何设置ListView控件的完全行(Full Row)选项。 这个控件有个地方常常很恼人,那就是在报告视图中选中一行时,它只加亮最左边的一个栏目。解决方法:向ListView控件发送一个 VM_SETEXTENDEDLISTVIEWSTYLE消息。
  ::SendMessage(m_ListCtrl.m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);
这条语句可以加在OnInitDialog()函数,也可以加在负责插入数据的代码部分。

VC++ Tab Control控件的使用

1. 新建一个MFC工程, 取名MyTab, 选择Dialog based, 然后Finish.
2. 删除对话框上默认添加的三个控件. 添加Tab Control控件并在Property属性中设置ID为IDC_TABTEST 在More Styles里勾上Bottom. 调速尺寸使其布满整个对话框, 我这边Tab Control的尺寸最后为164X203. 在ClassWizard为其添加变量, 变量名为m_tab. 类型为CTabCtrl.
3. 在对话框的初始化函数OnInitDialog里面添加如下代码:

m_tab.InsertItem( 0 , " 参数一 " );   // 添加参数一选项卡
m_tab.InsertItem( 1 , " 参数二 " );   // 添加参数二选项卡
m_tab.InsertItem( 2 , " 结果 " );     // 添加结果选项卡

4.在对话框资源里面添加三个对话框资源, ID分别命名为IDD_PARA1, IDD_PARA2, IDD_RESULT. 字体为宋体, 字号为9, style为Child, Border为None, 宽度调整为161. 再分别为其添加对应的基于CDialog类CPara1, CPara2, CResult.
5. 在CMyTabDlg类中添加三个成员变量m_para1, m_para2, m_result, 分别是三个子对话框的实例. 代码如下:

CResult m_result;
CPara2 m_para2;
CPara1 m_para1;
6. 在IDD_PARA1对话框上添加静态文本控件内容为"参数一" 再在后面插入一个文本框控件, 用ClassWizard将其关联为一个int型变量,名为m_nPara1;
在IDD_PARA2对话框上添加静态文本控件内容为"参数二" 再在后面插入一个文本框控件, 用ClassWizard将其关联为一个int型变量,名为m_nPara2;
在IDD_RESULT对话框上添加静态文本控件内容为"结果" 再在后面插入一个文本框控件, 用ClassWizard将其关联为一个int型变量,名为m_nResult;
7. 为CPara1类添加成员函数int GetParaValue() 代码如下:


int CPara1::GetParaValue()
{
      return m_nPara1;
}
为CPara2类添加成员函数int GetParaValue() 代码如下:


int CPara2::GetParaValue()
{
      return m_nPara2;
}
为CResult类添加成员函数void SetResultValue(int nResult) 代码如下:


void CResult::SetResultValue( int nResult)
{
      m_nResult = nResult;
}
8. 在IDD_MYTAB_DIALOG对话框的初始化函数OnInitDialog里面添加如下代码:

// 关联对话框,并且将IDC_TABTEST控件设为父窗口
m_para1.Create(IDD_PARA1,GetDlgItem(IDC_TABTEST));
m_para2.Create(IDD_PARA2,GetDlgItem(IDC_TABTEST));
m_result.Create(IDD_RESULT,GetDlgItem(IDC_TABTEST));
    
// 获得IDC_TABTEST客户区大小
CRect rs;
m_tab.GetClientRect( & rs);
// 调整子对话框在父窗口中的位置
rs.top += 1 ;
rs.bottom -= 60 ;
rs.left += 1 ;
rs.right -= 2 ;
    
// 设置子对话框尺寸并移动到指定位置
m_para1.MoveWindow( & rs);
m_para2.MoveWindow( & rs);
m_result.MoveWindow( & rs);

// 分别设置隐藏和显示
m_para1.ShowWindow( true );
m_para2.ShowWindow( false );
m_result.ShowWindow( false );
    
// 设置默认的选项卡
m_tab.SetCurSel( 0 );

9. 添加Tab Control控件的TCN_SELCHANGE事件响应函数OnSelchangeTabtest(NMHDR* pNMHDR, LRESULT* pResult) ,函数体代码如下:

int CurSel = m_tab.GetCurSel();
      switch (CurSel)
      {
      case 0 :
          m_para1.ShowWindow( true );
          m_para2.ShowWindow( false );
          m_result.ShowWindow( false );
          break ;
      case 1 :
          m_para1.ShowWindow( false );
          m_para2.ShowWindow( true );
          m_result.ShowWindow( false );
          break ;
      case 2 :
          m_para1.ShowWindow( false );
          m_para2.ShowWindow( false );
          m_result.ShowWindow( true );
          break ;
      default :
          ;
      }    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值