原文:http://www.th7.cn/Article/bc/VC/200702/10177.html7 L9 |9 Q. _2 ~/ }/ P
) h7 C. g: z2 p6 [8 R" p. W一、概述:
8 w, @4 @% P: p在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。
" u0 k" o5 v2 Q, H1 b使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。0 E6 S. _2 o5 J5 V) [
- k( X% u/ E- r9 @4 l7 S
我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。* O2 }. T' Z2 j5 K+ I3 i R: y3 e( ^
但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。
; y1 @( Y4 z6 C0 }. b/ j
7 @/ w5 n1 X+ Z5 x 二、书写一个“真正的”窗口消息处理函数:
5 @$ u9 U3 @% G- u8 H F按照普通窗口的方式书写好消息处理函数。 L$ T& j7 B' ~6 P4 J& D% H
(不要漏掉了DefWindowProc); S/ y- Y5 t. b5 j$ h) k
" F1 p7 D: M# T# C; G
三、注册窗口类* X9 E% C9 a3 w
用书写的消息处理函数注册一个窗口类。) d# Y! u/ D, A1 }8 ]! N
; t* Z: }0 T" _
四、建立对话框资源,指定窗口类为自定的窗口类。
E/ Y1 x# O' k0 P& I手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。6 O+ C. x& t4 ]; Y
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")5 k( ~2 c, ?3 L1 ^1 s0 W, _
例:
: R& O0 O: M3 X建立文件Some.dlg
, [3 A$ `' v% n; L3 _, S书写:5 P3 c' T/ x7 \
HexCalc DIALOG -1, -1, 102, 122( V2 S& K/ Z( q3 m6 @! v# m3 z
' l: Y* C: c$ K+ B* w
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
2 |- C; z2 f# j* a
4 C' S. @5 `: s2 W4 wCLASS "HexCalc" //填写上自己注册的类名称
8 R: ~- W9 @0 h% _8 m5 ^( e/ B) h/ n4 x. @% x0 e$ R: H- o( K
CAPTION "Hex Calculator"0 t9 a3 |7 e4 q7 P6 S1 Y, U
" r! B$ K' ]3 h% v
{- a6 \% L' k8 X& f; D J' U
1 X+ O4 t7 P _+ w4 | i- a8 x# { PUSHBUTTON "D", 68, 8, 24, 14, 14: \0 y, g. w- t2 z/ @1 g8 k
q$ H1 Q# c+ j) [ PUSHBUTTON "A", 65, 8, 40, 14, 14
/ I! e3 h" U! F" w+ o
& o8 n: t& t3 V$ s //各种控件
: Z, V3 a a. _+ \
9 E5 n$ S4 n/ n% V} : S0 j5 W6 U9 O, F9 d
1 N8 \6 z- I3 u0 v
五、使用非模式对话框方式建立主窗口:
) [( y( ^& z2 y. ]" @: F g建立主窗口的时候,使用CreateDialog。# v9 b' Z3 Z8 u6 p5 _9 H5 e
hwnd = CreateDialog (( E/ W/ B6 @. F6 ~0 O1 w/ v
hInstance,5 \) o8 D! U$ ?( \* t9 v
szAppName, //对话框模板& c8 h. a, q3 @3 a# @6 ^
0,
d$ e3 `9 e6 F% v: b7 b NULL) ;% y% p+ w. L$ G/ n, f( g+ E
ShowWindow (hwnd, iCmdShow) ;
h/ Y* Z+ o. P; y. D. d9 U7 m
% }9 L7 [/ g" |/ d @* ~1 d5 r3 L) A 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
r2 K8 I0 k- @6 N. r Ⅱ.在对话框中建立自定义子窗口 8 ]1 b, W2 E: n" z7 Q5 `) j
可以自己定义控件,然后在对话框模板中使用
% w$ _: D% {* H) A! N
! }' M# e' e0 g# e 一、定义"窗口类"与消息处理函数:+ Z7 F, Y1 k3 w( @# \* {
在WinMain中
& l/ L4 r/ R. R: ?7 K+ k+ u除了注册主窗口类外,/ d: G$ V U( l" \) [
另外注册用于对话框的类,指明类对应的消息处理函数; Z) i e* V# n L/ t; r
wndclass.style = CS_HREDRAW | CS_VREDRAW ; J9 o g# Q! ]! t( j
wndclass.lpfnWndProc = SomeWndProc ; //对应的消息处理函数9 U0 Y8 N) n5 s
wndclass.cbClsExtra = 0 ;6 B% ]+ c& J$ y/ i2 ]
wndclass.cbWndExtra = 0 ;% h; C2 y$ [; C+ f1 `" f
wndclass.hInstance = hInstance ;
# r& {! N% E4 @8 L% ?: Y+ Pwndclass.hIcon = NULL ;
6 G: P6 \& _7 |- b7 Qwndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;( K4 d' x9 g+ w; G, @6 T6 y) O6 d
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;0 H4 j5 g2 Z% _/ S' m2 f6 I
wndclass.lpszMenuName = NULL ;
6 u7 X! d# w7 L* F: s; Kwndclass.lpszClassName = TEXT ("SomeControl") ;
8 a( U5 d# E1 N3 d+ P {- QRegisterClass (&wndclass) ;
2 `2 {3 ]1 ^ _, |( t; e2 g* c0 E( e! d8 l8 Q
同时,还要书写好消息处理函数SomeWndProc。
* V9 z3 I u/ G' P7 B% Y 二、在对话框模板中添加自定义控件窗口:4 e+ I9 R5 Q& c$ o7 T1 Q
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
2 ~0 q7 g: d; W6 C) N5 [% P |