计划一个月内基本掌握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
- 在Combo Box控件属性的Data标签里面添加,一行表示Combo Box下拉列表中的一行。换行用ctrl+回车。
- 利用函数 AddString() 向 Combo Box 控件添加 Items,如:
m_cbExample.AddString(“StringData1”);
m_cbExample.AddString(“StringData2”);
m_cbExample.AddString(“StringData3”); - 也可以调用函数 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 ); 设置输入框中可输入的最大字符数。
- 获取下拉边框中的名字
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
}