MFC学习(实时更新)

本文详细介绍了如何在VC++中使用MFC进行界面控件的操作,包括布局设计、控件大小调整、根据对话框大小动态调整控件、控件显示隐藏、编辑框内容获取、下拉列表框操作、列表控件、复选框和单选按钮的使用,以及图片控件的加载等。同时,文章提供了具体的代码示例和解决常见问题的方案,对于理解MFC界面编程非常有帮助。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计划一个月内基本掌握MFC界面常规控件的应用以及相关知识。
1.布局设计
(博视)
AddWnd(GetDlgItem(nArrBtnID[i]), 0, 35, CLayout::eSizePolicy_Fixed)
GetDlgItem( ID )输出控件指针
CLayout::eSizePolicy_Fixed 布局类型“固定型”,

enum SizePolicy
	{
		eSizePolicy_Fixed = 0, // 固定
		eSizePolicy_Expand = 1, // 扩展
		eSizePolicy_Preferred = 2, // 默认
	};

SetWindowPos()
函数使用更灵活,多用于只修改控件位置而大小不变或只修改大小而位置不变的情况:
BOOL SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);
第一个参数我不会用,一般设为NULL;
x、y控件位置;cx、cy控件宽度和高度;
nFlags常用取值:
SWP_NOZORDER:忽略第一个参数;
SWP_NOMOVE:忽略x、y,维持位置不变;
SWP_NOSIZE:忽略cx、cy,维持大小不变;

CWnd *pWnd;  
pWnd = GetDlgItem( IDC_BUTTON1 );    //获取控件指针,IDC_BUTTON1为控件ID号  
pWnd->SetWindowPos( NULL,50,80,0,0,SWP_NOZORDER | SWP_NOSIZE );    //把按钮移到窗口的(50,80)处  
pWnd = GetDlgItem( IDC_EDIT1 );  
pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER | SWP_NOMOVE );    //把编辑控件的大小设为(100,80),位置不变  
pWnd = GetDlgItem( IDC_EDIT1 );  
pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER );    //编辑控件的大小和位置都改变  

VC++之根据对话框大小调整控件大小
1、在对话框类中加入成员变量CRect m_rect;用于保存对话框大小变化前的大小;
2、在对话框的OnInitDialog()函数中获取对话框创建时的大小:GetClientRect(&m_rect);
3、在WM_SIZE的响应函数OnSize()中加入以下代码:

CWnd * pWnd;  
pWnd = GetDlgItem(IDC_LIST);      // 获取控件句柄   
if (pWnd) // 判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建   
{  
          CRect rect;    // 获取控件变化前大小   
          pWnd -> GetWindowRect( & rect);  
          ScreenToClient( & rect); // 将控件大小转换为在对话框中的区域坐标  
          //  cx/m_rect.Width()为对话框在横向的变化比例   
          rect.left = rect.left * cx / m_rect.Width(); /**/ /// //调整控件大小   
         rect.right = rect.right * cx / m_rect.Width();  
         rect.top = rect.top * cy / m_rect.Height();  
         rect.bottom = rect.bottom * cy / m_rect.Height();  
         pWnd -> MoveWindow(rect); // 设置控件大小   
}   
GetClientRect( & m_rect); // 将变化后的对话框大小设为旧大小  

解决一个BUG:
加上 if(nType!=1){}
或者 if(nType!=SIZE_MINIMIZED ){}
不然窗口最小化后再恢复就产生BUG(整数除以0).

控件显示

GetDlgItem(IDC_BTN_MANUAL_TRATTER_COM)->EnableWindow(true)//false不显示,灰色

编辑框控件
编辑控件ID:IDC_EDIT_FOBC_P1,

GetDlgItemText(IDC_EDIT_FOBC_P1,strP1);//将控件中的内容赋值给strP1

下拉列表框COMBOX
1、假定已经创建了一个Dialog,并且从控件工具箱将 Combo Box 控件拖放到上面。打开 Class Wizard,添加控件对应变量,如:CComboBox m_cbExamble;在后面的代码中会不断使用这个变量。
2、向控件添加 Items

  1. 在Combo Box控件属性的Data标签里面添加,一行表示Combo Box下拉列表中的一行。换行用ctrl+回车。
  2. 利用函数 AddString() 向 Combo Box 控件添加 Items,如:
    m_cbExample.AddString(“StringData1”);
    m_cbExample.AddString(“StringData2”);
    m_cbExample.AddString(“StringData3”);
  3. 也可以调用函数 InsertString() 将 Item 插入指定位置 nIndex,如:
    m_cbExample.InsertString( nIndex, “StringData” );
    3、从控件得到选定的Item
    假设在控件列表中已经选定某项,现在要得到被选定项的内容,首先要得到该项的位置,然后得到对应位置的内容。这里会用到两个函数,如:
    int nIndex = m_cbExample.GetCurSel();
    CString strCBText;
    m_cbExample.GetLBText( nIndex, strCBText);
    这样,得到的内容就保存在 strCBText 中。
    若要选取当前内容,可调用函数GetWindowText(strCBText)。
    4、在控件中查找给定Item
    这种操作一般用于在程序中动态修改控件中该项的值,可以用函数FindStringExact() 精确匹配,如:
    int nIndex = m_cbExample.FindStringExact( nStartAfter, “value to be found”);
    nStartAfter指明从哪一行开始查找。如果查找成功,返回的是该项的位置;否则,返回CB_ERR。
    也可以选中包含指定字符串的项,如:
    int nIndex = m_cbExample.SelectString( nStartAfter, “value to be selected”);
    5、删除控件中的Item
    该操作可以利用函数DeleteString(),需要指定被删除项的位置,如:
    m_cbExample.DeleteString(nIndex);
    也可以使用函数ResetContent(),清除目前的所有项,如:
    m_cbExample.ResetContent();
    6、显示控件中的某项
    int nIndex = m_cbExample.GetCurSel(); //当前选中的项
    m_cbExample.SetCurSel(nIndex); //设置第nIndex项为显示的内容
    7、得到或设置输入框中被选中的字符位置
    DWORD GetEditSel( ) /BOOL SetEditSel( int nStartChar, int nEndChar );
    BOOL LimitText( int nMaxChars ); 设置输入框中可输入的最大字符数。
  1. 获取下拉边框中的名字
GetDlgItemText(IDC_COMBO_COMMAND_LIST,strCmd);

列表控件
定义列表控件 CListCtrl m_listCtrlCmdRemark

DWORD dwStyle = m_listCtrlCmdRemark.GetExtendedStyle();//获取列表扩展属性
	dwStyle |= LVS_EX_GRIDLINES;//网格线
	dwStyle |= LVS_EX_FULLROWSELECT;//选择所有行
	dwStyle |= LVS_EX_SINGLEROW;//单行
	m_listCtrlCmdRemark.SetExtendedStyle(dwStyle);//设置列表属性
	
	CRect rtList;
	m_listCtrlCmdRemark.GetClientRect(&rtList);//获取列表区域

	m_listCtrlCmdRemark.InsertColumn(0, _T("指令"), 0, 100);//插入第一列,名字为指令,第三个是对齐方式:分别为左对齐,右对齐和中心对齐,设置为0是左对齐。第四个是宽度。
	m_listCtrlCmdRemark.InsertColumn(1, _T("参数描述"), 0, 200);
	m_listCtrlCmdRemark.InsertColumn(2, _T("功能描述"), 0, 150);

InsertItem()插入行:

int nItem = -1;

	nItem = m_listCtrlCmdRemark.InsertItem(nItem+1, _T("拍照指令"));//第一行插入“拍照指令”
	for (int i = 0; i < m_CmdRemardRes.m_vSearchCmd.size(); i++)
	{
		nItem = m_listCtrlCmdRemark.InsertItem(nItem+1, m_CmdRemardRes.m_vSearchCmd[i].strCmd);//第二行第一列名字
		m_listCtrlCmdRemark.SetItemText(nItem, 1, m_nLanguage == 0 ?  m_CmdRemardRes.m_vSearchCmd[i].strChsParam : m_CmdRemardRes.m_vSearchCmd[i].strEnParam);//第二行行第2列
		m_listCtrlCmdRemark.SetItemText(nItem, 2, m_nLanguage == 0 ?  m_CmdRemardRes.m_vSearchCmd[i].strChsRemark : m_CmdRemardRes.m_vSearchCmd[i].strEnRemark);//第二行行第3列
	}

CHCK BOX控件
1.设定Check Box为 选中状态
((CButton*)GetDlgItem(ID号))->SetCheck(TRUE);
(SetCheck(FALSE)) 为不选中,如果想初始化为选中状态,则在InitDlg函数中加入下面这段语句。
( (CButton*)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE);
2.检查Check Box是否为选中状态
可使用GetCheck()这个函数,如下:
if(BST_CHECKED==((CButton*)GetDlgItem(IDC_RADIO1))->GetCheck()) 判断是否选中;
if(BST_UNCHECKED==((CButton*)GetDlgItem(IDC_RADIO3))->GetCheck()) 判断是否未选中。
3.还可以通过添加事件,例如选中后启动按钮,和重置按钮。

RADIO BOX控件
radio控件与check控件差不多:

((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE);//选上
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(FALSE);//不选上
((CButton *)GetDlgItem(IDC_RADIO1))->GetCheck();返回1表示选上,0表示没选上

分组过程;
首先ctrl+D,单击排序
其次
每组的第一个单选按钮设置属性:Group,Tabstop,Auto;其余按钮设置属性Tabstop,Auto。如:
Radio1、Radio2、Radio3为一组,Radio4、Radio5为一组
设定Radio1属性:Group,Tabstop,Auto
设定Radio2属性:Tabstop,Auto
设定Radio3属性:Tabstop,Auto

设定Radio4属性:Group,Tabstop,Auto
设定Radio5属性:Tabstop,Auto
PICTURE CONTROL控件
1)将上面添加的图片控件的Image属性IDB_BITMAP1清空,Type属性不变。
2)修改图片控件的ID为IDC_PICTURE_STATIC,然后为其添加CStatic类型控件变量m_Picture。(若不修改ID则无法为其添加控件变量)
3)在对话框下方添加一按钮控件,Caption属性改为“加载图片”,ID设为IDC_LOAD_PIC_BUTTON。
4)为按钮IDC_LOAD_PIC_BUTTON添加点击消息的处理函数CExample27Dlg::OnBnClickedLoadPicButton(),然后修改此函数的函数实。

 void CExample26Dlg::OnBnClickedLoadPicButton()
{
	// TODO:  在此添加控件通知处理程序代码
	CBitmap bitmap;  // CBitmap对象,用于加载位图   
	HBITMAP hBmp;    // 保存CBitmap加载的位图的句柄   
 
	bitmap.LoadBitmap(IDB_BITMAP1);  // 将位图IDB_BITMAP1加载到bitmap  
	hBmp = (HBITMAP)bitmap.GetSafeHandle();  // 获取bitmap加载位图的句柄  
	m_Picture.SetBitmap(hBmp);    // 设置图片控件m_Picture的位图图片为IDB_BITMAP1   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值