原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
# K( P+ ?7 f5 v! k1 Z& k6 J+ z2 ~+ r3 A7 }; J5 c
一、概述:. I+ [ z, w( q9 ?& R) ^
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。
$ F5 r# h5 Z: u4 T# c+ O3 Y使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。
5 S: l6 x& e, f2 O# l }$ l9 [6 u& P
我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
$ N1 k; L8 X5 b/ Z) q) g: I但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。8 O, z6 f+ U0 V% I* [4 F
, R2 i; p) c( M8 p% H: A4 r7 Q; r
二、书写一个“真正的”窗口消息处理函数:" K# D4 W! @9 }' L
按照普通窗口的方式书写好消息处理函数。; v( @ s" i2 h8 ^6 c1 |* S* E& _0 _
(不要漏掉了DefWindowProc)
3 m3 j9 w5 ?8 z# W
( S& q% y: B% I J T 三、注册窗口类
. n+ L8 Q. t! I+ J: D0 s$ m# x用书写的消息处理函数注册一个窗口类。/ p5 S! c$ ~( z+ c7 W- X5 b0 Y: N
3 ]0 O1 G A; {! [/ p2 Z: y8 B 四、建立对话框资源,指定窗口类为自定的窗口类。
& v* L8 I* {, r$ l: Z手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
3 l/ S) ?0 ^# `# v5 H8 Y$ V! ^7 }(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")
h1 d7 z0 X) Z$ B( @/ N例:. H9 z! u" q! R' J& H3 o' o. @
建立文件Some.dlg& t9 Y. Z& L s+ s6 L- `0 |# L
书写:
; Q& L# ]' b- V! L0 o( b; Q4 OHexCalc DIALOG -1, -1, 102, 122$ V3 V! o1 F8 k. c
2 L; r. t( Y) z" r
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX1 I N8 l0 V r( s. i
6 R# [) d4 p1 T& K" n
CLASS "HexCalc" //填写上自己注册的类名称
* T% M) [5 i& X+ D3 q, I* @$ H" H7 h1 y% p+ v) K# Q! w2 ~
CAPTION "Hex Calculator"
9 h- w% m9 _! W8 C& N+ l, z; h& H3 Q W# V8 @( j$ x; ?- l9 [
{
" t% I5 X4 x" z+ i' x: z) i; Q6 y8 p8 }$ s' M* q) s0 g1 R
PUSHBUTTON "D", 68, 8, 24, 14, 14/ J+ Z/ m- Q# a. u; R3 U' Q
! }' F1 v! p" q+ ?" Z4 _+ S PUSHBUTTON "A", 65, 8, 40, 14, 14' z" R6 j+ x7 ~) n% y! Q1 I
$ b! x' [+ r7 N# N8 a
//各种控件
6 h% \8 Z; x2 h! b4 s
( r+ z; s+ Q, s' ]% E}
- J. ?( M3 Z* c9 |) c/ \1 k/ T0 `! W- W8 R% v+ l5 i# c
五、使用非模式对话框方式建立主窗口:& Y4 J& @0 X" b
建立主窗口的时候,使用CreateDialog。9 T9 I; R! C2 b: O& @1 u# l. q
hwnd = CreateDialog (
' ?9 S' T" Q8 k; O. e hInstance, h3 B. Z" r; K0 E8 t( u$ Q
szAppName, //对话框模板
8 {2 Q6 u4 Z0 I! K, o: R 0,
) E6 @& ~/ \. x C+ W% X C NULL) ;
& T, H: D5 K4 G, q# }9 w- N& G3 O4 nShowWindow (hwnd, iCmdShow) ;
) U$ B, t2 o- k& J @7 ?4 G, E1 u( {8 }0 J% t$ {
其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
& g" N# k6 y0 a- ~. v) b* f Ⅱ.在对话框中建立自定义子窗口
5 e3 Y* @0 p8 V7 [4 H7 ^可以自己定义控件,然后在对话框模板中使用: t8 l3 m" d1 D1 q( v
) N# w: Z! n2 Y5 ?' E$ V. W
一、定义"窗口类"与消息处理函数:. S4 ]7 t7 z# }0 a/ F
在WinMain中
1 B; _' `! Y$ r m( ?除了注册主窗口类外,
8 M9 L8 v' g1 J' J% S6 S另外注册用于对话框的类,指明类对应的消息处理函数" I# w- l1 Z% u
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
' A4 V8 @0 g: Z# z2 g) H/ }" Fwndclass.lpfnWndProc = SomeWndProc ; //对应的消息处理函数4 ]2 G- A, k, O+ R1 J: v
wndclass.cbClsExtra = 0 ;
: P- Y+ n) P( ^5 Wwndclass.cbWndExtra = 0 ;, {8 R; n# E0 L7 F7 j: L
wndclass.hInstance = hInstance ;8 v" S5 t. I& o" o3 e( P" M4 n% I5 C
wndclass.hIcon = NULL ;
6 ^1 r1 N9 k, pwndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
6 x5 b& u+ L Z6 I/ J. e4 Mwndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;0 ^- g& t' d# n
wndclass.lpszMenuName = NULL ;
" j8 n5 i3 X# w" H" x d% U9 `, w3 u+ x0 a' owndclass.lpszClassName = TEXT ("SomeControl") ;
8 Q9 U' w! R) n+ K. hRegisterClass (&wndclass) ;
( d* Q% Q4 D; o5 ?: O7 w A8 I# K( ?
同时,还要书写好消息处理函数SomeWndProc。 0 I& Q9 x4 m9 m& m0 U: e! J
二、在对话框模板中添加自定义控件窗口:
! X! ~/ Y2 U i, S# \4 A在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。0 g3 U+ G( O, g( |8 s$ {. l$ {8 c+ t
|