原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
2 G, A" H& ?" s2 L' t
) z5 [! z# U* j( d一、概述:0 o0 [6 f6 K" X3 r. |( h, y5 I
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。0 ~$ L) a% R7 C4 ~
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。. S9 Z; U2 Z( n8 {# T9 x7 o
' k. v/ b3 q/ S! ?" s" C我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
( Q. }: G3 o# l D7 Q: d. e9 L* Y但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。) L3 @$ X" A( s7 x2 Y% V7 ]
* b/ m1 O3 O) W. D2 O' I) n
二、书写一个“真正的”窗口消息处理函数:
2 V3 c& U G& k: ]- {6 f j按照普通窗口的方式书写好消息处理函数。
- N/ E4 O8 m& |$ Z4 l(不要漏掉了DefWindowProc)' o3 d6 e9 j0 o. j* A: ]: J: P) f
# v* |; h( g( r# y" Q
三、注册窗口类. w! K* o0 j: z+ c9 ]+ Q
用书写的消息处理函数注册一个窗口类。
% J0 K; n+ J/ `. A0 v; b( v
6 R7 a0 z# i5 Z 四、建立对话框资源,指定窗口类为自定的窗口类。3 A5 q/ L5 T2 E% {
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。" e' [" i( R/ K% A
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")
( a3 h0 ~7 ]- z* c; i" Y. _8 U例:
9 @' c: l, j; c3 [7 ]建立文件Some.dlg4 D0 s f4 \, f# ]9 X
书写:5 A3 T4 c7 D' N c1 s
HexCalc DIALOG -1, -1, 102, 122% X# N, |% s5 T, W
- |1 a* Q: \/ W8 J
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
/ P% O% B: L- N& s& K
* k3 T4 o+ ~+ x$ N" {6 L5 [CLASS "HexCalc" //填写上自己注册的类名称
/ b4 K1 X8 `' v C: |+ ]8 P- q' I$ p2 J
CAPTION "Hex Calculator"
0 k% V0 E9 }" u9 m! h8 X& d" v5 e0 A3 ~& p5 l- W. v' V! e
{
6 h1 `; C& ?2 F* G. _3 ]# y Q
" C4 K! t0 d% ^4 [8 L3 s PUSHBUTTON "D", 68, 8, 24, 14, 14
7 K: u& x! g; A
: B5 \2 ]5 A! v3 K M# F% ~. a PUSHBUTTON "A", 65, 8, 40, 14, 14
7 E& s# k0 t5 X0 }9 v3 a& L
5 \8 N0 i. o0 ]% W //各种控件
! l' e) C. _& z8 n' }# h6 ]+ c% E3 Y4 T
}
) A9 c/ W' k* h" y* P
) v& y& e8 K7 ^* ~4 W五、使用非模式对话框方式建立主窗口:( c* d: [/ K7 a4 O; _
建立主窗口的时候,使用CreateDialog。$ I' L' s5 r" z7 ]" D
hwnd = CreateDialog (
3 {+ N6 ~. Q: o" R2 ` hInstance,
" a9 M8 Q/ r5 C S) L7 ` szAppName, //对话框模板& [6 |3 l6 M8 I4 X! [
0,
' s, M0 Z+ P/ y3 i! f/ ^6 e NULL) ;. n6 ^/ T( o o6 F- p
ShowWindow (hwnd, iCmdShow) ;5 r3 k( d+ t8 R }7 A9 ~3 d
8 `. X. e: ` t 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
0 s9 V2 @3 \0 t4 a7 h& p' z2 B Ⅱ.在对话框中建立自定义子窗口 $ ^1 r, K G9 X" h8 F
可以自己定义控件,然后在对话框模板中使用
# |% s( E9 E6 k8 K9 @" C. m# h+ X$ u, B
一、定义"窗口类"与消息处理函数:
4 l# a- f' A% K' K! ^# q e, R在WinMain中1 d; ?5 b" G" e: Z, u
除了注册主窗口类外,4 g, J- c0 D6 Q
另外注册用于对话框的类,指明类对应的消息处理函数9 G( b7 }8 p" h) S
wndclass.style = CS_HREDRAW | CS_VREDRAW ;7 J0 [2 x, I& c9 N* P \0 J1 M; f
wndclass.lpfnWndProc = SomeWndProc ; //对应的消息处理函数
6 ?4 |& y$ F" r; S) zwndclass.cbClsExtra = 0 ;
$ R0 \1 j& n& V" y$ Lwndclass.cbWndExtra = 0 ;" O2 A$ N; q$ D5 s0 M
wndclass.hInstance = hInstance ;
7 }" R: F, K. E3 c6 Y6 q8 ewndclass.hIcon = NULL ;, K- o3 Y! _- m3 W( o4 k/ Z5 g9 v
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
+ y, t+ }9 |! S4 Pwndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
e j# s7 i1 I" v1 jwndclass.lpszMenuName = NULL ;
2 s$ v' ~* s1 K/ [4 p: ?2 x# [' Hwndclass.lpszClassName = TEXT ("SomeControl") ;) x. x& o) g" g& I( f
RegisterClass (&wndclass) ;0 F! S; w: _, v
$ z3 B; w/ U' f' q1 a; |
同时,还要书写好消息处理函数SomeWndProc。
: X, Z, q: z$ h 二、在对话框模板中添加自定义控件窗口:
- h4 G0 d. U3 x3 ] d在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
8 J4 m/ w; ]7 l5 G1 s- n- T4 n |