原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
' x- c% l" y7 y% S9 ~7 Q3 f: i4 F# f+ i, o0 Y$ H
一、概述:
" B; X- t/ K0 ^/ u6 b6 t2 i7 X1 j, d在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。
8 c( k/ q" r. K使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。
0 g) U# x6 D- }- t& S* ^5 p0 f
5 }, @) c/ Y& }: a我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
% z# Z9 Y# T! W但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。3 d' I0 f# L, D! \$ T
5 r) j0 p! e. v$ c9 Z
二、书写一个“真正的”窗口消息处理函数:$ l. p) C2 h' M) H! e* C0 q( _) D
按照普通窗口的方式书写好消息处理函数。5 T6 B! [) o6 G) g8 f- f
(不要漏掉了DefWindowProc)
* |" P ^" g: j% s; ]2 R" ]9 D
' a7 [% N# D' ]- ^' h* X2 ?+ _ 三、注册窗口类2 _" d0 C! Z3 q0 K3 ^
用书写的消息处理函数注册一个窗口类。, J/ P3 o* L' X
% p/ @5 T4 Y! h7 Q3 b# M0 M/ t 四、建立对话框资源,指定窗口类为自定的窗口类。4 b; n' G: d: l0 n
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。2 j' \) A! l' o
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ") j; y3 J' F4 J! C5 @8 s8 \4 l; x; v
例:$ d% e! i k- f& @( t
建立文件Some.dlg
7 N2 S! p: |& n/ F/ P: {书写:3 A) Q$ z0 b/ l4 u ?
HexCalc DIALOG -1, -1, 102, 1224 p% g% ]& T3 B
' s) Q0 }$ Y5 u. Y* n% @
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
+ R/ ~( I) S. _1 U' r/ f0 N! Z; [7 t& \; Q! Z
CLASS "HexCalc" //填写上自己注册的类名称
1 H9 F4 D( W; S( G' R* R+ I
: ^- o, m2 q- nCAPTION "Hex Calculator"2 Z" T) n3 T* W. z7 @
L- z8 b% Q* E; q8 r
{" B8 u* A# p/ U
1 L8 t! c0 r9 p8 r: d
PUSHBUTTON "D", 68, 8, 24, 14, 141 y! H& r! U3 n5 v8 g- ^% `
2 Y( w- ?# P# I( y4 m) |" l9 [ PUSHBUTTON "A", 65, 8, 40, 14, 14
- K8 t$ \- w: T1 |* K
; D% n5 {2 n3 C& V$ t( w& y5 g //各种控件% ^/ d" {! [. f
; v2 O3 l/ a8 t9 m6 }5 A" R1 _7 G
} ) e! d2 f3 S* e# M
! a3 G( e7 n% U8 n8 G7 P五、使用非模式对话框方式建立主窗口:8 t3 Q" o7 M {6 l! Y0 f
建立主窗口的时候,使用CreateDialog。
( z; @$ P' ~8 phwnd = CreateDialog (8 \+ g8 R! ^+ {9 B& |' Q$ M8 q
hInstance,$ m: Y; v! ~* u
szAppName, //对话框模板. K! y N/ v8 x* D0 i; b: ?' Z% l
0,
% `+ O% i3 R6 A5 { NULL) ;, y2 e; w4 m$ u" i7 _
ShowWindow (hwnd, iCmdShow) ;
0 K/ S+ h1 K7 h' I
3 s* b% J7 O, [/ w% r1 N Z 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
. n+ N% Z) {3 k: K Ⅱ.在对话框中建立自定义子窗口 ! X7 Z. t/ \; P3 M
可以自己定义控件,然后在对话框模板中使用/ g7 W7 T" [/ n+ c. Z$ ?1 l
' Y: _; ^: S0 n 一、定义"窗口类"与消息处理函数:$ z- p% i$ ]2 H8 x- Z2 e- ~
在WinMain中7 `2 l& b2 x# ]
除了注册主窗口类外,
[ K6 }" C7 O# j3 G1 U; I另外注册用于对话框的类,指明类对应的消息处理函数- ? _. L+ x4 m4 g2 H
wndclass.style = CS_HREDRAW | CS_VREDRAW ;' [; E- V! F! p: @& _/ H
wndclass.lpfnWndProc = SomeWndProc ; //对应的消息处理函数7 s. f) G& l1 K/ I
wndclass.cbClsExtra = 0 ;, T. `' H& N) n E ~3 V+ ]: o
wndclass.cbWndExtra = 0 ;
9 k: T& ~% E; @5 w% ?# f$ b( G& Kwndclass.hInstance = hInstance ;
" ?9 ]. c& g% f) o( y% `3 v' ^wndclass.hIcon = NULL ;
9 n) U8 n/ A: `: F1 ?7 N6 [" Iwndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
( s- d% e! z0 @: E" jwndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;! k* A$ G+ f$ M, N
wndclass.lpszMenuName = NULL ;& s& v: O( |- R- y
wndclass.lpszClassName = TEXT ("SomeControl") ;, D5 A! ^, z( n" }
RegisterClass (&wndclass) ;
7 u H0 k7 v. m
8 I5 N9 K" _8 ^/ V 同时,还要书写好消息处理函数SomeWndProc。 / _( i* q- Z" o
二、在对话框模板中添加自定义控件窗口:
/ k; C, ?& K- u" q在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。- Y$ N$ c6 y# `7 V" S
|