原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
; O/ v3 j/ P# Z r' I9 U3 |! ^$ v- X0 ^3 @5 h& j
一、概述:
0 ~9 ~8 B1 b9 y8 Z9 w: @在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。- F2 \: \$ Y0 H9 _; [9 d/ m
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。
8 _% y( Q6 _ n0 B$ @# R) i. i$ _* ?: I! A- e8 d9 t& d" L
我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
. m* \* a. W+ N- N8 x但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。
* G5 b% M" A2 t v2 O
z2 V7 ?; H( F' e9 [# z5 U 二、书写一个“真正的”窗口消息处理函数:0 I' s6 U: [" e& x6 M
按照普通窗口的方式书写好消息处理函数。
. F o+ U* f7 y/ s* C(不要漏掉了DefWindowProc): ]3 H/ }5 [; \2 A
. Y& b* ?! Z- [4 Z: @& `. k
三、注册窗口类: @( W0 H) M' Z& o, @7 y) n1 Z4 u) M
用书写的消息处理函数注册一个窗口类。8 U. l) v, E9 k1 c2 D2 g
0 a2 O9 P# I \- t4 o: i2 D, N% f
四、建立对话框资源,指定窗口类为自定的窗口类。
! N. v; J. w5 C手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。+ S" [( p8 V" F ?
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")! ^2 U' a# E0 N; z: w
例: t3 G; w2 Z* C. m: e
建立文件Some.dlg& t- y* y9 w! c% J/ w& s5 D! c. C6 D
书写:0 e$ f6 X* _- k" A1 a, F; `
HexCalc DIALOG -1, -1, 102, 122
7 K. a5 b/ Q3 I/ \1 a6 G& y/ J8 W( w0 ~8 `
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
) R$ @1 f$ |, J. \7 n% l
# n4 j+ D! p& k N( |$ C+ mCLASS "HexCalc" //填写上自己注册的类名称' T/ W( ?! y9 t; `2 A. t2 r7 j
$ T4 i$ h) n* R$ y$ w0 O( fCAPTION "Hex Calculator"+ Y$ l2 R$ l; i3 P
' |( Z4 Z0 ?# E{9 C- @# N$ W7 e* }1 q1 N
$ f8 T6 k8 E* J" I r% B8 g, Q PUSHBUTTON "D", 68, 8, 24, 14, 14, {4 |* G8 M) U" C/ h0 y$ j5 D
9 \- l5 `6 X q" y8 Y6 @% e9 J2 Q
PUSHBUTTON "A", 65, 8, 40, 14, 14
' m$ Z4 a* g7 X; x" I/ `
% M y( Q" s; p% \# o0 X b+ \ //各种控件
0 q4 a9 `/ g4 p+ v" T
3 p: r+ r; ^( {! o}
+ L2 ?. }( t% V( i) g/ V* U+ |4 a+ g6 ?2 x4 l) Z$ S6 E
五、使用非模式对话框方式建立主窗口:
/ ^: E, W* K$ ^: S建立主窗口的时候,使用CreateDialog。
# O) C! v0 G4 S/ l" m( J" e- X* f8 chwnd = CreateDialog (
6 \% c% _. b6 `- u& k hInstance,$ a% |" ?' f3 c
szAppName, //对话框模板) Q7 w; c0 ?2 Q7 `* V
0, `$ e& b) ]# v* Q j9 f
NULL) ;! X0 V) s8 G+ o
ShowWindow (hwnd, iCmdShow) ;1 f4 p; H# c9 F* w+ U
! Z, f4 x% z T
其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
" m$ F/ [8 J$ p1 E5 G Ⅱ.在对话框中建立自定义子窗口 4 U& |( z* t! P: n
可以自己定义控件,然后在对话框模板中使用7 G' G% N! S! e: r( Y
, o& ^$ b. w. G' Y 一、定义"窗口类"与消息处理函数:! U; U9 } C7 @+ q
在WinMain中* P3 g1 p( I5 H6 T6 [4 @$ g9 Y3 E
除了注册主窗口类外,
8 Z: ]% m9 Y. L另外注册用于对话框的类,指明类对应的消息处理函数/ f6 X! ]& S2 M
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
' f y' A. D: Y' D5 G: l1 n. _wndclass.lpfnWndProc = SomeWndProc ; //对应的消息处理函数/ a: I3 n. w% [2 R% H" _8 }7 \
wndclass.cbClsExtra = 0 ;
( c2 l$ @0 @ Z2 twndclass.cbWndExtra = 0 ;
9 f- p, B( T% G3 J9 Gwndclass.hInstance = hInstance ;
; ^- @: o6 ?; r* E/ e" D ^wndclass.hIcon = NULL ;! y+ n5 Z6 p% f% ^5 _. x% O
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
+ Q: j3 _; Z; g# v6 Gwndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;7 J' G! M) y& h- S
wndclass.lpszMenuName = NULL ;
. ~1 x0 z9 G; q) K3 awndclass.lpszClassName = TEXT ("SomeControl") ;
+ V4 N" d- K/ f7 G' Z, _RegisterClass (&wndclass) ;" I' A% ^" I' ^
" ]" x/ ]% N; _$ J# z' Q6 F& W
同时,还要书写好消息处理函数SomeWndProc。 , Q& L) t4 h+ v) ^8 q
二、在对话框模板中添加自定义控件窗口:# P; w4 L$ J- ]
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。4 ^/ I* |1 L/ X) L
|