原文:http://www.th7.cn/Article/bc/VC/200702/10177.html# J) I7 ], n: n" A% n% ~* K1 e
' ?9 z+ [1 C+ e* O* C
一、概述:: d7 m: W& ? K8 e" T$ g
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。. Y; O C+ G9 n/ i9 Y: C4 F3 g
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。
0 H9 K# f; r! C f$ b' e0 f
! M2 J: T5 c7 M6 V9 c我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
; c9 ^1 x8 j' C$ j但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。
}( B& Y$ T$ d- C( c: Q- q8 l8 y a8 D* H2 g8 `3 F6 j
二、书写一个“真正的”窗口消息处理函数:* |, U4 {/ R. C% i7 |" X
按照普通窗口的方式书写好消息处理函数。0 l* e+ Q: A) Z
(不要漏掉了DefWindowProc)1 J7 q' X4 @; G8 M' d
8 n0 r3 R. g6 S 三、注册窗口类 P6 \4 G' O* O- u' N
用书写的消息处理函数注册一个窗口类。
+ g: t9 @1 `) I# o% E. Q' |6 J+ c9 o( b
四、建立对话框资源,指定窗口类为自定的窗口类。 B9 G% @$ y% l+ y4 v
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
* x, t1 [0 n/ j. g0 d# O: v/ R5 z(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")- z8 Q# b: }4 g# s4 u3 P: I8 N" K
例:9 B; `! D) C: [. E& M7 K
建立文件Some.dlg
5 s" ~& f8 F1 P/ @3 R5 l# c书写:! {5 ?+ V4 M/ Y( O" \
HexCalc DIALOG -1, -1, 102, 122
/ d! F; [. q8 ~4 ~* s0 L) L
# o. O1 J2 i2 l; Z( RSTYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
' q! L$ A2 \8 }1 s8 Y( ^# o9 c0 b" X. F: F0 o7 e s- |
CLASS "HexCalc" //填写上自己注册的类名称1 Z% w3 x% K: \& _
3 X% V% w, B2 R: ^. o+ X9 S7 h
CAPTION "Hex Calculator"+ D% U, w2 Y8 J: c0 n
0 f) m$ l8 Q* S' M- M/ x{/ Y- r' w' ^/ k& q
6 v0 G& I" M ?# I
PUSHBUTTON "D", 68, 8, 24, 14, 14
0 r: p& ]! v4 `6 C4 g6 p+ @# L) j. ~/ X9 v
PUSHBUTTON "A", 65, 8, 40, 14, 141 u% h9 A, y8 D5 U% _ s) H
/ p& K. j+ l) k+ M N3 \9 `; a
//各种控件( J1 y4 K( x: Z- O
$ S1 v+ k. v, [* l: t' _
} 1 \1 b, n1 r+ [" f! w
1 j! S4 G4 ~, l5 V五、使用非模式对话框方式建立主窗口:
! _# T$ ?6 B9 }/ k1 U/ ~; l建立主窗口的时候,使用CreateDialog。
/ A; K+ h- E0 O* e! G8 ohwnd = CreateDialog (
$ v2 u; K2 }- I+ M& i: l& g- w5 q. W hInstance,
, @* y% Y0 M- z+ ~7 E1 d& u szAppName, //对话框模板
9 q# a. O5 a3 M) z, W6 Q: W 0,# v% G' [( ]3 M9 Z
NULL) ;
6 s$ p1 y& I/ Q1 dShowWindow (hwnd, iCmdShow) ;
3 ^9 ]; C2 {9 y0 j6 p" [% A0 W1 Y) C$ Q0 f$ _+ }2 j* c" T
其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
( q: S+ b1 T/ R6 i& B2 r Ⅱ.在对话框中建立自定义子窗口 / o. X1 u: X/ n) T7 m
可以自己定义控件,然后在对话框模板中使用' z/ j: ~- j! I- w4 w2 V1 E# R9 |- n
1 B, D4 ^/ |3 I# `9 T; {
一、定义"窗口类"与消息处理函数:
! a& N/ ~0 X# ?# l) m. r, M1 ]在WinMain中0 `/ m' w0 ^; {; M; y
除了注册主窗口类外,
- L+ h4 w% s: @! k. ]& `; Q另外注册用于对话框的类,指明类对应的消息处理函数
3 `. ?: \4 q5 D& Y, c. T* g, Owndclass.style = CS_HREDRAW | CS_VREDRAW ;
- _& K" Q1 D" J- y2 Y$ d" Awndclass.lpfnWndProc = SomeWndProc ; //对应的消息处理函数6 O: {7 x% i6 q$ S, F9 _+ U7 \
wndclass.cbClsExtra = 0 ;2 g/ Q2 _0 T0 z3 w: {- n
wndclass.cbWndExtra = 0 ;0 e- ~: ~/ O$ }$ l2 j/ \
wndclass.hInstance = hInstance ;
. {3 u3 ~7 c1 Kwndclass.hIcon = NULL ;
; q0 n5 R& j7 A8 pwndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
2 @' z+ W+ n: x! h4 ^5 I" nwndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
( _5 \$ C' F7 M8 D7 x( [! dwndclass.lpszMenuName = NULL ;# X1 J0 L0 A3 z# h- o; S
wndclass.lpszClassName = TEXT ("SomeControl") ;: V: w1 A6 [' U" ]; H5 w( q! i5 v
RegisterClass (&wndclass) ;
" A3 o, B5 [4 w: P: U" e, P2 ?
: \+ ^8 o9 j4 w( S6 X) j 同时,还要书写好消息处理函数SomeWndProc。 3 I. w$ M6 O4 B0 ~' n& t3 M
二、在对话框模板中添加自定义控件窗口:
! U C0 @6 c- c, D" F, l- C在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
/ Y# z6 b" d8 A' e8 V |