控件上机指导书.docx
《控件上机指导书.docx》由会员分享,可在线阅读,更多相关《控件上机指导书.docx(26页珍藏版)》请在冰豆网上搜索。
![控件上机指导书.docx](https://file1.bdocx.com/fileroot1/2023-2/9/4758d552-c5a4-4cde-b692-dfd75ba3ee2c/4758d552-c5a4-4cde-b692-dfd75ba3ee2c1.gif)
控件上机指导书
控件示例1
■第一步用AppWizard建立一个基于对话框的MFC应用程序。
将新建工程命名为TestCtrl1,在AppWizard的Step1对话框中选择Dialogbased选项,其它按照默认设置。
AppWizard自动建立一个作为应用程序主窗口的对话框模板IDD_TESTCTRL1_DIALOG及其对应的对话框类CTestCtrl1Dlg。
提示:
对该对话框的使用与普通对话框并没有什么不同,只不过在程序启动后对话框会自动显示出来,而当用户关闭对话框后,应用程序也就终止了。
如果读者观察CTestCtrl1App:
:
InitInstance函数就会发现,该函数调用DoModal来显示一个CTestCtrl1Dlg对话框,并使m_pMainWnd指针指向CTestCtrl1Dlg对象,从而使该对话框成为程序的主窗口。
■第二步设计IDD_TESTCTRL1_DIALOG对话框模板。
删除该模板上除Cancel按钮以外的控件。
并根据图6.2和表6.5,向IDD_TESTCTRL1_DIALOG对话框模板中加入控件。
表6.5控件属性
控件类型
ID
标题
其他属性
静态图片
IDC_STATIC_BITMAP
Type列表框选择Bitmap
选中Centerimage属性
静态文本
IDC_STATIC_TITLE
标题
缺省
组框
缺省
选择图片
缺省
单选按钮
IDC_RADIO1
女士
选中Group属性
单选按钮
IDC_RADIO2
夫妇
缺省
组框
缺省
选择标题
缺省
单选按钮
IDC_RADIO3
女士
选中Group属性
单选按钮
IDC_RADIO4
夫妇
缺省
组框
缺省
改变
缺省
复选框
IDC_CHECK1
同时改变
缺省
命令按钮
IDC_BUTTON_ALTER
修改
选中Defaultbutton属性
命令按钮
IDCANCEL
关闭
缺省
提示:
因为顺序添加的单选按钮被看成是一组,该组中只有一个单选按钮能被选中;而本例中IDC_RADIO1和IDC_RADIO2为一组,IDC_RADIO3和IDC_RADIO4为一组,因此一定要选中IDC_RADIO3的Group属性。
■第三步利用“InsertResource”对话框为应用程序添加位图。
添加位图资源的方法是:
选择【Insert】、【Resource】或使用组合键【Ctrl+R】,打开“InsertResource”对话框,在“ResourceType”中选择“Bitmap”,单击【Import】按钮,打开“ImportResource”对话框,浏览并选择要添加的bmp文件,单击【Import】按钮系统就会自动为当前应用程序添加一个位图资源,位图编辑器随之打开,第一个位图资源的默认ID为IDB_BITMPA1,可以在其属性对话框中修改。
用这种方法添加两个位图资源,ID分别为IDB_BITMPA1和IDB_BITMPA2。
■第四步利用ClassWizard为CTestCtrl1Dlg类添加控件关联变量,如表6.6所示。
表6.6CTestCtrl1Dlg类的控件关联变量
控件ID
变量类型
变量名
IDC_CHECK1
CButton
m_ctrCheck
IDC_STATIC_BITMAP
CStatic
m_ctrBmp
IDC_STATIC_TITLE
CString
m_strTitle
■第五步为CTestCtrl1Dlg类添加成员变量,如表6.7所示。
表6.7CTestCtrl1Dlg类成员变量
变量类型
变量名称
用途
BOOL
m_pBool
记录图片控件显示的是哪个位图
CBitmap
m_cBmp
加载位图
■第六步用ClassWizard为CTestCtrl1Dlg类添加控件消息处理函数,如表6.8所示。
表6.8CTestCtrl1Dlg的控件通知消息处理函数
控件ID
消息
消息处理函数
IDC_RADIO1
BN_CLICKED
OnRadio1(缺省名)
IDC_RADIO2
BN_CLICKED
OnRadio2(缺省名)
IDC_RADIO3
BN_CLICKED
OnRadio3(缺省名)
IDC_RADIO4
BN_CLICKED
OnRadio4(缺省名)
IDC_BUTTON_ALTER
BN_CLICKED
OnButtonAlter(缺省名)
■第七步编写CTestCtrl1Dlg:
:
OnRadio1()消息处理函数。
voidCTestCtrl1Dlg:
:
OnRadio1()
{
if(!
m_pBool)
{
m_cBmp.DeleteObject();//从内存中删除与m_cBmp关联的GDI结构
m_cBmp.LoadBitmap(IDB_BITMAP1);//加载位图1
m_ctrBmp.SetBitmap(HBITMAP(m_cBmp));//在图片控件中显示位图1
m_pBool=true;//记录图片控件中显示的是位图1
}
}
■第八步编写CTestCtrl1Dlg:
:
OnRadio2()消息处理函数。
voidCTestCtrl1Dlg:
:
OnRadio2()
{
if(m_pBool)
{
m_cBmp.DeleteObject();//从内存中删除与m_cBmp关联的GDI结构
m_cBmp.LoadBitmap(IDB_BITMAP2);//加载位图2
m_ctrBmp.SetBitmap(HBITMAP(m_cBmp));//在图片控件中显示位图2
m_pBool=false;//记录图片控件中显示的是位图2
}
}
■第九步编写CTestCtrl1Dlg:
:
OnRadio3()消息处理函数。
voidCTestCtrl1Dlg:
:
OnRadio3()
{
CButton*pBtn=(CButton*)GetDlgItem(IDC_RADIO3);
//获取单选按钮IDC_RADIO3控件的窗口指针
pBtn->GetWindowText(m_strTitle);
//获得IDC_RADIO3的标题,并赋给静态文本框的字符串型关联变量
UpdateData(false);//将数据从文本框的关联变量传至控件显示
}
■第十步编写CTestCtrl1Dlg:
:
OnRadio4()消息处理函数。
voidCTestCtrl1Dlg:
:
OnRadio4()
{
CButton*pBtn=(CButton*)GetDlgItem(IDC_RADIO4);
pBtn->GetWindowText(m_strTitle);
UpdateData(false);
}
■第十一步编辑CTestCtrl1Dlg:
:
OnButtonAlter()消息处理函数。
voidCTestCtrl1Dlg:
:
OnButtonAlter()
{
intn=m_ctrCheck.GetState();//获取复选框IDC_CHECK1的选择状态
if(m_pBool)//若之前显示的是位图1,则改变为显示位图2
{
CheckRadioButton(IDC_RADIO1,IDC_RADIO2,IDC_RADIO2);
//把IDC_RADIO2设为选中状态
m_cBmp.DeleteObject();
m_cBmp.LoadBitmap(IDB_BITMAP2);
m_ctrBmp.SetBitmap(HBITMAP(m_cBmp));
m_pBool=false;
if(n==1)//若复选框为选中状态,则改变静态文本框的内容,并改变单选按钮状态
{
CButton*pBtn=(CButton*)GetDlgItem(IDC_RADIO4);
pBtn->GetWindowText(m_strTitle);
CheckRadioButton(IDC_RADIO3,IDC_RADIO4,IDC_RADIO4);
//把IDC_RADIO4设为选中状态
UpdateData(false);
}
}
else//若之前显示的是位图2,则改变为显示位图1
{
CheckRadioButton(IDC_RADIO1,IDC_RADIO2,IDC_RADIO1);
//把IDC_RADIO1设为选中状态
m_cBmp.DeleteObject();
m_cBmp.LoadBitmap(IDB_BITMAP1);
m_ctrBmp.SetBitmap(HBITMAP(m_cBmp));
m_pBool=true;
if(n==1)//若复选框为选中状态,则改变静态文本框的内容,并改变单选按钮状态
{
CButton*pBtn=(CButton*)GetDlgItem(IDC_RADIO3);
pBtn->GetWindowText(m_strTitle);
CheckRadioButton(IDC_RADIO3,IDC_RADIO4,IDC_RADIO3);
//把IDC_RADIO3设为选中状态
UpdateData(false);
}
}
}
■第十二步修改对话框初始化函数CTestCtrl1Dlg:
:
OnInitDialog()。
添加如下代码:
BOOLCTestCtrl1Dlg:
:
OnInitDialog()
{……
m_cBmp.LoadBitmap(IDB_BITMAP1);//加载位图1
m_ctrBmp.SetBitmap(HBITMAP(m_cBmp));//显示位图1
m_pBool=true;//记录图片控件显示的是位图1
CheckRadioButton(IDC_RADIO1,IDC_RADIO2,IDC_RADIO1);//将IDC_RADIO1设为选中状态
CheckRadioButton(IDC_RADIO3,IDC_RADIO4,IDC_RADIO3);//将IDC_RADIO3设为选中状态
CButton*pBtn=(CButton*)GetDlgItem(IDC_RADIO3);
pBtn->GetWindowText(m_strTitle);//将静态文本的内容设置为IDC_RADIO3的标题
UpdateData(false);//将数据从文本框的关联变量传至控件显示
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
■第十三步创建和运行TestCtrl1.exe应用程序。
控件示例2
■第一步用AppWizard建立一个基于对话框的MFC应用程序。
AppWizard会自动建立一个用于应用程序主窗口的对话框模板IDD_TESTCTRL2_DIALOG及其对应的对话框类CTestCtrl2Dlg。
■第二步设计IDD_TESTCTRL2_DIALOG对话框模板。
将该模板上除Cancel按钮以外的控件都删除掉,并根据图6.7和表6.22,向对话框模板中加入控件。
■
表6.22控件属性
控件类型
ID
标题
其他属性
静态文本
缺省
姓名:
缺省
静态文本
缺省
年龄:
缺省
静态文本
IDC_STATIC_INDICATOR
缺省
静态文本
缺省
记录:
缺省
静态文本
缺省
选择:
缺省
组合框
IDC_COMBO_BOX
缺省
组框
缺省
性别:
缺省
单选按钮
IDC_RADIO_BOY
男
缺省
单选按钮
IDC_RADIO_GIRL
女
缺省
列表框
IDC_LIST_BOX
在Selection栏中选择Extended,去掉Sort属性
编辑框
IDC_EDIT_MULTI
选择Multiline,Verticalscroll,AutoVScroll和Wantreturn属性
滚动条
IDC_SCROLLBAR
缺省
命令按钮
IDC_BUTTON_ADD
添加
缺省
命令按钮
IDC_BUTTON_ALTER
修改
缺省
命令按钮
IDC_BUTTON_DELETE
删除
缺省
命令按钮
ID_BUTTON_CLEAR
清除
缺省
命令按钮
IDCANCEL
关闭
缺省
■第三步利用ClassWizard为CTestCtrl2Dlg类加入成员变量,如表6.23所示:
表6.23CTestCtrl2Dlg类的成员变量
控件ID
变量类型
变量名
IDC_COMBO_BOX
CString
m_strName
IDC_COMBO_BOX
CComboBox
m_comboBox
IDC_EDIT_MULTI
CEdit
m_multiEdit
IDC_LIST_BOX
CListBox
m_listBox
IDC_SCROLLBAR
CScrollBar
m_scrollBar
IDC_STATIC_INDICATOR
CString
m_strAge
IDC_STATIC_INDICATOR
CStatic
m_Indicator
■第四步用ClassWizard为CTestCtrl2Dlg类加入通知消息处理函数,如表6.24所示。
表6.24CTestCtrl2Dlg的通知消息处理函数
对象ID
消息
消息处理函数
IDC_BUTTON_ADD
BN_CLICKED
OnButtonAdd(缺省名)
IDC_BUTTON_ALTER
BN_CLICKED
OnButtonAlter(缺省名)
IDC_BUTTON_DELETE
BN_CLICKED
OnButtonDelete(缺省名)
IDC_BUTTON_CLEAR
BN_CLICKED
OnButtonClear(缺省名)
IDCANCEL
BN_CLICKED
OnCancel(缺省名)
IDC_COMBO_BOX
CBN_SELCHANGE
OnSelchangeCombobox(缺省名)
CTestCtrl2Dlg
WM_HSCROLL
OnHScroll(缺省名)
■第五步编写CTestCtrl2Dlg:
:
OnButtonAdd()消息处理函数。
voidCTestCtrl2Dlg:
:
OnButtonAdd()
{
UpdateData();
m_strName.TrimLeft();//去掉空格
if(m_strName.IsEmpty())//若为空
{
MessageBox("学生名字无效!
");
return;
}
intnIndex=m_comboBox.FindStringExact(-1,m_strName);//查找匹配项
if(nIndex!
=CB_ERR)//若有匹配项则不用添加
{
MessageBox("该同学的名字已添加!
");
return;
}
CStringstrData,strSex;
UINTnID=GetCheckedRadioButton(IDC_RADIO_BOY,IDC_RADIO_GIRL);
//获取被选中的单选按钮ID号
GetDlgItemText(nID,strSex);//获取被选中单选按钮的标题
strData.Format("%s,%s,%s",m_strName,strSex,m_strAge);//格式化字符串
nIndex=m_comboBox.AddString(m_strName);//添加组合框列表项
m_comboBox.SetItemDataPtr(nIndex,newCString(strData));//添加表项关联数据
m_listBox.AddString(strData);//添加列表框
}
■第六步编写CTestCtrl2Dlg:
:
OnButtonAlter()消息处理函数。
voidCTestCtrl2Dlg:
:
OnButtonAlter()
{
UpdateData();
intnIndex=m_comboBox.FindStringExact(-1,m_strName);//在组合框中查找匹配项
if(nIndex!
=CB_ERR)//若找到
{
CStringstrData,strSex;
intlistIndex;
strData=*(CString*)m_comboBox.GetItemDataPtr(nIndex);//获取表项关联数据
listIndex=m_listBox.FindString(-1,strData);//在列表框查找匹配项
delete(CString*)m_comboBox.GetItemDataPtr(nIndex);//在组合框中删除该表项
UINTnID=GetCheckedRadioButton(IDC_RADIO_BOY,IDC_RADIO_GIRL);
GetDlgItemText(nID,strSex);
strData.Format("%s,%s,%s",m_strName,strSex,m_strAge);
m_comboBox.SetItemDataPtr(nIndex,newCString(strData));
m_listBox.DeleteString(listIndex);
m_listBox.InsertString(listIndex,strData);
}
UpdateData(false);
}
■第七步编写CTestCtrl2Dlg:
:
OnButtonDelete()消息处理函数。
voidCTestCtrl2Dlg:
:
OnButtonDelete()
{
inti,count;
int*pBuffer;
count=m_listBox.GetSelCount();//获得选择项的数目
if(count<=0)return;
pBuffer=newint[count];
m_listBox.GetSelItems(count,pBuffer);//获取选择项的索引
for(i=count-1;i>=0;i--)//倒序删除选择项
{
CStringstrData,strName;
intnIndex;
m_listBox.GetText(pBuffer[i],strData);//获取指定列表项的字符串
nIndex=strData.Find(',');
strName=strData.Left(nIndex);//从中提取出姓名存入strName
nIndex=m_comboBox.FindStringExact(-1,strName);//获取与strName匹配项的索引
delete(CString*)m_comboBox.GetItemDataPtr(nIndex);//删除nIndex项的关联信息
m_comboBox.DeleteString(nIndex);//删除nIndex表项
m_listBox.DeleteString(pBuffer[i]);//删除列表框的选择表项
}
UpdateData(false);
deletepBuffer;
}
注意:
这里是倒序删除的,如果按顺序删除,则会使选择项的索引产生错位。
■第八步编写CTestCtrl2Dlg:
:
OnButtonClear()消息处理函数。
voidCTestCtrl2Dlg:
:
OnButtonClear()
{
m_multiEdit.SetSel(0,-1);//选择编辑框的全部正文
m_multiEdit.ReplaceSel("");//用空串替换选中正文,即清除正文
}
■第九步编写CTestCtrl2Dlg:
:
OnCancel()消息处理函数。
voidCTestCtrl2Dlg:
:
OnCancel()
{//获取组合框的表项个数,逐个删除
for(intnIndex=m_comboBox.GetCount()-1;nIndex>=0;nIndex--)
{
delete(CString*)m_comboBox.GetItemDataPtr(nIndex);
}
CDialog:
:
OnCancel();
}
■第十步编写CTestCtrl2Dlg:
:
OnSelchangeComboBox()消息处理函数。
voidCTestCtrl2Dlg:
:
OnSelchangeComboBox()
{
intlength=m_multiEdit.GetWindowTextLength();//获取编辑框的正文长度
CStringstr,strData;
m_multiEdit.SetSel(-1,0);//取消正文的选择
m_multiEdit.SetSel(length,length);//将插入符移动到编辑正文的末尾
m_comboBox.GetLBText(m_comboBox.GetCurSel(),str);//获取指定列表项的字符串
strData=*(CString*)m_comboBox.GetItemDataPtr(m_comboBox.GetCurSel());
//获取表项的关联数据
str=str+"selected\r\n"+strData+"\r\n";
m_multiEdit.ReplaceSel(str);//用指定字串替换编辑框正文
}
提示:
本例中插入编辑正文的方法是先调用CEdit:
:
SetSel移动插入符到指定位置(必要时要滚动以使该位置可见),然后再调用CEdit:
:
ReplaceSel插入新的正文,这样做的好处是编辑框总是滚动到新修改过的地方,从而使得新修改过的地方总是可见的。
■第十一步编写CTestCtrl2Dlg:
:
OnHScroll()消息处理函数。
voidCTestCtrl2Dlg:
:
OnHScroll(UINTnSBCode,UINTnPos,CScrollBar*pScrollBar)
{
intnScrollMin,nScrollMax,nScrollPos;
intnPageSize;
CSt