vc++vswindows编程与绘图程序设计.docx
《vc++vswindows编程与绘图程序设计.docx》由会员分享,可在线阅读,更多相关《vc++vswindows编程与绘图程序设计.docx(84页珍藏版)》请在冰豆网上搜索。
![vc++vswindows编程与绘图程序设计.docx](https://file1.bdocx.com/fileroot1/2023-1/27/a217300d-6e69-48a9-9891-d80c0d68e787/a217300d-6e69-48a9-9891-d80c0d68e7871.gif)
vc++vswindows编程与绘图程序设计
1Vc++2010开发平台概述
1.1Vc++2010概述
1.2VisualStudio2010集成开发环境
1.2.1安装VisualStudio2010
1.2.2配置VisualStudio2010
1.2.3解决方案和项目
1.2.4生成和调试工具
1.2.5部署工具
1.2.6Ribbon界面设计可视化
2VisualStudio2010MFC基本程序设计
2.1MFC应用程序概述
2.1.1简单的MFC应用程序
2.1.2MFC应用程序分析
2.2MFC应用程序的创建
2.2.1用AppWizard创建CLR控制台应用程序
2.2.2用AppWizard创建win32控制台应用程序
2.2.3用AppWizard创建一个MFC应用程序
1.打开vc++2010,从起始页中选择“新建项目”如图2.2.3.1。
图2.2.3..1
弹出图2.2.3.2所示界面,左侧选择“viaualc++语言”,中间选择“MFC应用程序”,
图2.2.3.2
名称为huitu,位置为桌面,点击“确定”,弹出图2.2.3.3界面。
图2.2.3`.3
然后一路点击下一步(或者直接点击“完成”),则自动生成一个MFC应用程序,此时查看生成的程序文件夹内包含的文件,如图2.2.3.4
图2.2.3`.4
Huitu文件夹内文件如图2.2.3.5
图2.2.3.5
点击启动调试工具拦(绿色三角,图2.2.3.6)或者按F5则系统调试运行,在弹出界面中选择是,弹出图2.2.3.7的程序运行界面。
图2.2.3.6
图2.2.3.7
此时再看程序文件夹内的文件如图2.8
图2.2.3.8
可以看见多了debug文件夹,分别打开debug文件夹以及huitu文件夹内的debug文件夹看看都多了啥文件。
至此,一个文正的MFC应用程序建立完成。
保存退出vc++2010,要再次进入刚才建立的应用程序,直接点击程序文件夹内的“huitu.sln”即可。
2.3MFC的类
2.3.1MFC应用程序中包含的类
2.3.2应用程序类
2.3.3主框架类
2.3.4视图类
2.3.5文档类
2.3.6对话框类
2.3.7菜单类
2.3.8线程基类
3Wndows窗体应用程序
3.1创建Wndows窗体应用程序
1.启动vc++2010,如图3.1.1。
图3.1.1
2.选择新建项目
在打开的窗口中,左侧语言选择vc++,窗口中间选择“windows窗体应用程序”,窗口下面“名称”填写form,工程位置为桌面(图3.1.2),点击确定,建成的应用程序界面如图3.1.3。
图3.1.2
图3.1.3
3.2窗体属性及设置
3.3窗体事件及处理
3.4窗体控件添加与编辑
4用户界面设计
4.1菜单设计
4.1.1菜单的类型
4.1.2菜单设计
建立菜单的过程如下:
1.打开工程。
打开前面建立的工程绘图(双击huitu工程文件夹中的huitu.sln)。
2.打开资源视图。
通过“视图-其他窗口-资源视图”菜单打开资源视图窗口,如图4.1.2.1,在vc++界面左侧显示资源视图窗口。
图4.1.2.1
3.添加菜单。
点击资源视图的menu,展开如图4.1.2.2所示
图4.1.2.2
可以看到在工程中有多个菜单,其中IDR_huituTYPE菜单是显示在各子文档界面中的菜单;IDR_MAINFRAME建立的菜单是程序主框架中显示的菜单(把所有子文档关闭后会显示);
在此双击IDR_huituTYPE,打开窗口如图4.1.2.3所示。
图4.1.2.3
在请在此处键入位置点击,光标激活后输入“直线”,同时会在文本框右边和下面分别出现写有“请在此键入”字样的文本框,右边的代表键入的直线菜单的子菜单,下面代表直线菜单同级的菜单,其他以此类推,选择直线菜单后,查看vc++界面中右下角的属性面板,可以看到“popup”属性设置的是“true”,代表直线菜单是弹出式菜单,它下面还有下一级菜单,否则,该属性如果设置为“false”,则它不能再添加子菜单了。
按照以上方法,在直线菜单下设置“直线1”,“直线2”两个子菜单,建立与直线同级的“圆”菜单,其下设置“圆1”,“圆2”两个子菜单,如图4.1.2.4。
图4.1.2.4
4.运行查看菜单。
按F5或者点击启动调试工具(绿色三角箭头),在探出的窗口中选择是,启动运行后测绘看到建立的菜单(图4.1.2.5)。
图4.1.2.5
5.为菜单添加函数并且编写代码
菜单添加后还不能运行,要想让它起作用,需要为其添加函数并在函数里添加代码,为菜单添加函数过程为(以直线1为例):
选择直线1,在属性面板中把ID属性右边的值改为ID_line1,然后通过“项目-类向导”打开类向导窗口(图1.1.2.6)
图4.1.2.6
类名处选择huituView,在命令标签列表中找到并点击ID_line1,在消息标签中点击COMMAND,如图4.1.2.7。
I
图4.1.2.7
再点击“添加处理程序”按钮,弹出添加函数对话框
图4.1.2.8
成员函数名称默认(也可以修改),点确定,则与菜单直线1对应的函数生成,此时可通过点击图4.1.2.7中的“编辑代码”进入函数,或者在vc界面右上角的“解决资源管理器”面板中展开源代码(图4.1.2.8),找到huituView.CPP双击该文件也可进入函数。
图4.1.2.8
在函数中的//TODO:
在此添加命令处理程序代码
下面添加
CClientDCdc(this);
dc.LineTo(500,500);
两句,如图4.1.2.9
图4.1.2.9
6.运行检验菜单功能
按F5运行程序后点击直线1菜单,可以看到在用户区画出一条直线。
4.1.3创建弹出式菜单
4.1.4创建动态菜单
4.1.5创建基于对话框的菜单
4.2工具栏设计
4.3状态栏设计
5对话框设计
5.1静态对话框
5.1.1静态对话框的建立过程
建立静态对话框的过程如下:
1.打开或建立工程。
按照前面方法打开或者建立一个工程(MFC工程或者窗体应用程序均可,此处以mfc工程为例)
2.打开资源窗口。
通过“视图-其他窗口-资源视图”打开资源视图窗口。
3.建立对话框。
在资源视图的DIALOG文件夹上单击右键选择insertdialog,弹出新建的对话框,根据需要可以修改对话框属性面板中的属性值。
4.添加对话框类。
在建立的该对话框上双击鼠标左键,弹出添加类向导,根据提示设置好参数后确认,则建立了与对话框对应的对话框类。
5.1.2静态对话框的应用
对话框的应用一般是实现人机交互,以下结合huitu工程中的直线2菜单说明对话框的应用,功能为点击直线2菜单,弹出对话框,在对话框里设置好直线的起点与终点坐标并确认后在客户区画出设置的起点到终点的直线。
1.打开工程。
双击huitu.sln打开工程。
2.添加对话框。
通过“视图-其他窗口-资源视图”打开资源视图,在资源视图的DIALOG文件夹上单击右键选择insertdialog,弹出新建的对话框(图5.1.2.1),在属性面板中把对话框的ID属性修改为:
IDD_line2_dlg。
图5.1.2.1
3.建立对话框类。
在建立的对话框上双击鼠标左键,弹出建立对话框类向导,名称中输入line2dlg,基类选择CDIalog(图5.1.2.2),点击完成,完成对话框类的建立,可以看到在解决资源管理器的头文件和源文件中已经建立了相应的件。
图5.1.2.2
4.添加控件。
在对话框上从工具箱中添加四个静态文本框、四个编辑文本框、一个按钮,静态文本框的caption属性分别改为:
起点x坐标,起点y坐标,终点x坐标,终点y坐标,按钮caption属性改为“确定”。
如图5.1.2.3.
图5.1.2.3
5.为编辑文本框添加变量。
要使用文本框,必须为其添加对应的变量,选择第一个文本框,点击“项目-类向导”菜单打开类向导,选择“成员变量”标签(图5.1.2.4),鼠标点击IDC_EDIT1(编辑文本框1对应的ID),点击右边的添加变量按钮弹出添加变量窗口。
图5.1.2.4
图5.1.2.5
在变量设置窗口中,成员变量名称输入m_line1x,类别选择value,类型选择long(图5.1.2.5).点确定。
用同样的方法为其他三个编辑框添加变量,结果如图5.1.2.6所示。
图5.1.2.6
6.为按钮添加函数,获取数据。
为了点击按钮确定后获取坐标数据以便于画直线,需要为按钮添加函数,选择前面添加的按钮“确定”,通过“项目-类向导”菜单打开类向导,选择命令标签,点击确定按钮的ID(IDC_BUTTON1),点击消息列表中的BN_CLICKED(代表鼠标点击时触发函数或者事件运行),见图5.1.2.7,击添加处理程序,弹出处理程序对话框,默认之后点击确定则为按钮添加了对应的函数,双击line2dlg.cpp会看见添加了如下函数:
voidline2dlg:
:
OnClickedButton1()
{
//TODO:
在此添加控件通知处理程序代码
}
图5.1.2.7
7.编写代码获取数据。
在前面添加的按钮函数中编写如下代码获取数据:
UpdateData(true);
CDialog:
:
EndDialog(0);//结束对话框
该函数的作用是把输入文本框的坐标数据赋值到对应的变量中,即四个文本框对应的变量line1x,line1y,line1endx,line1endy。
如果代码为
UpdateData(false);
则是指把变量中的数值显示到变量对应的文本框中。
CDialog:
:
EndDialog(0);
是为了结束对话框。
8.为菜单添加代码,画对话框设置坐标的的直线。
点击资源视图中的menu文件夹展开,双击IDR_huituTYPE菜单,选择直线2菜单,把属性中的ID属性改为ID_line2,通过“项目-类向导”打开类向导,类名选择Chuituview,命令标签中的对象选择ID_line2,消息选择COMMAND(图5.1.2.8),点击添加处理程序,弹出窗口中默认确定,则自动打开ChuituView.cpp,并且光标定位到该函数中,代码如下:
voidChuituView:
:
OnLine2()
{
//TODO:
在此命令处处理程序代码
}
图5.1.2.8
定位到该代码窗口的最上端头文件处,添加以下一句:
#include"line2dlg.h"
目的是把对话框类包含进来,否则系统不认对话框中的信息。
然后再online2()函数中添加如下代码:
line2dlgdlg;//生成对话框对象
dlg.DoModal();//显示对话框
CClientDCdc(this);//生成设备环境对象,获取设备环境
dc.MoveTo(dlg.m_line1x,dlg.m_line1y);//定位到起点坐标
dc.LineTo(dlg.m_line1endx,dlg.m_line1endy);//从起点到终点画直线
9.运行程序。
编译运行,点击直线2菜单会弹出对话框,在对话框中设置好起点终点坐标后点确定,则在客户区画出指定坐标的直线。
5.2非静态对话框
5.3通用对话框
6常用控件
6.1公共控件
6.2容器
6.3数据控件
7键盘鼠标事件
7.1键盘事件
为了使用户掌握键盘消息及其处理消息,介绍一个键盘消息处理实例。
1.实例说明
本实例通过工程向导创建一个单文档工程,在其中响应键盘的WM_KEYDOWN、WM_KEYUP、WM_CHAR消息,实现下面的功能:
当用户按下了Shift键,在视图窗口中显示提示信息“用户按下了Shift键”;
当用户释放了Shift键时,在视图窗口中显示提示信息“用户释放了Shift键!
”;
当用户按下了Shift键后又按下了字符“B”键,在视图窗口中显示提示信息“用户同时按下了Shift键和B键”(即输入B键或b键)。
2.开发过程
(1)创建工程。
利用MFCAppWizard[EXE]建立一个单文档的MFC工程“KeyboardDemo”。
(2)在ClassView选项卡上用鼠标右键单击该类,并从弹出的快速菜单中选择[AddMemberVariable…]
菜单命令,为KeyboardDemoView类添加一个新的成员变量bShiftdown,将此成员变量的类型设置为BOOL,并将其访问权限设置为Private,
单击[OK]按钮,完成成员变量的添加操作。
按照同样的方法,再添加2个BOOL型private成员变量bShiftup和bShiftB,
接下来在KeyboardDemoView构造函数中给三个指示变量赋初值”false”。
代码如下:
CKeyboardDemoView:
:
CKeyboardDemoView()
{
bShiftdown=bShiftup=bShiftB=false;//赋初值
}
(3)利用“建立类向导”添加键盘消息及处理函数,步骤如下:
在”ClassName”列表框中,选择键盘消息的处理函数”CKeyboardDemoView”,在”ObjectIDs”列表框中选择“CKeyboardDemoView”,
则在“Message”列表框中,列出了MFC为其预定义的消息,分别选择WM_KEYDOWN、WM_KEYUP、WM_CHAR消息,
单击“AddFunction”按钮,MFC就会为其自动添加相应的消息映射宏和消息处理函数。
(4)添加实现代码:
在资源文件“KeyboardDemoView.cpp”中添加各键盘消息函数的实现代码。
OnKeyDown函数的代码如下:
voidCKeyboardDemoView:
:
OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)
{
if(nChar==VK_SHIFT)//判断Shift键是否被按下
{
bShiftdown=true;
bShiftup=false;
Invalidate(true);//显示信息
}
CView:
:
OnKeyDown(nChar,nRepCnt,nFlags);
}
注:
Invalidate(TRUE)将整个窗口设置为需要重绘的无效区域,它会产生WM_PAINT消息,这样OnDraw将被调用。
OnKeyUp函数的代码如下:
voidCKeyboardDemoView:
:
OnKeyUp(UINTnChar,UINTnRepCnt,UINTnFlags)
{
if(nChar==VK_SHIFT)//判断Shift键是否被释放
{
bShiftup=true;
bShiftdown=false;
Invalidate(true);//显示信息
}
CView:
:
OnKeyUp(nChar,nRepCnt,nFlags);
}
OnChar函数的代码如下:
voidCKeyboardDemoView:
:
OnChar(UINTnChar,UINTnRepCnt,UINTnFlags)
{
//判断是否同时敲击了字符键B键和Shift键
if((nChar=='b')|(nChar=='B'))//if((nChar==66)|(nChar==98))
{
if(bShiftdown)
{
bShiftB=true;
bShiftdown=false;
Invalidate(true);
}
}
CView:
:
OnChar(nChar,nRepCnt,nFlags);
}
在资源文件”KeyboardDemoView.cpp”的OnDraw函数中,实现在客户区窗口输出按键提示信息。
代码如下:
voidCKeyboardDemoView:
:
OnDraw(CDC*pDC)
{
if(bShiftdown)//按下了Shift键
{
pDC->TextOut(20,20,"用户按下了Shift键!
");
}
if(bShiftup)//释放了Shift键
{
pDC->TextOut(20,20,"用户释放了Shift键!
");
}
if(bShiftB)//同时按下了Shift键和B键
{
pDC->TextOut(20,20,"用户同时按下Shift键和B键!
");
bShiftB=false;
}
}
举例:
CDC*pDC=GetDC();
if(nChar==VK_UP)
{
pDC->Ellipse(40,40,200,200);
}
键盘事件总结:
Vc++中键盘事件中函数原型如下(以键盘按下为例,其他类似)
OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)
其中:
nChar:
表示按键的字符代码。
nRepCnt:
表示按键的重复次数。
nFlags:
表示扫描码、先前键状态、键转换状态等。
nChar的取值表:
虚拟键码
对应值
对应键
VK_LBUTTON
1
鼠标左键
VK_RBUTTON
2
鼠标右键
VK_CANCEL
3
Cancel
VK_MBUTTON
4
鼠标中键
VK_XBUTTON1
5
VK_XBUTTON2
6
VK_BACK
8
Backspace
VK_TAB
9
Tab
VK_CLEAR
12
Clear
VK_RETURN
13
Enter
VK_SHIFT
16
Shift
VK_CONTROL
17
Ctrl
VK_MENU
18
Alt
VK_PAUSE
19
Pause
VK_CAPITAL
20
CapsLock
VK_KANA
21
VK_HANGUL
21
VK_JUNJA
23
VK_FINAL
24
VK_HANJA
25
VK_KANJI
25*
VK_ESCAPE
27
Esc
VK_CONVERT
28
VK_NONCONVERT
29
VK_ACCEPT
30
VK_MODECHANGE
31
VK_SPACE
32
Space
VK_PRIOR
33
PageUp
VK_NEXT
34
PageDown
VK_END
35
End
VK_HOME
36
Home
VK_LEFT
37
LeftArrow
VK_UP
38
UpArrow
VK_RIGHT
39
RightArrow
VK_DOWN
40
DownArrow
VK_SELECT
41
Select
VK_PRINT
42
Print
VK_EXECUTE
43
Execute
VK_SNAPSHOT
44
Snapshot
VK_INSERT
45
Insert
VK_DELETE
46
Delete
VK_HELP
47
Help
48
0
49
1
50
2
51
3
52
4
53
5
54
6
55
7
56
8
57
9
65
A
66
B
67
C
68
D
69
E
70
F
71
G
72
H
73
I
74
J
75
K
76
L
77
M
78
N
79
O
80
P
81
Q
82
R
83
S
84
T
85
U
86
V
87
W
88
X
89
Y
90
Z
VK_LWIN
91
VK_RWIN
92
VK_APPS
93
VK_SLEEP
95
VK_NUMPAD0
96
小键盘0
VK_NUMPAD1
97
小键盘1
VK_NUMPAD2
98
小键盘2
VK_NUMPAD3
99
小键盘3
VK_NUMPAD4
100
小键盘4
VK_NUMPAD5
101
小键盘5
VK_NUMPAD6
102
小键盘6
VK_NUMPAD7
103
小键盘7
VK_NUMPAD8
104
小键盘8
VK_NUMPAD9
105
小键盘9
VK_MULTIPLY
106
小键盘*
VK_ADD
107
小键盘+
VK_SEPARATOR
108
小键盘Enter
VK_SUBTRACT
109
小键盘-
VK_DECIMAL
110
小键盘.
VK_DIVIDE
111
小键盘/
VK_F1
112
F1
VK_F2
113
F2
VK_F3
114
F3
VK_F4
115
F4
VK_F5
116
F5
VK_F6
117
F6
VK_F7
118
F7
VK_F8
119
F8
VK_F9
120
F9
VK_F10
121
F10
VK_F11
122
F11
VK_F12
123
F12
VK_F13
124
VK_F14
125
VK_F15
126
VK_F16
127
VK_F17
128
VK_F18
129
VK_F19
130
VK_F20
131
VK_F21
132
VK_F22
133
VK_F23
134
VK_F24
135
VK_NUMLOCK
144
NumLock
VK_SCROLL
145
Scroll
VK_LSHIFT
160
VK_RSHIFT
161
VK_LCONTROL
162
VK_RCONTROL
163
VK_LMENU
164
VK_RMENU
165
VK_BROWSER_BACK
166
VK_BROWSER_FORWARD
167
VK_BROWSER_REFRESH
168
VK_BROWSER_STOP
169
VK_BROWSER_SEARCH
170
VK_BROWSER_FAVORITES
171
VK_BROWSER_HOME
172
VK_VOLUME_MUTE
173
VolumeMute
VK_VOLUME_DOWN
174
VolumeDown