原文:http://www.th7.cn/Article/bc/VC/200702/10177.html* N# N6 e O8 }5 d- ^( S
+ _' {: A/ W- {; b$ a4 K" M6 `4 a# K$ [一、概述:( j" _! I; W! c+ q5 A g
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。
" y8 W. v; j# J+ c+ I( T, ? Y3 U R使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。7 _( z. s6 |5 s& F7 P- W( E
6 M( c: z' Q+ Q* G% F5 M$ D; e, V! p我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。2 y' J5 f0 ^5 e" n# u
但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。! U) Z- g$ C. s; v3 C
) A0 ?3 o: o1 g" g. o
二、书写一个“真正的”窗口消息处理函数:
; R5 w+ V8 }0 c. A' i按照普通窗口的方式书写好消息处理函数。* M: W) o& d; S+ {0 m6 q
(不要漏掉了DefWindowProc)
, Z: O5 q: J8 Z) _7 Y/ Z
* |6 P) W) u' j# p 三、注册窗口类% d s# p V, S6 L5 |
用书写的消息处理函数注册一个窗口类。7 F' o" k- ~- H0 K# V5 ^, I
9 ~8 q, h& X1 T f) ?# j 四、建立对话框资源,指定窗口类为自定的窗口类。
: S% y+ \5 Z! r, @' s D手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。' I* w8 H. E) Z. g2 t) Q( i
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")
8 U* m7 T) O1 R# H5 c8 ]$ |例:
+ M5 \4 c; L. [: a建立文件Some.dlg1 j1 I( m( }3 `2 z. I$ `) j8 {
书写:% t5 K' W7 Q0 M
HexCalc DIALOG -1, -1, 102, 122
, B* {7 N' X7 x& P* o" ?4 o7 p; u' p' E- Z
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX% [: ^4 C5 p/ b% ~; b+ c
0 t, O. v# [: p' }. {) A
CLASS "HexCalc" //填写上自己注册的类名称
- t/ V5 ^, `+ V1 L8 v0 B- e D) w: `8 {# Y% [2 R( I
CAPTION "Hex Calculator"9 W+ m, v$ J; H/ e% i
1 ^: }6 b' h# f3 q- v. X
{
0 F8 F& _- L& l8 F, u3 t$ @/ ^$ l# Z' o$ t# E# n
PUSHBUTTON "D", 68, 8, 24, 14, 14
+ R7 a" h! [% {! {8 O, R9 T! T% ~+ c
3 P0 i! J5 K! Q& X3 I PUSHBUTTON "A", 65, 8, 40, 14, 14* c/ R0 G& o! M9 E7 J( b: i( l
) @5 X9 b! C/ k( Y) a //各种控件
' V7 J$ O4 X( H$ n ]. D! o8 k9 Z/ w$ l- j s
}
2 Y2 Y3 p! d* ~
0 x1 |# {: }5 ~$ O5 [* s$ Y五、使用非模式对话框方式建立主窗口:$ x" g: m8 k- `$ o- D
建立主窗口的时候,使用CreateDialog。& S, R% \6 K% @% o7 }1 A" \
hwnd = CreateDialog (
0 V3 N' o! z4 R3 O; J, f! E. A hInstance,' }/ H( o7 l A2 K* q
szAppName, //对话框模板
4 h: Q; ~" W# y- m3 K+ s7 b" _2 e6 y 0,0 f: k4 s w8 L* g" T
NULL) ;
2 h+ l0 X1 C1 y4 L# s6 @ShowWindow (hwnd, iCmdShow) ;
9 B; j6 W8 |2 T+ s X0 c& N
- K% P$ @. P4 B 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
A! w- s. k/ D) E Ⅱ.在对话框中建立自定义子窗口
$ q2 S: D! {/ Z( Q可以自己定义控件,然后在对话框模板中使用3 y$ o' e8 ]% Q n4 D; y# \
, B1 F7 v+ B5 e! V' C6 y0 M# \
一、定义"窗口类"与消息处理函数:4 H$ e; j+ L% R2 {1 _
在WinMain中
. t5 _4 P* u1 t6 w+ O/ @4 e/ b除了注册主窗口类外,' K6 g0 U }* W+ F1 K
另外注册用于对话框的类,指明类对应的消息处理函数
4 f8 Y0 Z/ v+ o7 Zwndclass.style = CS_HREDRAW | CS_VREDRAW ;4 a' b) ]9 c3 d6 { \ [& N
wndclass.lpfnWndProc = SomeWndProc ; //对应的消息处理函数
" J* D# N) K1 g% pwndclass.cbClsExtra = 0 ;2 j- q0 j7 U. I$ W3 ?8 F, j
wndclass.cbWndExtra = 0 ;
+ p. _+ P! H2 Z$ g6 \* mwndclass.hInstance = hInstance ;+ s9 q) J: Q, W6 a5 ]
wndclass.hIcon = NULL ;$ m1 ^! _% o7 N0 {4 b& l P% k! ]
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
: j* [; F4 V$ h8 U* O; E% v5 |wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;4 w" c/ P3 [7 `
wndclass.lpszMenuName = NULL ;% [4 \" s. M( I8 h P, |( v
wndclass.lpszClassName = TEXT ("SomeControl") ;* x4 [& L( U0 g
RegisterClass (&wndclass) ;) P! D+ T5 S: ?) ~
7 s2 ? k6 y, T0 f$ O# r
同时,还要书写好消息处理函数SomeWndProc。 ! g( v# ^' d1 V" u x! W4 D
二、在对话框模板中添加自定义控件窗口:
& a6 e# g) t( ?- m( e1 @2 Y在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
. t( L& {% F9 I2 U A r! E# m8 e2 ? |