VC++程序实例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VC++6.0 实例教案----------------沈阳工业大学理学院
VC 程序设计实例教案:
一个最简单的程序:
#include<iostream.h>
void main()
{
cout<<”Hello,World!\n”;
}
说明:
main:表示主函数(每个C++程序必须并且只有一个主函数)
{}:函数体所在的范围:
cout:输出到屏幕
《:插入符(插入到cout 中,将后面的内容输出到屏幕
\n:换行符(输出“Hello World!后换行)
iostream.h: 头文件
#include:预处理指令:
C++程序的组成:
1.预处理命令(#开头,包含三类:宏定义命令、文件包含命令、条件编译命令)
2.函数(可以使用库函数和自定义函数)
3.语句(组成程序的基本单元)
4.变量和对象(对象C++指的是类的实例)
5.输入和输出
6.注释:用//开头
输出的格式:
//cout 的格式输出(P38)
#include<iostream.h>
void main()
{
int nNum=1234;
double fNum=12.3456789;
cout<<"1234567890"<<endl;
cout.width(10);
cout<<nNum<<'\n'<<endl;
cout.width(10);
cout<<fNum<<endl;
cout<<cout.precision(4)<<endl;
cout<<fNum<<endl;
1VC++6.0 实例教案----------------沈阳工业大学理学院
}
输入流(cin)(获得键盘的输入值)(P39)
#include<iostream.h>
void main()
{
int nNum;
co ut<<”Please Input a Hex integer:”;
cin>>hex>>nNum;
cout<<”Oct\t”<<oct<<nNum<<endl;
cout<<”Dec\t”<<dec<<nNum<<endl;
cout<<”Hex\t”<<hex<<nNum<<endl;
}
选择语句:
条件语句:
if 语句:
形式为:
if(<表达式>)<语句1>
[else<语句2>]
示例://两个整数大小比较(P39)
#include<iostream.h>
void main()
{
int nNum1,nNum2;
cout<<"Please input two integer numbers:";
cin>>nNum1;
cin>>nNum2;
if(nNum1!=nNum2)
if(nNum1>nNum2)
cout<<nNum1<<">"<<nNum2<<endl;
else
cout<<nNum2<<"<"<<nNum1<<endl;
else
cout<<nNum1<<"="<<nNum2<<endl;
}
开关语句:switch
格式:
switch(<表达式>)
{
2VC++6.0 实例教案----------------沈阳工业大学理学院case<常量表达式1>:[语句1]
case<常量表达式2>:[语句2]
……
case<常量表达式n>:[语句n]
[default :[语句n+1]
}
示例://根据成绩输出相应的分数段(P41)
#include<iostream.h>
void main()
{
char chGrade;
cout<<"Please input a char:";
cin>>chGrade;
switch(chGrade)
{
case'A':
case'a':cout<<"90~100\n";
break;
case'B':
case'b':cout<<"80~90\n";
break;
case'C':
case'c':cout<<"70~80\n";
break;
case'D':
case'd':cout<<"60~70\n";
break;
case'E':
case'e':cout<<"<60\n";
break;
default:cout<<"Error"<<endl;
}
}
循环语句:
while 循环语句
格式:while(<表达式>)<语句>
//求整数1~50 的和,用while 语句(P42)
#include<iostream.h>
3VC++6.0 实例教案----------------沈阳工业大学理学院void main()
{
int nNum=1,nTotal=0;
while(nNum<=50)
{
nTotal+=nNum;
nNum++;
}
cout<<"The sum from 1 to 50 is "<<nTotal<<endl;
}
do whilw 循环语句:
格式:
do<语句>
while(<表达式>)
//求整数1~50 的和,用d0-while 语句(P43)
#include<iostream.h>
void main()
{
int nNum=1,nTotal=0;
do{
nTotal+=nNum;
nNum++;
}while(nNum<=50);
cout<<"The sum from 1 to 50 is "<<nTotal<<endl;
}
for 循环语句:
格式:
for([表达式1];[表达式2];[表达式])<语句>
//用for 语句求1~50 之和(P43)
#include<iostream.h>
void main()
{
int nTotal=0;
for(int nNum=1;nNum<=50;nNum++)
{
nTotal+=nNum;
}
cout<<"The sum from 1 to 50 is: "<<nTotal<<endl;
4VC++6.0 实例教案----------------沈阳工业大学理学院}
break 和continue 语句:(跳出循环和重新开始循环)//用中断语句求0~100 之间的不能被7 整除的数(P45) #include<iostream.h>
void main()
{
for(int nNum=1;nNum<=100;nNum++)
{
if(nNum%7==0)continue;
cout<<nNum<<" ";
}
}
数组:
格式:
<类型><数组名>[<常量表达式1>][<常量表达式2>]…示例:把五个整数按从小到大顺序排列(P47)
#include<iostream.h>
void main()
{
int a[5]={-50,7,20,40,13};
for(int i=0;i<5;i++)
{
for(int j=i+1;j<5;j++)
{
if(a[i]>a[j])
{
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
cout<<a[i]<<" ";
}
}
指针:
指针变量是存放内存地址的变量。
指针变量的定义:
5VC++6.0 实例教案----------------沈阳工业大学理学院
<类型名>*<指针变量名1>[,*<指针变量名2>,…];
*是定义指针变量的说明符(取值运算符),&是取地址运算符如:int *p=&a(指向整形变量的指针其值等于 a 的地址
示例:输入两个整数,按大小顺序输出:(P53)
#include<iostream.h>
void main()
{
int *p1,*p2,*p,a,b;
cout<<"输入两个整数";
cin>>a;
cin>>b;
p1=&a;
p2=&b;
if(a<b)
{
p=p1;
p1=p2;
p2=p;
}
cout<<"a="<<a<<",b="<<b<<endl;
cout<<"最大值是:"<<*p1<<",最小值是:"<<*p2<<endl;
}
指针与数组:
数组中第一个元素的地址就是数组的首地址:
如:
int a[5];
int *pi;
则:pi=&a[0];和pi=a;是等价的。
示例:分析程序输出结果。
(P54)
#include<iostream.h>
void main()
{
int a[]={5,9,8,7,9};
int y,*p=&a[2];
y=(*--p)++;
cout<<y<<endl;
}
(结果为6)
6VC++6.0 实例教案----------------沈阳工业大学理学院示例:分析程序输出结果(P55)
#include<iostream.h>
void main()
{
int a[3][3]={1,2,3,4,5,6,7,8,9};
int y=0;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
y+=(*(a+i))[j];//*(a+I)等价于a[I]
cout<<y<<endl;
}
(实际上该程序就是求各个元素之和)
函数:
函数的定义:
<函数类型><函数名>(<形参类型表>)
{
<若干语句>
}
如:
//改变字符串的内容(P66)
#include<iostream.h>
#include<string.h>
void change(char ch[5]);
void main()
{
char name[5]="Ding";
cout<<name<<endl;//输出Ding
change(name);//调用时只指定数组名
cout<<name<<endl;//输出Zhen
}
void change(char ch[5])
{
strcpy(ch,"Zhen");//strcpy 是C++中的库函数,其包含文件为string.h }
如:
//设置多个默认参数的函数示例
#include<iostream.h>
7VC++6.0 实例教案----------------沈阳工业大学理学院
void display(int a,int b=2,int c=3)//在函数的定义中设置默认参数
{
cout<<"a="<<a<<",b="<<b<<",c="<<c<<endl;
}
void main()
{
display(1);
display(1,5);
display(1,7,9);
}
递归函数的调用:
//编程求Fibonacci 数列的第n 项(P69 示例)
−+ −
=
=
=
( 1) ( 2)
1( 1 2 )
0( 0 )
( )
f n f n
n or
n
f n 当时
当时
#include<iostream.h>
long fib(int n);
void main()
{
cout<<fib(9)<<endl;
}
long fib(int n)
{
{
case 0:
return 0;
case 1:
case 2:
return 1;
}
return fib(n-1)+fib(n-2);
}
类:
类是逻辑上相关的函数与数据的封装,它是对所处理的问题的抽象描述。
#include<iostream.h>
8VC++6.0 实例教案----------------沈阳工业大学理学院
class clock //时钟类的定义
{
public:
void settime(int newh=0,int newm=0,int news=0);
void showtime();
private:
int hour,minute,second;
};
//时钟类成员函数的具体实现
void clock::settime(int newh,int newm,int news)
{
hour=newh;
minute=newm;
second=news;
}
inline void clock::showtime()
{
cout<<hour<<":"<<minute<<":"<<second<<endl;
}
//主函数
void main()
{
clock myclock; //定义对象myclock
cout<<"First time set and output:"<<endl;
myclock.settime();
myclock.showtime();
cout<<"Second time set and output:"<<endl;
myclock.settime(8,30,30);
myclock.showtime();
}
构造函数也是类的一个成员函数,构造函数与类同名,没有返回值,除了定义对象时由系统调用之外,其他过程无法调用。
析构函数:
与构造函数的作用相反,用来完成对象被删除前的清理工作,在对象的生存期即将结束时由系统自动调用。
示例:(类的示例BC275)
9VC++6.0 实例教案----------------沈阳工业大学理学院
//简单程序中构造函数和析构函数的使用
//该程序将美分转换成适当的货币
//
#include <iostream.h>
const int QUARTER=25;
const int DIME=10;
const int NICKEL=5;
class coins{
int number;
public:
coins(){cout<<"Begin Conversion!\n";}//构造函数
~coins(){cout<<"\nFinish Conversion!";}//析构函数
void get_cents(int);
int quarter_conversion(void);
int dime_conversion(int);
int nickel_conversion(int);
};
void coins::get_cents(int cents)
{
number=cents;
cout<<number
<< "cents converts to :"
<<endl;
}
int coins::quarter_conversion(void)
{
cout<<number/QUARTER<<" quarter(s),";
return(number%QUARTER);
}
int coins::dime_conversion(int dimes)
{
cout<<dimes/DIME<<" dime(s),";
return(dimes%DIME);
}
10VC++6.0 实例教案----------------沈阳工业大学理学院
int coins::nickel_conversion(int nickels)
{
cout<<nickels/NICKEL<<" nickel(s),";
return(nickels%NICKEL);
}
void main(void)
{
int coin;
int dimes;
int nickels;
int pennies;
cout<<"Enter the cash,in cents to convert:";
cin>>coin;
//associate cash_in_cents with coins class
coins cash_in_cents;
cash_in_cents.get_cents(coin);
dimes=cash_in_cents.quarter_conversion();
nickels=cash_in_cents.dime_conversion(dimes); pennies=cash_in_cents.nickel_conversion(nickels); cout<<pennies<<" penny(ies).";
}
示例:在头文件中定义类。
//Tdate.h(直接实现函数)
class Tdate
{
public:
void Set(int m,int d,int y)
{
month=m;
day=d;
year=y;
}
int IsLeapYear()
{
return(year%4==0&&year%100!=0)||(year%400==0); }
11VC++6.0 实例教案----------------沈阳工业大学理学院void print()
{
cout<<month<<"/"<<day<<"/"<<year<<endl;
}
private:
int month;
int day;
int year;
};
//主函数
#include"iostream.h"
#include"tdate.h"
void someFunc(Tdate *ps)
{
ps->print();
if(ps->IsLeapYear())
cout<<"Oh!Oh!\n";
else
cout<<"right!\n";
}
void main()
{
Tdate s;
s.Set(2,15,1998);
someFunc(&s);
}
如上示例(类的成员函数在定义完类以后实现)
//tdate.h
class Tdate
{
public:
void Set(int,int,int);
int IsLeapYear();
void print();
private:
12VC++6.0 实例教案----------------沈阳工业大学理学院int month;
int day;
int year;
};
主程序:
//Tdate.cpp
#include"iostream.h"
#include"tdate.h"
void Tdate::Set(int m,int d,int y)
{
month=m;
day=d;
year=y;
}
int Tdate::IsLeapYear()
{
return(year%4==0&&year%100!=0||year%400==0);
}
void Tdate::print()
{
cout<<month<<"/"<<day<<"/"<<year<<endl;
}
void someFunc(Tdate *ps)
{
ps->print();
if(ps->IsLeapYear())
cout<<"Oh!Oh!\n";
else
cout<<"right!\n";
}
void main()
{
Tdate s;
s.Set(2,15,1998);
someFunc(&s);
13VC++6.0 实例教案----------------沈阳工业大学理学院
}
基本应用程序的建立:
示例一:使用编辑框和组框
1)利用MFC 建立一个单文档文件,要求:
类型:单文档
基类:CView
2)编译并运行程序。
3)在资源区转换到资源,选Dialog,右击选Insert Dialog
4)右击Dialog 对话框,选Property,Caption:使用编辑框,ID 号为:IDD_EDIT;
5)右击选Class Wizard 添加新的Class:类名为:CEditDlg,基类为:Dialog
6)在资源区选资源:选Menu 添加新的菜单,菜单名为测试控件,然后添加子菜单,名为ID_TEST_EDIT,然后用CmainFrame 类添加该菜单的命令消息:
void CMainFrame::OnTestEdit()
{
// TODO: Add your command handler code here
CEditDlg dlg;
dlg.DoModal();
}
7)编译并运行程序。
8)为对话框增加下列控件:
控件ID 号标题属性
静态文本IDC_A VERAGE Static Client,水平并垂直居中
组框成绩计算
静态文本成绩1
静态文本成绩2
静态文本成绩3
编辑框IDC_EDIT1
编辑框IDC_EDIT2
编辑框IDC_EDIT3
按钮IDC_BUTTON1 计算平均分
按钮IDOK 退出Default Button
9)为对话框控件增加成员变量:(类名为CEditDlg)
控件ID 号变量类型变量名数值范围
IDC_AVERAGE CString m_sAve
IDC_EDIT1 int m_Score1 0-100
IDC_EDIT2 int m_Score2 0-100
IDC_EDIT3 int m_Score3 0-100
10)为CEditDlg 类增加WM_INITIALOG 的消息处理,初始化成员变量,代码为:14VC++6.0 实例教案----------------沈阳工业大学理学院
BOOL CEditDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_sAve="0.00";
m_Score1=m_Score2=m_Score3=0;
UpdateData(FALSE); //将成员变量数据传给控件,并在控件中显示
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
11)为IDC_BUTTON1 添加BN_CLICKED 消息映射,代码如下:
void CEditDlg::OnButton1()
{
// TODO: Add your control notification handler code here
UpdateData();//将控件显示的数据传给成员变量
double ave=(double)(m_Score1+m_Score2+m_Score3)/3.0;
m_sAve.Format("%6.2f",ave);
UpdateData(FALSE);//将成员变量数据传给控件,并在控件中显示
}
12)编译完成程序
列表框控件示例:
1)创建一个Ex_Control 项目,编译并运行。
2)向应用程序中添加一个资源对话框IDD_LISTBOX,标题为“使用列表框”,通过ClassWizard 为此对话框定义类为CListBoxDlg。
3)按下表添加控件
控件ID 号标题属性
组框缺省学生成绩记录缺省
静态文本缺省姓名缺省
静态文本缺省成绩1 缺省
静态文本缺省成绩2 缺省
静态文本缺省成绩3 缺省
编辑框IDC_STU_NAME 缺省
编辑框IDC_STU_SCORE1 缺省
编辑框IDC_STU_SCORE2 缺省
15VC++6.0 实例教案----------------沈阳工业大学理学院
编辑框IDC_STU_SCORE3 缺省
按钮IDC_DATA_ADD 添加记录缺省
按钮IDC_DATA_DEL 删除记录缺省
列表框IDC_LIST1(缺省)缺省
按钮IDOK 退出DefaultButton
4)为CListBoxDlg 类添加成员变量
控件ID 号变量类型变量名数值范围
IDC_LIST1 CListBox m_List
IDC_STU_NAME CString m_Name
IDC_STU_SCORE1 int m_Score1 0-100
IDC_STU_SCORE2 int m_Score2 0-100
IDC_STU_SCORE3 int m_Score3 0-100
5)为ListBoxDlg.h 在public:处添加结构体SCORE
struct SCORE
{
int score1;
int score2;
int score3;
};
6)在ClassWizard 下选CListBoxDlg 类,然后为IDC_DATA_ADD 添加BN_CLICKED 的消息
映射、为IDC_DA TA_DEL 添加BN_CLICKED 的消息映射、为IDC_LIST1 添加LBN_SELCHANGE
的消息映射、为对话框添加WM_DESTROY(关闭对话框)的消息映射,各程序如下:void CListBoxDlg::OnDataAdd()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if(m_Name.IsEmpty())
{
MessageBox("姓名不能为空!");
return;
}
m_Name.TrimLeft();
m_Name.TrimRight();
if((m_List.FindString(-1,m_Name))!=LB_ERR)
{
MessageBox("列表框中已有相同姓名,不能添加!"); return;
16VC++6.0 实例教案----------------沈阳工业大学理学院}
int nIndex=m_List.AddString(m_Name);
SCORE data;
data.score1=m_Score1;
data.score2=m_Score2;
data.score3=m_Score3;
m_List.SetItemDataPtr(nIndex,new SCORE(data));
}
void CListBoxDlg::OnDataDel()
{
// TODO: Add your control notification handler code here int nIndex=m_List.GetCurSel();
if(nIndex!=LB_ERR)
{
m_List.DeleteString(nIndex);
delete(SCORE*)m_List.GetItemDataPtr(nIndex);
m_Name.Empty();
m_Score1=m_Score2=m_Score3=0;
UpdateData(FALSE);
}
else
MessageBox("当前没有选择项或列表框操作失败!");
}
void CListBoxDlg::OnSelchangeList1()
{
// TODO: Add your control notification handler code here int nIndex=m_List.GetCurSel();
if(nIndex!=LB_ERR)
{
m_List.GetText(nIndex,m_Name);
SCORE*data=(SCORE*)m_List.GetItemDataPtr(nIndex); m_Score1=data->score1;
m_Score2=data->score2;
m_Score3=data->score3;
UpdateData(FALSE);
}
17VC++6.0 实例教案----------------沈阳工业大学理学院}
void CListBoxDlg::OnDestroy()
{
for(int nIndex=m_List.GetCount()-1;nIndex>=0;nIndex--)
{
delete(SCORE*)m_List.GetItemDataPtr(nIndex);
}
CDialog::OnDestroy();
// TODO: Add your message handler code here
}
7)为菜单增加“测试控件”菜单、并增加子菜单“列表框”(ID_TEST_LIST);用ClassWizard 为CMainFrame 类增加处理该菜单项的命令消息,代码如下:
void CMainFrame::OnTestList()
{
// TODO: Add your command handler code here
CListBoxDlg m_dlg;
m_dlg.DoModal();
}
8)在MainFrame.cpp 文件的开始处增加包含CListBoxDlg 的头文件。
#include “ListBoxDlg.h”
9)编译并运行程序
18VC++6.0 实例教案----------------沈阳工业大学理学院
使用消息框和对话框示例:
1)新建一个名为:Dialog 的工程,基类为CView 类,编译并运行。
2)插入一个对话框,增加控件如图:
3)控件属性如下:
控件名称ID 号Caption 属性Group
Static Text IDC_STATIC 请输入显示信息(&E)
Edit Box IDC_EDIT_STRING
Group Box IDC_STATIC 颜色(&C)
Radio Button IDC_RADIO_BLACK 黑色(&B) 选中
Radio Button IDC_RADIO_RED 红色(&R)
Radio Button IDC_RADIO_BLUE 兰色(&B)
Radio Button IDC_RADIO_GREEN 绿色(&G)
Group Box IDC_STATIC 风格(&Y) 选中
Check Box IDC_CHECK_BOLD 加粗(&B)
Check Box IDC_CHECK_ITALIC 倾斜(&I)
Check Box IDC_CHECK_UNDERLINE 下划线(&U)
Button IDOK 确定选中
Button IDCANCEL 取消
ComboBox IDC_COMBO_SIZE
4)设置Tab 顺序
Layer Out/Tab Order
5)为对话框创建对话框类:
对话框类名称:CMyFontDlg
基类:CDialog
19VC++6.0 实例教案----------------沈阳工业大学理学院
头文件:MyFontDlg.h
实现文件:MyFontDlg.cpp
6)对话框的实现:(采用在视图中双击激活对话框)
在视图类头文件中加入:
#include “MyFontDlg.h”
打开Class Wizard,在Class Name 列表框中选择CDialogView,在Object IDs 列表中
选择CDialogView,在对应的Message(消息)列表中选择双击WM_LBUTTONDBLCLK 增加了
一个窗口消息处理函数OnLButtonDblClk,在消息处理函数中增加如下代码:
void CDialogView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CMyFontDlg dlg; //生成对话框的示例
dlg.DoModal();//通过调用基类CDialog 的成员函数DoModel()来显示对话框,并
且//等待用户的响应,显示有模式对话框
CView::OnLButtonDblClk(nFlags, point);
}
7)修改视图类CDialogView 中的成员函数OnDraw(),使得在程序运行中显示信息,
提示用户双击鼠标。
void CDialogView::OnDraw(CDC* pDC)
{
CDialogDoc* pDoc = GetDocument();
ASSERT_V ALID(pDoc);
// TODO: add draw code for native data here
pDC->TextOut(50,50,”请双击鼠标左键”);
}
8)为对话框增加成员变量,对应关系为:
控件ID 号类成员变量类别类型变量
IDC_EDIT_STRING m_strMessage Value CString
IDC_RADIO_BLACK m_nColor Value int
IDC_CHECK_BOLD m_nStyleBold Value BOOL
IDC_CHECK_ITALIC m_bStyleItalic Value BOOL
IDC_CHECK_UNDERLINE m_bStyleUnderLine Value BOOL
IDC_COMBO_SIZE m_cboFontSize Control CComboBox
IDC_COMBO_SIZE m_strFontSize Value CString
说明:m 之后的字母表示变量类型:
str:字符串
n:整形
20VC++6.0 实例教案----------------沈阳工业大学理学院
b:布尔形
9)初始化对话框
为CMyFontDlg 类增加消息:WM_INITIALOG
程序如下:
BOOL CMyFontDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_strMessage="对话框示例";
m_bStyleBold=TRUE;
m_nColor=0;
m_cboFontSize.AddString("20");
m_cboFontSize.AddString("10");
m_strFontSize="10";
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE
}
10)最后完成试图类的消息处理函数OnLButtonDblClk
程序为:
void CDialogView::OnLButtonDblClk(UINT nFlags, CPoint point) {
// TODO: Add your message handler code here and/or call default CMyFontDlg dlg;
CString strResult;
if(dlg.DoModal()==IDOK)
{
strResult="确定按钮被按下,";
strResult+="编辑框内容为:";
strResult+=dlg.m_strMessage+"\r\n";
strResult+="\r\n 字号为:";
strResult+=dlg.m_strFontSize;
strResult+="。
颜色为:";
switch(dlg.m_nColor)
{
case 0:
strResult+="黑色";
21VC++6.0 实例教案----------------沈阳工业大学理学院break;
case 1:
strResult+="兰色";
break;
case 2:
strResult+="红色";
break;
case 3:
strResult+="绿色";
break;
}
strResult+=",风格为:";
if(dlg.m_bStyleBold==TRUE)
strResult+="加粗";
if(dlg.m_bStyleItalic==TRUE)
strResult+="倾斜";
if(dlg.m_bStyleUnderline==TRUE)
strResult+="下划线";
}
else
{
strResult="取消按钮被按下!";
}
AfxMessageBox(strResult,MB_OK|MB_ICONINFORMATION);
CView::OnLButtonDblClk(nFlags, point);
}
从组合框中选择填充样式:
1)程序样板如图:
22VC++6.0 实例教案----------------沈阳工业大学理学院
23
该程序通过下拉菜单选择不同的填充样式,在静态文本框中显示不同的剖面线。
2)利用MFC_Wizard 建立一个名称为Ex_Combo 的单文档程序,基类为CView 类。
编译并运行程序。
3)向应用程序添加一个对话框资源IDD_COMBO,标题为使用组合框,并为此框定义一个类为CComboDlg。
4)为编辑框如下所表示的一些控件。
控件ID 号标题属性
静态文本IDC_DRAW 缺省Static
静态文本缺省填充样式缺省
组合框IDC_PATTERN ———缺省
按钮IDOK 退出Default Button 其余缺省
5)利用Class Wizard 为组合框添加IDC_PA TTERN 增加下列成员变量:
CComboBox m_Pattern;
6)打开ComboDlg.h 增加一变量:
public:
int m_DrawPattern;
7)初始化对话框(为对话框添加WM_INITIALOG 消息映射),代码如下:
BOOL CComboDlg::OnInitDialog()
{
CDialog::OnInitDialog(); VC++6.0 实例教案----------------沈阳工业大学理学院
// TODO: Add extra initialization here
CString str[6]={"水平线","竖直线","向下斜线","向上斜线","十字线","交叉线"}; int nIndex;
for(int i=0;i<6;i++)
{
nIndex=m_Pattern.AddString(str[i]);
m_Pattern.SetItemData(nIndex,i);
}
m_Pattern.SetCurSel(0);
m_DrawPattern=0;
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
8)为CComboDlg 增加WM_PAINT 的消息映射
void CComboDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CWnd *pWnd=GetDlgItem(IDC_DRAW);//获取窗口IDC_DRAW 的窗口指针pWnd->UpdateWindow();//避免系统自动重绘
CDC *pDC=pWnd->GetDC();//获取设备所需要的绘图设备环境
CBrush drawBrush;
drawBrush.CreateHatchBrush(m_DrawPattern,RGB(255,0,0));
CBrush*pOldBrush=pDC->SelectObject(&drawBrush);
CRect rcClient;
pWnd->GetClientRect(rcClient);
pDC->Rectangle(rcClient);
pDC->SelectObject(pOldBrush);
// Do not call CDialog::OnPaint() for painting messages
}
9)为组合框添加CBN_SELCHANGE 的消息映射
void CComboDlg::OnSelchangePattern()
{
// TODO: Add your control notification handler code here
24VC++6.0 实例教案----------------沈阳工业大学理学院
int nIndex=m_Pattern.GetCurSel();
if(nIndex!=CB_ERR)
{
m_DrawPattern=m_Pattern.GetItemData(nIndex);
Invalidate();
}
}
10)为主窗体增加测试控件的菜单,并在MainFrm.h 中增加
#include “ComboDlg.h”
程序代码如下:
void CMainFrame::OnTest()
{
// TODO: Add your command handler code here
CComboDlg m_dlg;
m_dlg.DoModal();
}
25VC++6.0 实例教案----------------沈阳工业大学理学院
5)利用Class Wizard 向对话框内添加新类CStuInputDlg
6)为对话框添加数据成员,类名为CStuInputDlg,数据成员如下表:
各个控件的数据成员表:
控件ID 号变量类型变量名数值范围
IDC_DATA_LIST CString m_DataList
IDC_DISPALL BOOL m_bDispAll ___
IDC_EDIT1 int m_Score1 0~100
IDC_EDIT2 int m_Score2 0~100
IDC_EDIT3 int m_Score3 0~100
IDC_NAME CString m_Name
IDC_STU_NO CString m_No
7)为主菜单增加顶层菜单“测试控件”,并增加子菜单“学生成绩输入”(ID_DATA_Input)添加该菜单的命令消息,并在MainFrm.Cpp 中增加包含SCtuInputDlg.h。
void CMainFrame::OnDATAInput()
{
// TODO: Add your command handler code here
CStuInputDlg m_dlg;
m_dlg.DoModal();
}
编译并运行程序。
8)为对话框增加WM_INITIALOG 消息处理
BOOL CStuInputDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
CheckRadioButton(IDC_MAN,IDC_WOMAN,IDC_MAN);
//将单选框中的IDC_MAN 设置为选中状态
m_DataList.Empty;
//将与编辑框IDC_DATA_LIST 相关联的CString 变量内容设置为NULL
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
9)为复选框IDC_DISPALL 添加BN_CLICKED 消息处理,并增加如下代码:void CStuInputDlg::OnDispall()
{
// TODO: Add your control notification handler code here
UpdateData();
26
CString strSex; VC++6.0 实例教案----------------沈阳工业大学理学院
int nResult=GetCheckedRadioButton(IDC_MAN,IDC_WOMAN);
if(nResult==IDC_MAN)strSex="男";
else strSex="女";
if(m_bDispall)
m_DataList.Format("%s\t%s\t%s\t%d\t%d\t%d\n",m_No,m_Name,strSex,m_Score1,m_S core2,m_Score3);
else
m_DataList.Format("%s\t%s\t%s\n",m_No,m_Name,strSex);
UpdateData(FALSE);
}
10)为Input 按钮增加BN_CLICKED 消息处理,代码如下:
void CStuInputDlg::OnInput()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
OnDispall();
}
11)编译并运行程序
ODBC 数据库编程:(214 完整示例)
程序界面:
27VC++6.0 实例教案----------------沈阳工业大学理学院
28
实现过程:
1)通过Access 创建一个数据库Student.mdb,其中包括两个表,xs 和zy 数据如下:
学生表(xs)及其表结构
学号(stuid)姓名(name)性别(sex)专业代号(profcode)
990101 李林男102001
990102 高山男102001
990103 王平男109003
990104 丁铃女109003
序号字段名称数据类型字段大小小数位字段含义
1 stuid 文本6 学号
2 name 文本8 姓名
3 sex 文本2 性别
4 profcode 文本6 专业代号
专业代码表(zy)及其表结构
专业代号(profcode)专业名称(profname)学制(stuyears)
102001 计算机及其应用4
102002 应用电子技术2VC++6.0 实例教案----------------沈阳工业大学理学院
102003 自动控制4
102004 通讯工程4
109003 计算机科学4
29VC++6.0 实例教案----------------沈阳工业大学理学院
序号字段名称数据类型字段大小小数位字段含义
1 profcode 文本6 专业代号
2 profname 文本12 专业名称
3 stuyears 数据整形自动学制
2)定义ODBC 数据源
a.通过控制面板打开ODBC 数据源管理器
b.单击添加按钮,添加Microsoft Access Driver(*.mdb)数据库,数据源名:My DataBase For VC,描述:用于VC 的数据库,数据库选取创建的数据库。
3)创建MFC 应用程序
应用程序为:单文档、数据库支持、数据源为ODBC 中的xs,
4)增加浏览纪录功能
a.向对话框中增加如下控件
控件ID 号标题属性
组框缺省学生表缺省
静态文本缺省学号:缺省
编辑框IDC_STU_ID ____ 缺省
静态文本缺省姓名:缺省
编辑框IDC_STU_NAME ____ 缺省
静态文本缺省性别:缺省
编辑框IDC__STU_SEX ____ 缺省
静态文本缺省专业代号:缺省
编辑框IDC_PRO_CODE ____ 缺省
b.将编辑框控件与数据库关联:(如下表)
控件ID 号变量类型变量名字符长度
IDC_PROF_CODE CString ->m_profcode 6
IDC_STU_NAME CString ->m_name 8
IDC_STU_ID CString ->m_stuid 6
IDC_STU_SEX CString ->m_sex 2
c.编译并运行程序
5)添加状态栏现实纪录位置的功能
打开MainFrm.cpp 文件,修改Indicators 数组,增加第二个信息行窗格
static UINT indicators[ ] =
{
30VC++6.0 实例教案----------------沈阳工业大学理学院
ID_SEPARATOR, // status line indicator
ID_SEPARATOR,//显示第二个窗格的信息
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
6)增加CODBCView 类的OnCommand 消息处理函数,并添加下列代码:(该函数先获得状态栏对象的指针,然后调用SetPaneText 函数更新第二个窗格的文本。
6.1 在ODBCView.cpp 文件的开始处增加包含主窗体头文件
#include “MainFrm.h”
6.2 将主窗体的头文件中的状态栏变量类型改为公有变量
public: // control bar embedded members
CStatusBar m_wndStatusBar;
CToolBar m_wndToolBar;
6.3 增加ODBCView 的OnCommand 消息处理函数,调用SetPaneText 函数更新第二个窗格的文本。
BOOL CODBCView::OnCommand(WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
CString str;
CMainFrame*pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
//获得主框架窗口的指针
CStatusBar*pStatus=&pFrame->m_wndStatusBar;
//获得主框架窗口中状态栏的指针
if(pStatus)
{
CRecordsetStatus rStatus;
m_pSet->GetStatus(rStatus);
//获得当前记录信息
str.Format("当前记录:%d/总记录:%d"
,1+rStatus.m_lCurrentRecord,m_pSet->GetRecordCount());
pStatus->SetPaneText(1,str);
//更新第二个窗格的文本
}
return CRecordView::OnCommand(wParam, lParam);
}
6.4 在ODBCView 的OnInitialUpdate 函数中增加获得记录集总数的代码,并将记录移到记录集的首位。
void CODBCView::OnInitialUpdate()
31VC++6.0 实例教案----------------沈阳工业大学理学院
{
m_pSet = &GetDocument()->m_oDBCSet;
CRecordView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
while(!m_pSet->IsEOF())
{
m_pSet->MoveNext();
m_pSet->GetRecordCount();
}
m_pSet->MoveFirst();
//以上为获得总的记录数,并将记录集移到第一个记录
}
7)增加添加记录、修改记录、删除记录的功能
7.1 向表单中增加三个按钮
控件ID 号标题
按钮ID_REC_ADD 添加记录
按钮ID_REC_EDIT 修改记录
按钮ID_REC_DEL 删除记录
7.2 增加一个对话框,ID 号为IDD_STU_TABLE,对话框类为StuDlg,所需控件及增加的变量如下:
控件ID 号变量类型变量名字符长度
IDC_PROF_CODE CString m_ProfCode 6
IDC_STU_ID CString m_StuID 6
IDC_STU_NAME CString m_StuName 8
IDC_STU_SEX CString m_StuSex 2
7.3 为CStuDlg 中的控件增加IDOK 的BN_CLICKED 的消息映射
32VC++6.0 实例教案----------------沈阳工业大学理学院
void CStuDlg::OnOK()
{
// TODO: Add extra validation here
UpdateData(TRUE);
//将控件中的内容传递给变量
CDialog::OnOK();
}
7.4 在ODBCView.cpp 中增加包含StuDlg.h
#include “StuDlg.h”
7.5 增加添加、修改、删除按钮的消息处理
void CODBCView::OnRecAdd()
{
// TODO: Add your control notification handler code here
CStuDlg dlg;
if(dlg.DoModal()==IDOK)
{
m_pSet->AddNew();
m_pSet->m_stuid=dlg.m_StuID;
m_pSet->m_name=dlg.m_StuName;
m_pSet->m_sex=dlg.m_StuSex;
m_pSet->m_profcode=dlg.m_ProfCode;
m_pSet->Update();
m_pSet->Requery();
}
}
void CODBCView::OnRecDel()
{
// TODO: Add your control notification handler code here
CRecordsetStatus status;
m_pSet->GetStatus(status);
m_pSet->Delete();
if(status.m_lCurrentRecord==0)
m_pSet->MoveNext();
else
m_pSet->MoveFirst();
UpdateData(FALSE);
}
33VC++6.0 实例教案----------------沈阳工业大学理学院
void CODBCView::OnRecEdit()
{
// TODO: Add your control notification handler code here
CStuDlg dlg;
dlg.m_StuID=m_pSet->m_stuid;
dlg.m_StuName=m_pSet->m_name;
dlg.m_StuSex=m_pSet->m_sex;
dlg.m_ProfCode=m_pSet->m_profcode;
if(dlg.DoModal()==IDOK)
{
m_pSet->Edit();
m_pSet->m_stuid=dlg.m_StuID;
m_pSet->m_name=dlg.m_StuName;
m_pSet->m_sex=dlg.m_StuSex;
m_pSet->m_profcode=dlg.m_ProfCode;
m_pSet->Update();
UpdateData(FALSE);
}
}
8)增加显示记录控件
8.1 通过Project/Add To Project/Components and Controls/Components and Controls Gallery/Registered ActivateX Controls/Microsoft FlexGrid Control 增加MS FlexGrid 控件,用来显示记录集中数据。
8.2 为MSFlexGrid 控件增加一个CMSFlexGrid 类成员变量m_MSFGrid,然后在。