案例八
用 VC++制作一个商品销售管理系统
关键词:菜单制作 封面设计 商品销售管理 状态条 加速键面
板 加速键与菜单连接
课程设计的目的和意义
商品销售管理是任何生产单位、企业集团所面临的一项重要任务,
管理内容非常复杂,涉及资金流、物质流和人员流等等方面,内容极其
广泛,因此制作一个商品销售管理系统是十分重要的和必要的。
系统功能设计
在本系统的制作中,我们将介绍菜单的制作方法、在新的主界面
中(不是由向导生成的主对话框)的菜单过程代码的编制方法、加速键
面板的制作及其加速键与菜单的连接方法。这一案例与高校科研管理系
统的制作几乎类似,但可以看出,它有许多的特色。商品销售管理系统
仍可以制作成一个多页面的“选项卡”式的管理系统,完全可以用 VC++
的选项卡控件加以制作,但鉴于目前的一些 VC++ 版本对于选项卡
控件的局限性,我们还是只能沿用前面的多个对话框的制作来实现对于
商品销售的多个方面的管理。
在本系统中我们将介绍如何由用户自己制作一个系统封面(不通
过添加 SPLASH 工程的方法),该系统启动封面出现后再确定是否进入
系统主控界面。其系统的启动画面如图 所示。
图 系统封面效果
系统封面可以控制系统的进入,如果进入系统,则出现一个系统
主控界面,通过系统主控界面可进入系统的各个功能模块。系统主要的
功能模块如图 所示。
图 系统功能模块图
系统功能模块也可以由系统主空界面所体现,如图 所示。
图 系统功能模块图示
可以看出,在系统主控界面中,我们设计了一个加速键面板,并
分为两个区域,一个区域的加速键用于“对内”管理,一个区域用于“对
外”管理。这样系统的功能和结构更是一清二楚。
商品销售管理系统中数据库与数据表的创建
数据库是数据表的集合,系统开发首先应该开发一个数据库,它
用于存放系统中的数据表,本章还是采用 Microsoft Office 2003 中的
Microsoft Access 2003 来进行数据库与数据表的创建工作。为此我们先
定义数据库中的 7 个数据表的结构。即“商品目录”数据表、“销售部门”
数据表、“雇员”数据表、“订单”数据表、“客户”数据表、“零售商”数据表、
“国家”数据表。
商品销售管理系统中数据库与数据表的设计
本案例所需要的数据表比较多,作为一个商品销售管理系统,尤
其是大型生产企业或企业集团,它们所涉及的内容、范围比较广泛,为
此我们首先定义如下的一些数据表的结构。
1.“商品目录”数据表结构的定义
商品目录是商品销售管理中的一个重要的方面,它来自于企业的
生产实际,也是销售管理中的主要参考对象,因此需要对商品目录进行
有效的管理。根据商品目录的特点,我们特设计“商品目录”数据表的结
构如表 所示。
表 “商品目录”数据表结构
字段名称 字段类型 字段大小 小数位数 索引 必须填写
订购编号
商品编号
部门编号
质量等级
折扣
数字
数字
数字
数字
数字
默认
默认
默认
默认
默认
是
是
是
是
是
“商品目录”数据表一经创建,可以在其中输入一些用于演示的数据
记录,以在后面的对话框制作中显示对话框制作的数据操作效果。其数
据可参考表 所示内容。
表 “商品目录”数据表的参考数据
订购编号 商品编号 部门编号 质量等级 折扣
1047
1048
1048
1049
1049
1050
1050
1050
1050
1051
1052
1052
1053
1053
1053
1054
1054
1055
1055
1055
1055
1056
1056
1057
1058
1058
1
1
2
1
2
1
2
3
4
1
1
2
1
2
3
1
2
1
2
3
4
1
2
1
1
2
900
3316
12316
2954
7619
3340
5318
5378
11635
5349
5313
11221
5356
5324
11238
11518
12301
2367
2954
12386
13545
5318
11221
3340
5313
11238
7
5
4
2
3
1
35
42
8
5
5
7
6
56
8
5
7
8
7
7
5
6
8
5
6
5
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1059
1060
1060
1
1
2
3316
5324
5349
5
45
8
0
0
0
2.“雇员”数据表结构的定义
雇员管理是商品销售管理中的又一个重要方面,因为任何商品销
售的管理均是通过雇员执行的,根据雇员的特点,特设计“雇员”数据表
的结构如表 所示。
表 “雇员”数据表结构
字段名称 字段类型 字段大小 小数位数 索引 必须填写
雇员编号
雇员名字
雇员姓氏
雇员电话
聘用时间
薪水
数字
文本
文本
文本
日期/时间
数字
默认
10
15
16
默认
默认
是
是
是
是
是
是
“雇员”数据表的演示数据可参考表 。
表 “雇员”数据表参考数据
雇员编号 雇员名字 雇员姓氏 雇员电话 聘用时间 薪水
2 Nrldon Roberto 250 88-12-28
4
5
8
9
11
12
14
15
20
24
28
29
34
36
37
44
45
46
52
61
65
71
72
83
85
94
105
107
109
Young
Lambert
Johnson
Forest
Weston
Lee
Hall
Young
Papadopoulos
Fisher
Bennet
De Souza
Baldwin
Reeves
Stansbury
Phong
Ramanathan
Steadman
Nordstrom
Leung
O′Brien
Burbank
Sutherland
Bishop
MacDonald
Williams
Bender
Cook
Brown
Bruce
Kim
Leslie
Phil
.
Terri
Stewart
Katherine
Chris
Pete
Ann
Roger
Janet
Roger
Willie
Leslie
Ashok
Walter
Carol
Luke
Sue Anne
Jennifer M
Claudia
Dana
Mary S.
Randy
Oliver H.
Kevin
Kelly
233
22
410
229
34
256
227
231
887
888
5
288
2
6
7
216
209
210
420
3
877
289
290
477
892
255
894
202
88-12-28
89-2-6
89-4-5
89-4-17
90-1-17
90-5-1
90-6-4
90-6-14
90-1-1
90-9-12
91-2-1
91-2-18
91-3-21
91-4-25
91-4-25
91-6-3
91-8-1
91-8-9
91-10-2
92-2-18
92-3-23
92-4-15
92-4-20
92-6-1
92-6-1
92-8-8
92-10-8
93-2-1
93-2-4
110
113
Ichida
Page
Yuki
Mary
22
845
93-2-4
93-4-12
3.“销售部门”数据表结构的定义
在一个商品销售管理系统中,销售部门自然是它之中的一个重要
内容,特设计“销售部门”数据表的结构如表 所示。
表 “销售部门”数据表结构
字段名称 字段类型 字段大小 小数位数 索引 必须填写
部门编号
说明
库存
订购
成本
价格
数字
文本
数字
数字
数字
数字
默认
50
默认
默认
默认
默认
是
是
是
是
是
“销售部门”数据表的演示数据可参考表 所示内容。
表 “销售部门”数据表的参考数据
部 门 编
号
零 售 商
号
说明 库
存
订
购
成本 价格
900
912
3820
3820
Dive kayak
Underwater Diver
24
5
16
3
504
1680
1313
1314
1316
1320
1328
1330
1364
1390
1946
1986
2314
2341
2343
2350
2367
2383
2390
2612
2613
3511
5641
3511
3511
3511
3511
3511
3511
6588
6588
3511
3511
3511
3511
3511
3511
3511
2014
2014
Vehicle
Regulator System
Second Stage
Regulator
Regulator System
Second Stage
Regulator
Regulator System
Alternate Inflation
Regulator
Second Stage
Regulator
First Stage Regulator
Second Stage
Regulator
Depth/Pressure Gauge
Console
Electronic Console
Depth/Pressure Gauge
Personal Dive Sonar
Compass Console
Mount
Compass(meter only)
Depth/Pressure Gauge
Electronic Console
w/options
Direct Sghting
Compass
Dive Computer
165
98
75
37
166
47
128
146
13
25
13
226
46
211
168
128
24
15
5
216
88
70
35
100
43
135
140
10
24
12
225
45
300
183
120
23
12
2
189
250
365
341
171
430
260
270
170
309
188
390
105
235
29
52
206
420
179
4.“订单”数据表的结构
在商品销售管理系统中,订单管理是不可缺少的,根据订单的特
点,定义“订单”数据表的结构如表 所示。
表 “订单”数据表结构
字段名称 字段类型 字段大小 小数位数 索引 必须填写
订单编号
客户编号
销售日期
交付日期
负 责 人 编
号
合同说明
交付地址
1
交付地址
2
交付城市
交付地点
交付邮编
交 付 的 国
家
数字
数字
日期/时间
日期时间
数字
文本
文本
文本
文本
文本
文本
文本
文本
文本
文本
文本
默认
默认
默认
默认
默认
50
50
50
50
50
10
20
20
20
20
50
50
默认
默认
是
是
是
是
是
是
是
是
是
是
是
是
是
交付电话
交 付 的
VIA
信箱
交付说明
付款方式
贷物总数
税费
运载费
付款总量
文本
数字
数字
数字
数字
默认
默认
是
是
是
是
“订单”数据表的演示数据可以参考表 所示内容。
表 “订单”数据表参考数据
订
单
编
号
客
户
编
号
销
售
日
期
交
付
日
期
负
责
人
编
号
合
同
说
明
交
付
地
址
1
交
付
地
址
2
交
付
城
市
交
付
地
点
交
付
邮
编
交
付
的
国
家
交
付
电
话
交
付
的
V
I
A
信
箱
交
付
说
明
付
款
方
式
贷
物
总
数
税
费
运
载
费
付
款
总
量
1
0
0
3
1
3
5
1
8
8
-
4
8
8
-
5
1
1
4
U
P
S
F
O
B
C
r
e
1
2
5
4
.
0 0
-
1
2
-
3
d
it
0 5
1
0
0
4
2
1
5
6
8
8
-
4
-
1
7
8
8
-
4
-
1
8
1
4
5
M
ar
ia
E
v
e
nt
o
s
h
P
O
B
ox
73
7
Jo
ha
nn
es
bu
rg
2
0
4
2
Rep
ubli
cSo
.Afr
ica
27-
11-
44
32
45
8
D
H
L
F
O
B
C
h
e
c
k
7
8
8
5
0 0
7
8
8
5
1
0
0
5
1
3
5
6
8
8
-
4
-
2
0
8
8
-
1
-
2
1
1
1
0
U
P
S
F
O
B
V
i
s
a
4
8
0
7
0 0
4
8
0
7
1
0
0
6
1
3
8
0
9
4
-
1
1
-
6
8
8
-
1
1
-
7
4
6
E
m
e
r
y
P
1
0
1
3
2
4
F
O
B
V
i
s
a
3
1
9
8
7
0 0 0
1
0
1
3
8
8
8
8
4
5
U
S
F
O V 6
0 0 6
0
7
8
4
-
5
-
1
-
5
-
2
M
a
il
B i
s
a
5
0
0
5
0
0
1
0
0
8
1
5
1
0
8
8
-
5
-
3
8
8
-
5
-
4
1
2
U
S
M
a
il
N
e
t
3
0
V
i
s
a
1
4
4
9.
5
0 0 0
1
0
0
9
1
5
1
3
8
8
-
5
-
1
1
8
8
-
5
-
1
2
7
1
U
S
M
a
il
N
e
t
3
0
C
O
D
5
5
8
7
0 0 0
1
0
1
0
1
5
5
1
8
8
-
5
-
1
1
8
8
-
5
-
1
2
4
6
U
P
S
N
e
t
3
0
C
O
D
4
9
9
6
0 0
4
9
9
6
1
0
1
1
1
5
6
0
8
8
-
5
-
8
8
-
5
-
5
U
P
S
N
e
t
3
0
C
O
D
2
6
7
9.
0 0
2
6
7
9.
1
8
1
9
8
5
8
5
1
0
1
2
1
5
6
3
8
8
-
5
-
1
9
8
8
-
5
-
2
0
1
1
8
U
P
S
N
e
t
3
0
C
r
e
d
it
5
2
0
1
0 0
5
2
0
1
1
0
1
3
1
6
2
4
8
8
-
5
-
2
5
8
8
-
5
-
2
6
1
3
4
E
m
e
r
y
N
e
t
3
0
C
r
e
d
it
3
1
1
5
0 0
3
1
1
5
1
0
1
4
1
6
4
5
8
8
-
5
-
2
5
8
8
-
5
-
2
6
1
4
4
E
m
e
r
y
N
e
t
3
0
C
r
e
d
it
1
3
4.
8
5
0 0
1
3
4.
8
5
1
0
1
5
1
6
5
1
8
8
-
5
-
8
8
-
5
-
7
1
E
m
e
r
y
F
O
B
M
C
2
0
3
2
1.
0 0
2
0
3
2
1.
2
5
2
6
7
5
7
5
1
0
1
6
1
6
8
0
8
8
-
6
-
2
8
8
-
6
-
3
6
5
U
P
S
F
O
B
A
m
E
x
2
6
0
5
0 0 0
1
0
1
7
1
9
8
4
8
8
-
6
-
1
2
8
-
6
-
1
3
2
8
D
H
L
F
O
B
C
h
e
c
k
1
0
1
9
5
0 0 0
1
0
1
8
2
1
1
8
8
8
-
6
-
1
8
8
8
-
6
-
1
9
1
1
8
D
H
L
F
O
B
C
h
e
c
k
5
2
5
6
0 0 0
1
0
1
9
2
1
3
5
8
8
-
6
-
2
8
8
-
6
-
2
1
1
4
D
H
L
N
e
t
3
0
C
r
e
d
it
2
0
6
0
2
0 0 0
4 5
5.“客户”数据表结构定义
客户是销售管理的直接对象,因此客户管理也是商品销售管理中
的一个重要内容,根据客户数据的特点,定义“客户”数据表的结构如表
所示。
表 “客户”数据表结构
字段名称 字段类型 字段大小 小数位数 索引 必须填写
客户编号
公司名称
地址 1
地址 2
城市
所在州名
邮政编码
国家
电话
传真
税费
联系方式
最 后 交 易
数字
文本
文本
文本
文本
文本
文本
文本
文本
文本
数字
文本
日期/时间
默认
50
50
50
50
50
16
50
20
20
10
30
默认
是
是
是
是
是
是
是
是
是
是
是
是
是
日期
“客户”数据表的演示数据可参考表 所示内容。
表 “客户”数据表演示数据
客 户 编
号
公 司 名
称
地址 1 地
址 2
城市 所 在 州
名
邮政编码 国家 电话 传真 税费 联 系 方
式
最后交易日期
1221
1231
1351
Kauai
Dive
Shoppe
Unisco
Sight
Diver
4-976
Sugarloaf
Hwy
PO Box
Z-547
1
Neptune
Lane
Suite
103
Kapaa
Kauai
Freeport
Kato
Paphos
94766-1234
94766-1234
94766-1234
US
Bahamas
Cyprus
808-555-0269
809-555-3915
357-6-876708
808-555-0278
809-555-4958
357-6-870943
0
0
95-2-2
94-11-17
94-10-18
6.“零售商”数据表结构定义
企业产品销售是通过一些零售商进行的,而且零售商的数量远比
批发商的数量多,因此零售商数据管理是商品销售管理的又一个重要组
成部分。根据零售商数据结构的特点,特定义“零售商”数据表的结构如
表 所示。
表 “零售商”数据表结构
字段名称 字段类型 字段大小 小数位数 索引 必须填写
零售商编号
零售商姓名
地址
城市
所在州名
邮政编码
国家
电话
传真
优先偿付
数字
文本
文本
文本
文本
文本
文本
文本
文本
数字
默认
16
50
50
50
16
50
20
20
10
是
是
是
是
是
是
是
是
是
是
“零售商”数据表的演示数据可参考表 所示内容。
表 “零售商”数据表演示数据
零
售
商
编
号
零售商
姓名
地址 城市
所
在
州
名
邮政编
码
国
家
电话 传真
优
先
偿
付
20
14
Cacor
Corjpor
161
South
Southfi
eld
O
H
60093
46208
.A
708-555
-9555
708-555
-7547
-
1
26
41
26
74
35
11
38
19
38
20
45
21
46
42
ation
Underw
ater
cher
Mfg.
Scuba
Professi
onals
Divers ′
Supply
Shop
Techniq
ues
Perry
Scuba
Beauch
at,Inc.
field
Rd
50 N
3rd
Street
65
Adda
ms
Street
3105
East
Brace
5208
Unive
rsity
Dr
52
Dolph
in
Drive
3443
James
Ave
45900
SW
2nd
Ave
Indiana
polis
Berkel
y
Rancho
JDomi
nguez
Macon
Redwo
od City
Hapevi
lle
Ft
Lauder
dale
I
N
M
A
C
A
G
A
G
A
G
A
F
L
02779
90221
20865
94065-
1086
30354
.A
.A
.A
..A
..A
..A
..A
317-555
-4523
800-555
-4744
231-555
-7850
912-555
-6790
415-555
-1410
800-555
-6220
305-555
-7242
508-555
-8949
912-555
-8474
415-555
-1276
404-555
-8280
305-555
-6739
-
1
0
-
1
0
0
-
1
-
1
7.“国家”数据表结构定义
对于大型企业或跨国集团公司,往往一些产品是跨国销售的,因
此国家名录管理也是一个辅助的管理内容,其“国家”数据表的结构定义
如表 所示。
表 “国家”数据表结构
字段名称 字段类型 字段大小 小数位数 索引 必须填写
国家
首都
所在州名
地区
人口
文本
文本
文本
文本
数字
50
16
50
50
默认
是
是
是
是
是
“国家”数据表的演示数据可参考表 所示内容。
表 “国家”数据表演示数据
国家 首都 所在州名 地区 人口
Argentina
Bolivia
Canada
Chile
Colombia
Cuba
Buenos Aires
La Paz
Brasilia
Ottawa
Santiago
Bagota
South
America
South
America
South
America
2777815
1098575
8511196
9976147
756943
1138907
32300003
7300000
150400000
26500000
13200000
33000000
Ecuador
El Salvador
Guyana
Jamaica
Mexico
Nicaragua
Paraguay
Peru
United States
of America
Uruguay
Venezuela
Havana
Quito
San Salvador
Georgetown
Kingston
Mexico City
Managua
Asuncion
Lima
Washington
Montevideo
Caracas
North
America
South
America
South
America
North
America
South
America
North
America
South
America
North
America
North
America
North
America
South
America
South
America
North
America
South
America
South
114524
455502
20865
214969
11424
1967180
139000
406576
1285215
9363130
176140
912047
10600000
10600000
53000000
8000000
25000000
886000000
39000000
46600000
216000000
2492000000
30020000
197000000
America
“商品销售数据库”的创建
商品管理数据库的创建过程与前面章节的创建数据库的方法一样,
这里我们就不再重复了,其保存路径为“D:\VC++写作案例\CH8\商品销
售数据库”。创建的数据库和数据表如图 所示。
图 商品销售数据库及数据表
制作一个系统封面的位图文件
在本案例中,我们仍将制作一个应用系统封面,与案例七一样,
它不再是一个 Splash 画面,而需 要我们自己制作一个对话框作为系统
封面,系统封面往往在系统启动时加以显示。系统封面的作用主要有:
(1)说明系统名称;(2)说明系统的归属,即版权;(3)说明系统制作时间 ;
(4)修饰应用系统。这些内容不是固定的,它可以根据用户的需要和爱好
加以制作。我们首先制作一个系统封面的位图文件,其系统封面的位图
文件如图 所示。
图 系统封面位图
创建“商品销售管理系统”应用程序基本框架
在前面我们已经创建了数据库、数据表、制作了系统封面的位图
文件,也就是作好了系统开发的一切工作,因此我们可以着手应用系统
的界面制作了。在 VC++中,往往将应用程序的界面称作对话框,应用
程序界面的制作往往就是对对话框的应用开发。
本案例我将不再通过 ODBC 数据源创建的方法,创建作为基本框
架中主对话框的数据源,而仅创建一个基本对话框。基本对话框用于制
作应用系统的封面,基本框架的制作过程如下:
(1)结束数据库的创建并启动 VC++,出现 VC++主控界面。
(2)在 VC++主控界面中单击“文件|新建…”菜单项,出现新建工
程类型选择对话框,在工程类型对话框中选择 MFC AppWizard(EXE)工
程类型。
(3)输入工程名称为“商品销售管理系统”并选择 Win32 平台类型。
(4)单击“确定”按钮,进入文档类型设置对话框。
(5)选择“基本对话框”类型,即创建一个基本对话框的应用程序,
设置资源使用的语言为中文。
(6)单击“完成”按钮,出现基本对话框的全部信息,如下所示:
Application type of 商品销售管理系统:
Dialog-Based Application targeting:
Win32
Classes to be created:
Applica5tion: CMylApp in 商品销售管理系统.h and 商品销售
管理系统.cpp
Dialog: CMylDlg in 商品销售管理系统 and 商品销售管
理系统
Features:
+About box on system menu
+3D Controls
+Uses shared DLL implementation ()
+ActiveX Controls support enabled
+Localizable text in:
中文[中国]
确认创建信息之后,即出现应用程序开发的对话框设计界面。
制作应用系统封面
在案例五和案例六的工程中,我们通过增加一个 SPLASH 工程,
作为应用系统的封面资源,但在本案例中,我们将生成的应用系统框架
中的基本对话框 IDD-MY-DIALOG 作为应用系统的封面加以制作。为
什么基本对话框可以作为应用系统封面呢?很显然,在工程编译或运行
时最先启动的就是基本对话框,在前面我们将它称之为主对话框,对主
对话框进行加工制作,用于创建应用系统的封面,通过它确定是否进行
其他的相关操作,其制作步骤如下:
(1)在主对话框 IDD-MY-FORM 中将提示文本框“TODO:在这
个对话框里设置表格控制。”删除。
(2)在主对话框 IDD-MY-FORM 中将两个命令按钮“确定”和“取
消”删除,并放入两个新的命令按钮,设置它伞兵相关属性。
(3)在对话框 IDD-MY-DIALOG 中放入一个图片控件,并加载我
们前面制作的封面位图文件,窗体布局如图 所示。
图 系统封面布局
其中,两个命令按钮控件的属性设置如表 所示。
表 命令按钮对象的基本属性
ID 标题内容
IDC-BUTTONENTER 进入系统
IDC-BUTTONEXIT 退出系统
在两个命令按钮中,其中一个用于退出系统,即结束整个系统操
作,另外一个用于进入系统,所谓进入系统,就是进入应用系统的主界
面(注意:这里我们指的系统主界面不再是由应用系统框架生成的主对
话框,而是我们自己增加并命名的一个对话框)。因此需要给这两个命
令按钮建立消息映射,创建函数名和编制该命令的事务过程代码。其方
法在前面已经大量涉及,就不再重复了。
“进入系统”命令按钮的过程 代码如下所示:
Void CMyDIg::OnButtonenter ()
{
//TODO:Add your control notification handler code here
CMainDIg MainDIg;
();
}
“退出系统”命令按钮的过程代码如下所示:
Void CMyDIg::OnButtonexit ()
{
//TODO: Add your control notification handler code here
OnOK();
}
系统主界面的制作
在 自 动 生 成 的 应 用 程 序 框 架 中 , 我 们 已 经 将 主 对 话 框
IDD-MY-DIALOG 用作了系统封面,作为一个应用系统,目前它还需要
一个系统主控界面,为此我们需要在工程中增加一个对话框资源,用于
制作“商品销售管理系统”主控界面。其步骤如下:
(1)在 VC++主菜单中单击“插入|资源|Dialog”菜单项,确认后即
在工程的视图选项卡中增加了一个新的对话框 IDD-DIALOG1。
(2)将新的对话框 IDD-DIALOG1 的标题属性修改为“商品销售管
理系统主控界面”。
(3)在对话框中加入一个图片控件并调用一个位图文件,对主控
界面加以修饰。
(4)将 OK 命令按钮删除。
(5)将 CANCEL 命令按钮删除。
(6)在对话框中放入三个分组框控件,用于对对话框进行区域划
分,形成层次感。
(7)在对话框中放入一个标签控件,用于说明对话框,其标签标
题名为“商品销售管理系统”。
(8)在对话框中的两个区域之中放入七个命令按钮,作为七个功
能的执行控件。
(9)在对话框中放入现代战争状态条控件 IDC-SBARCTRL1,该
控件是一个 ActiveX 控件,仍旧需要用插入的方法将其插入到对话框中。
该控件在 ActiveX 控件的列表中,如图 所示。
图 状态条控件
状态条控件的制作主要为“分段”,即插入窗格,通过插入窗格的个
数就可以将状态条分为若干段。然后为每一段进行对齐布局和标题设置,
并为每一段安排一个“显砂数据”,可通过“样式”列表进行,如图 所
示。
图 状态条样式设置
用户还可以为每一段即每一个窗格设置一个图片,以对状态条进
行修饰,最后对话框如图 所示。
图 对话框及状态条布局
一个对话框只是一个框架,要使我们增加的对话框资源成为一个
应用系统的主界面,需要用菜单或命令按钮的方法来完成其他程序或对
话的调用,因此我们需要制作一个菜单文档,并与主界面对话框进行连
接。其菜单的制作过程如下:
(1)在 VC++主菜单中单击“插入|资源|Menu”菜单项,确认后即在工
程的视图选项卡中增加了一个菜单文档 IDR-MENU1。
(2)双击该文档,出现菜单设计器,在菜单设计器中设计每一个主
菜单和下拉菜单即可,其设计效果如图 所示。
图 菜单设计
其中所有的菜单条目如表 所示(注意:主菜单无索引编码)。
表 菜单及下拉菜单
ID 标题内容
ID-Menu-SPML
ID-Menu-XSBM
ID-Menu-DDGL
ID-Menu-GYGL
ID-Menu-DLGL
ID-Menu-KHGL
ID-Menu-GJML
商品目录
商品目录管理
销售部门
销售部门管理
订单管理
订单管理
雇员管理
雇员管理
代理商管理
代理商管理
客户管理
客户管理
国家名目
国家名目管理
菜单文档一经创建,就需要用一个对话框来与之连接,成为该对话
框的一个组合部分,这里的菜单连接就是与我们创建的主对话框进行连
接,连接的方法如下:
(3)在对话框的通用属性选项卡中打开“菜单”列表框,选择一个菜
单文档进行关联,如图 所示。
图 对话框与菜单的连接
这样运行工程并调用主界面时,菜单便显示在对话框之中,如图
所示。
图 对话框与菜单的连接效果
菜单的每一个条目与命令按钮的作用几乎是一致的,只是表现形
式不同,主要用于对程序的执行和对话框的调用,因此它仍然需要建立
消息映射、创建命名函数、编制过程代码。由于此处涉及多个菜单,我
们将结合后面的对话框的制作再加以说明
制作“商品目录管理”对话框
在前面我们几乎为“商品销售管理系统”形成了一个完整的框架,它
包括系统封面、主窗口、主菜单、状态条等各种 Windows 应用系统的
相关要素。但还未有任何实质性的功能的制作,因此从本节起我们就将
制作“商品销售管理系统”中的各个功能模块。首先制作“商品目录管理”
对话框。
增加对话框资源并插入控件对象
作为一个较大的应用系统,,往往需要用一些专门的对话框进行分
类的数据处理,因此我们首先需要增加一个对话框资源。其操作如下:
(1)在 VC++主菜单中单击“插入|资源|Dialog”菜单项,确认后即
在工程的视图选项卡中增加了一个新的对话框 IDD_DIALOG1。
(2)将新的对话框 IDD_DIALOG1 的标题属性修改为“商品目录
管理”;而它的资源索引号 IDD_DIALOG1 修改为 IDD_DIALOGSPML。
(3)删除对话框中自动创建的两个命令按钮。
(4)插入一个 ADO 数据源控件 IDC_ADODC1。
(5)插入一个数据表格控件 IDC_DATAGRID1。
其对话框的布局如图 所示。
图 “商品目录管理”对话框布局
为“商品目录管理”对话框创建新类并进行声明
“商品目录管理”对话框是工程中增加的新的资源,因此必须为它创
建一个新类并加以声明,关于对话框的类的创建过程我们就不多介绍了,
将它的新类命名为“CSpm1Dlg”。
一个新的类一经创建,就需要在工程中对此加以声明,目前调用
该对话框资源的对话框是 IDD-MainD1g,因此需要在它的实现文件中加
以声明,其声明过程如下所示:
// : implementation file
//
#include ""
#include "商品销售管理系统.h"
#include ""
#include ""
#ifdef _DEBUG
#define new DEBUG-NEW
#undef THIS-FILE
Static char THIS-FILE[ ]=_FILE_;
#endif
这样在以后的使用中,可以将它作为一个已知的资源加以调用。
为“商品目录管理”对话框引入数据源
与前面的任何数据管理一样,进行数据管理的对话框必须引入或
创建一个数据源,其操作如下:
在“商品目录管理”对话框中插入一个 ActiveX 控件 ADODC1,并
设置其基本属性,如表 所示。
表 ADODC1 控件对象的基本属性
属性 属性内容
ID
显示
标题
ConnectionString
RecordSource
CommandType
IDC_ADODCSPML
YES
商品目录
DSN=商品销售数据源
商品目录
2-Table CommandType
其中 ADODC1 控件属性中的 DSN 属性的设置过程如下:
(1)用鼠标右键单击 ADODC1 控件,出现一个属性设置页面,
将该页面切换至控制属性页面,在控制页面中选择数据源创建类型,并
新建一个数据源,出现一个数据源类型选择对话框,如图 所示。
在数据源类型选择对话框中,我们选择一个仅用于本地机的用户
数据源类型。
(2)单击“下一步”按钮,出现一个选择数据源驱动程序的对话框,
我们仍然选择 Microsoft Access 数据源驱动程序,如图 所示。
(3)单击“下一步”按钮,出现完成安装数据源设置的过程。
(4)单击“完成”按钮,出现一个数据源设置对话框,如图 所
示。
在数据源设置对话框中,首先需要设置一个数据源名称,它是我
们后面调用该数据源的依据,为其取名为“商品销售数据源”。另外用户
可对该数据源作一个描述或说明,如描述为“该数据源用于创建一个商
品销售管理系统”。
图 数据源类型选择
图 数据源驱动程序选择
(5)单击 Select 按钮,出现一个打开文件对话框,在对话框中选
择前面创建的“商品销售数据库.mdb”即可,如图 所示。
(6)单击 OK 按钮,即完成整个数据源文件的创建工作。
图 数据源设置
图 数据源中的数据库选择
接下来我们为 ADODC1 控件选择数据源,即“商品销售数据源”,
如图 所示。
(7)将 ADODC1 的属性设置选项卡页面切换至“记录源”页面,
为 ADODC1 控件设置数据源命令类型和数据表文件,如图 所示。
图 ADODC1 的数据源选
图 ADODC1 记录源设置
设置记录源本质上就是从创建的数据源中选择一个数据表文件。
确认后即完成整个 ADODC1 控件的属性设置过程。
为“商品目录管理”对话框引入表格控件
在前面我们已经为“商品目录管理”对话框引入了数据源控件
ADODC1,并创建了数据源,为能在对话框中对商品目录进行管理,我
们需要在对话框中插入一个数据表格控件 IDC_DATAGRID1,它的插入
方法在前面已经多次介绍过,这里就不再重复。其表格控件的基本属性
如表 所示。
表 DataGrid 控件的基本属性
属性 属性内容
ID
显示
IDC_DATAGRID1
YES
标题
DataSource
AllowAddNew
AllowArrows
AllowDelete
AllowUpdate
商品目编辑查询表格
IDC_ADODCSPML
True
True
True
True
最后的“商品目录管理”对话框的布局如图 所示,其运行效果
如图 所示。
图 “商品目录”管理界面
用主对话框中的菜单条目调用对话框
我们已经制作好了“商品目录管理”对话框,但它是作为工程中的一
个类来使用的,为此我们需要用一定的工具来调用该对话框,这个工具
就是菜单资源,在主控界面中我们还制作了菜单的加速键,这里就需要
我们用菜单和加速键来调用“商品目录管理”对话框。菜单是与主对话框
IDD_MainDlg 进行连接的,因此它已经从属于 IDD_MainDlg 类并列于
其中,但与其他的命令按钮一样,需要为每一菜单建立消息映射、创建
函数过程并编辑过程代码。我们以“商品目录”菜单为例,来说明“商品
目录”菜单对“商品目录管理”对话框的调用方法,其操作如下:
(1)在工程中的视图选项卡中双击“IDD_MainDlg”对话框,出现
该对话框。
(2)用鼠标右键单击“IDD_MainDlg”对话框,出现一个快捷菜单。
(3)在快捷菜单中单击“创建类向导”,出现一个消息映射选项卡,
如图 所示。
图 类向导选项卡
类向导选项卡中的第一个页面即为消息映射页面,在该页面的对
象索引目录中显示了全部菜单条目的名称。
(4)选择“ID_Menu_SPML”菜单条目,即“商品目录”菜单条目,
并选择消息类型为“COMMAND”类型,即命令类型,则激活 Add Function
按钮。
(5)单击 Add Function 按钮,出现菜单函数定义界面,建议直接
接受系统提示的函数名称。
(6)然后单击 Edit Code 按钮编制过程代码,其过程代码如下所
示:
Void CMainDlg::OnMenuSPML ( )
{
//TODO:: Add your command handler code here
CSpmlDlg SpmlDlg;
( );
}
这样就将主菜单与“商品目录管理”对话框进行了连接,从而编译运
行工程时可以利用该菜单直接调用“商品目录管理”对话框。
另外,我们还建立了一个“商品目录”菜单对应的加速键命令按钮。
为它建立消息映射、创建函数和编制代码,其方法有两种,第一种是按
“商品目录”菜单一样的过程进行;第二种方法是直接为“商品目录”加速
键引用“商品目录”菜单的资源索引号。其具体过程如下:
(1)用鼠标右键单击“商品目录”加速键,出现一个快捷菜单。
(2)在快捷菜单中选择“属性”,出现“商品目录”加速键按钮的属
性设置对话框。
(3)在属性设置对话框的资源列表框中选择对应的菜单索引,如
图 所示。
图 商品目录加速键与对应菜单
这样即快速完成 了加速键与菜单的对应,并可通过它调用“商品
目录管理”对话框。
其他对话框的制作
在前面我们已经制作了一个“商品目录管理”对话框,还有 6 个方面
的管理内容的对话框需要制作,其中包括:“销售部门管理”对话框、“雇
员管理 ”对话框、“订单管理”对话框、“代理管理 ”对话框、“客户管理”对
话框、“国家名目管理”对话框。
这 6 个对话框的制作过程完全可以采用与“商品目录管理”对话框一
样的制作方法进行,因此我们不再重复 6 次地进行描述了。我们用一个
总表来概括这 7 个对话框的类创建、类声明、数据源控件设置和数据表
控件设置 (表 )然后列出主对话框的实现文档供读者参考,它包
含了类的声明、进程代码等等内容,这样可以起到事半功倍的作用。
对话框制作参考表
在工程中,七个对话框的类、声明、数据源与数据表控件的创建
请参考表 。
表 七个对话框的类、声明、数据源与数据表设置参考
“商品目录管理”对话框
类名及声明 数据源 数据表
CSpmlDlg IDC_ADODCSPML IDC_DATAGRIDI
属性 属性内容 属性 属性内容
ID IDC_ADODCSML ID IDC_DATAGRIDI
显示 YES 显示 YES
标题 商品目录 标题
商品目录编辑查询
表格
ConnectionStrin
g
DSN=商品销售数据源 DataSource IDC_ADODCSPML
RecordJSource 商品目录 AllowAddNew True
CommandType 2-Table CommandType AllowArrows True
AllowDelete True
# include
""
AllowUpdate True
“部门管理”对话框
类名及声明 数据源 数据表
CBmglDlg IDC_ADODCBMGL IDC_DATAGRIDI
属性 属性内容 属性 属性内容
ID IDC_ADODCBMGL ID IDC_DATAGRIDI
显示 YES 显示 YES
标题 部门管理浏览查询 标题 销售部门编辑查询
ConnectionStrin
g
DSN=商品销售数据源 DataSource IDC_ADODCBMGL
RecordSource 销售部门 AllowAddNew True
CommandType 2-Table CommandType AllowArrows True
AllowDelete True
# include
""
AllowUpdate True
“雇员管理”对话框
类名及声明 数据源 数据表
CGygldlg IDC_ADODCGYGL IDC_DATAGRIDI
属性 属性内容 属性 属性内容
ID IDC_ADODCGYGL ID IDC_DATAGRIDI
显示 YES 显示 YES
标题 雇员浏览查询 标题 雇员编辑表格
ConnectionStrin
g
DSN=销售管理数据源 DataSource IDC_ADODCGYGL
RecordSource 雇员 AllowAddNew True
CommandType 2-Tanle CommandType AllowArrows True
AllowDelete True
# include
""
AllowUpdate True
“订单管理”对话框
类名及声明 数据源 数据表
CDdglDlg IDC_ADODCDDGL IDC_DATAGRIDI
属性 属性内容 属性 属性内容
ID IDC_ADODCDDGL ID IDC_DATAGRIDI
显示 YES 显示 YES
标题 订单浏览查询 标题 订单编辑表
ConnectionStrin
g
DSN=商品销售数据源 DataSource IDC_ADODCDDGL
RecordSource 订单 AllowAddNew True
CommandType 2-Table CommandType AllowArrows True
AllowDelete True
# include
""
AllowUpdate True
“代理管理”对话框
类名及声明 数据源 数据表
IDC_ADODCDLGL IDC_DATAGRIDI
属性 属性内容 属性 属性内容
ID IDC_ADODCDDGL ID IDC_DATAGRIDI
显示 YES 显示 YES
标题 学术论文浏览查询 标题 学术论文编辑表
ConnectionStrin
g
DSN=商品销售数据源 DataSource IDC_ADODCDLGL
RecordSource 零售商 AllowAddNew True
CommandType 2-Table CommandType AllowArrows True
AllowDelete True
# include
""
AllowUpdate True
“客户管理”对话框
类名及声明 数据源 数据表
IDC_ADODCKHGL IDC_DATAGRIDI
属性 属性内容 属性 属性内容
ID IDC_ADODCDDGL ID IDC_DATAGRIDI
显示 YES 显示 YES
标题 客户浏览查询 标题 客户编辑表
ConnectionStrin
g
DSN=商品销售数据源 DataSource IDC_ADODCKHGL
RecordSource 客户 AllowAddNew True
CommandType 2-Table CommandType AllowArrows True
AllowDelete True
CKhglDlg
# include
""
AllowUpdate True
“国家名目管理”对话框
类名及声明 数据源 数据表
CGjmmDlg IDC_ADODCGJMM IDC_DATAGRIDI
属性 属性内容 属性 属性内容
ID IDC_ADODCGJMM ID IDC_DATAGRIDI
显示 YES 显示 YES
标题 国家名目浏览查询 标题 国家名目编辑表
ConnectionStrin
g
DSN=商品销售数据源 DataSource IDC_ADODCCGJMM
RecordSource 客户 AllowAddNew True
# include
""
CommandType 2-Table CommandType AllowArrows True
AllowDelete True
AllowUpdate True
读者在制作后面几个对话框时可以结合以下的总表加以实施。
主控界面的实现文件
最后我们列出工程主对话框 IDD_MainDlg 的实现文件,我们制作
的一切的对话框几乎均是通过主对话框进行控制的,因此该对话框的实
现文件几乎包含了后面制作的对话框的全部内容,包括菜单过程和中速
键过程的一切代码。了解对话框或工程的实现的文件,对于学习运用
VC++是大有好处的。
// : implementation file
# include ""
# include "商品销售管理系统.h"
# include ""
# include ""
# include ""
# include ""
# include ""
# include ""
# include ""
# include ""
# ifdef _DEBUG
# define new DEBUG_NEW
# undef THIS_FILE
Static char THIS_FILE[ ]=_FILE_;
# endif
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / / / / / / / / / / / / / / / / / CMainDlg dialog
CMainDlg::CMainDlg (CWnd* pParent /*=NULL*/) : CDialog
(CMainDlg::IDD, pParent)
{
//{ {AFX_DATA_INIT(CMainDlg)
//NOTE: the ClassWizard will add member initialization here
//} }AFX_DATA_INIT
}
Void CMainDlg::DoDoataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{ { AFX_DATA_MAP(CMainDlg)
//NOTE:the ClassWizard will add DDX and DDV calls here
//}}AFX _DATA_MAP
}
BEGIN_MESSAGE_MAP(CMainDlg, CDialog)
//{{AFX_MSG_MAP(CMainDlg)
ON_COMMAND(ID_Menu_SPML, OnMenuSPML)
//ON_BN_CLICKED(IDC_BUTTONSPML, OnButtonspml)
ON_COMMAND(ID_Menu_DDGL, OnMenuDDGL)
ON_COMMAND(ID_Menu_DLGL, OnMenuDLGL)
ON_COMMAND(ID_Menu_GJML, OnMenuGJML)
ON_COMMAND(ID_Menu_GYGL, OnMenuGYGL)
ON_COMMAND(ID_Menu_KHGL, OnMenuKHGL)
ON_BN_CLICKED(ID_Menu_SPML, OnMenuSPML)
ON_COMMAND(ID_Menu_XSBM, OnMenuXSBM)
//}}AFX _MSG_MAP
END_MESSAGE_MAP ( )
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / / / / / / / / / / / / / / / / / / CMainDlg message handlers
Void CMainDlg::OnMenuSPML( )
{
//TODO: Add your command handler code here
CSpmlDlg SpmlDlg;
SpmlDlg. DoModal ( );
}
Void CMainDlg::OnButtonspml( )
{
//TODO: Add your control notification handler code here
CSpmlDlg SpmlDlg;
SpmlDlg. DoModal ( );
}
Void CMainDlg::OnMenuDDGL( )
{
//TODO: Add your command handler code here
CDdglDlg DdglDlg;
( );
}
Void CMainDlg::OnMenuDLGL( )
{
//TODO: Add your command handler code here
CDlgDlg DlgDlg;
( );
}
Void CMainDlg::OnMenuGJML( )
{
//TODO: Add your command handler code here
CGjmmDlg GjmmDlg;
GjmmDlg. DoModal( );
}
Void CMainDlg::OnMenuGYGL( )
{
//TODO: Add your command handler code here
CGyglDlg GyglDlg;
GyglDlg. DoModal ( );
}
Void CMainDlg::OnMenuKHGL ( )
{
//TODO: Add your command handler code here
CKhglDlg KhglDlg;
KhglDlg. DoModal ( );
}
Void CMainDlg::OnMenuXSBM ( )
{
//TODO: Add your command handler code here
CBmglDlg BmglDlg;
BmglDlg. DoModal( );
}
工程实现文件的代码分析
在最后我们列出工程的实现文件,读者可以看出,在工程的实现文
件中,它包括了对主对话框的声明和调用,这样读者可以了解工程执行的
前后关系.工程实现文件内容如下所示:
//商品销售管理系统 : implementation file
# include ""
# include"商品销售管理系统.h"
# include"商品销售管理系统 "
# include ""
# ifdef _DEBUG
# define new DEBUG_NEW
# undef THIS_FILE
Static char THIS_FILE[ ]=_FILE_;
# endif
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
CAboutDlg dialog used for App About
Class CAboutDlg:public CDialog
{
Public:
CAboutDlg ( );
//Dialog Data
//{{AFX_DATA(CAboutDlg)
Enum { IDD=ABOUTBOX };
//}}AFX_DATA
//ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
Protected:
Virtual void DoDataExchange(CDataExchange*
pDX); //DDX/DDV support
//}}AFX_VIRTUAL
//Implementation
Protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP ( )
};
CAboutDlg::CAboutDlg ( ) : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA(CAboutDlg)
//}}AFX_DATA_INIT
}
Void CAboutDlg::DoDoataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{ { AFX_DATA_MAP(CAboutDlg)
//}}AFX _DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP( )
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / / / / / / / / / / / / / / / / / / CMyDlg dialog
CMainDlg::CMyDlg (CWnd* pParent /*=NULL*/) : CDialog
(CMainDlg::IDD, pParent)
{
//{ {AFX_DATA_INIT(CMyDlg)
//NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
//Note that LoadIcon does not require a subsequent DestroyIcon
in Win32
m_hIcon = AfxGetApp( )->LoadIcon(IDR_MAINFRAME);
}
Void CMyDlg::DoDoataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{ AFX_DATA_MAP(CMyDlg)
//NOTE:the ClassWizard will add DDX and DDV calls here
//}}AFX _DATA_MAP
}
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
//{{AFX_MSG_MAP(CMyDlg)
ON_WM_SYSCOMMAND( )
ON_WM_PAINT( )
ON_WM_QUERYDRAGICON( )
ON_BN_CLICKED(IDC_BUTTONEXIT, OnButtonexit)
ON_BN_CLICKED(IDC_BUTTONENTER, OnButtonexit)
//}}AFX _MSG_MAP
END_MESSAGE_MAP ( )
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / / / / / / / / / / / / / / / / / / CMyDlg message handlers
BOOL CMyDlg::OnInitDialogf( )
{
CDialog::OnInitDialog( );
/ / Add "About…"menu item to system menu.
/ / IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) ==
IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu !=NULL)
{
CString strAboutMenu;
(IDS_ABOUTBOX);
if (!())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBO
X,strAboutMenu);
}
}
//Set the icon for this dialog. The framework does this automatically
//when the application’s main window is not a dialog
SetIcon(m_hIcon, TRUE); / / Set big icon
SetIcon(m_hIcon, TRUE); / / Set big icon
//TODO: Add extra initialization here
Return TRUE; / / return TRUE unless you set the focus to a control
}
Void CMyDlg::OnSysCommand(UINT mID, LPARAM IParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
( );
}
Else
{
CDialog::OnSysCommand(nID, lParam);
}
}
//If you add a minimize button to your dialog, you will need the code
below
//to draw the icon. For MFC applications using the document/view
model,
Void CMyDlg::OnPaint( )
{
if(IsIconic( ))
{
CPaintDC dc(this); / / device context for painting
SendMessage(WM_ICONERASEBKGND,(WPARAM)
( ),0);
//Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (( ) – cxIcon + 1) / 2;
int y = (( ) – cyIcon + 1) / 2;
//Draw the icon
(x, y, m_hIcon);
}
Else
{
CDialog::OnPaint( );
}
}
//The system calls this to obtain the cursor to display while the user
drags
//the minimized window.
HCURSOR CMyDlg::OnQueryDragIcon( )
{
Return (HCURSOR) m_hIcon;
}
Void CMyDlg::OnButtonexit( )
{
//TODO: Add your control notification handler code here
OnOK( );
}
Void CMyDlg::OnButtonenter( )
{
//TODO: Add your control notification handler code here
CMainDlg MainDlg;
( );
}
本案例我们制作了一个商品销售管理系统,它与高校科研管理系统
的制作十分类似,但它具有自己的特色,在案例中也加入了一些新的内容,
如主窗体的布局风格、加速键与菜单条目的资源索引共享等等。通过该
系统的制作,读者可以加深用 VC++制作数据库应用系统的印象,从而
更深入地了解系统制作的一般过程。
2022 年 12 月 16 日星期五 16:10:23
:1016:10: 时 10 分 4 时 10 分
23 秒 Dec. 16, 2216 December 20224:10:23 PM16:10:23