原文:http://www.th7.cn/Article/bc/VC/200702/10177.html/ ~1 Y/ K: @: w
0 d# ]( V1 m- z- ^6 {' W
一、概述: c+ p' {% d- I- z* h
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。
$ @7 u# D% _2 N& z, ]使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。. e- ?. l# Q8 O# \ z, ^
9 ^3 n) f8 n) ^$ f4 c/ m
我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。! _2 R- l( f. K! K9 q2 n/ d
但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。8 x5 L+ k* U# F; {, _
3 [9 g* j2 }8 Y* k* f( ] 二、书写一个“真正的”窗口消息处理函数:
, t/ K" V9 Y) O按照普通窗口的方式书写好消息处理函数。5 M: P0 s( ~5 n! Q! M, j
(不要漏掉了DefWindowProc)
3 j0 c$ d: t# R: a/ O/ V+ L- Y" ?# M4 F9 h
三、注册窗口类
) D& h0 b4 Y7 l8 o1 f, x* |- u用书写的消息处理函数注册一个窗口类。* j& P% d5 G3 K* \; i" c
7 o: Y' `/ [" I# Z+ d8 s' w9 V, Q 四、建立对话框资源,指定窗口类为自定的窗口类。& |0 w6 L1 ]( J. b' P
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。! ?, L+ A: H; f1 j
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")0 C3 D: |2 B. ^' t) w5 f; r
例:
& S a. W; e& E" Z建立文件Some.dlg
; a! v, U; \% R G/ h书写:
3 G! Y7 c% A dHexCalc DIALOG -1, -1, 102, 1223 O- m* f" w+ h4 K+ M- B
+ D7 `; S& `( B* j4 a1 Q
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
) g* Y* S, \% T5 B
3 Z0 [4 P( o* R' g+ r/ XCLASS "HexCalc" //填写上自己注册的类名称
, o, ^, [4 g: F3 ]: G# k8 M* L3 w+ z2 \/ B
CAPTION "Hex Calculator"- e" \: J5 J! C( j
7 F# a7 o, g6 Y& b
{4 @$ P2 J8 L0 R& b
3 A( ?5 y" P3 N9 y1 G% D6 l
PUSHBUTTON "D", 68, 8, 24, 14, 14
7 \# ]. r4 T. E( G" M& x- ?! o; ~2 o! q- @3 `
PUSHBUTTON "A", 65, 8, 40, 14, 14
8 D! I. ^; Z1 g; O2 _. @+ ^* g* F
, L7 X3 l5 i+ h4 e2 j( @: Z# K //各种控件
/ j9 J9 ]% Q& F- L( R, ]; `
! b2 s9 o0 _% h7 [8 w" h) d}
U" A* n+ t6 ~$ P: {
" H, Z9 x! z6 [5 C五、使用非模式对话框方式建立主窗口:
& }9 ^ r" E0 _) v7 S' y! V* O7 B2 Z建立主窗口的时候,使用CreateDialog。1 y h' T! M: |1 _3 ] r* D* I
hwnd = CreateDialog (
* t, [7 N/ H- _* t; m hInstance," K) X& F6 P9 G
szAppName, //对话框模板4 W4 b+ c+ `2 \: D. ~- Z
0,
( f' q* X" O1 O3 J }& \ NULL) ;
n9 I$ ?4 L3 v% qShowWindow (hwnd, iCmdShow) ;9 m5 W% d/ C4 ^! B- @
& J) j2 a7 p: j/ j# v
其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。9 A5 A$ J* N; G* T2 M- y( k' K
Ⅱ.在对话框中建立自定义子窗口 + F! k" {. C9 p; |$ Q, P
可以自己定义控件,然后在对话框模板中使用. h& ]# q6 w3 p& _* I# S
# V- _2 k) \8 Z. u2 @, c/ ?
一、定义"窗口类"与消息处理函数:: c d) F3 E. I
在WinMain中
" a8 n# l" `, ^$ N+ l+ Z0 m除了注册主窗口类外,
( M0 z: ~% K2 n1 b' X; q6 \: e另外注册用于对话框的类,指明类对应的消息处理函数; ?( T7 R4 r, v8 ?" A
wndclass.style = CS_HREDRAW | CS_VREDRAW ;" B( K, G& T- s+ x, o0 Z$ g0 V2 U4 P
wndclass.lpfnWndProc = SomeWndProc ; //对应的消息处理函数
~; H5 ^, T. P* h# @wndclass.cbClsExtra = 0 ; J" r6 W. Z; e, S+ z% _* ?
wndclass.cbWndExtra = 0 ;" L' ^* p+ B2 y, h* C6 H
wndclass.hInstance = hInstance ;
; P4 u8 U: r& _- Q; iwndclass.hIcon = NULL ;
1 M' M% N2 `. ?$ \8 ywndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;. ] S+ S4 ~# l6 u% q
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
! f7 n+ P0 l1 l3 [/ `/ t' W5 pwndclass.lpszMenuName = NULL ;
N( k/ y. t6 b/ X R2 E. i4 Hwndclass.lpszClassName = TEXT ("SomeControl") ;
4 S1 b6 i$ O9 s& w& ERegisterClass (&wndclass) ;
+ M% a) t! v6 j3 }1 @% w. t; N; S% }! L, k3 p5 E, f
同时,还要书写好消息处理函数SomeWndProc。
9 w6 b- h0 a3 |, d a 二、在对话框模板中添加自定义控件窗口:
$ H/ o8 E! X$ e! }3 M1 a在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
- O3 l" F% Y; H% ^ |