原文:http://www.th7.cn/Article/bc/VC/200702/10177.html U" M' {; D( u O6 y5 W
7 h' t) }1 k1 y0 l" K一、概述:
1 d- F, j7 ~5 _8 K在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。, o, p( ^# d# x0 I
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。8 `' w" S# l B( j1 @6 q v- u
9 _# C( Q1 Y* `2 p$ g: S9 l我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
. J* Y. h6 ]# Z3 p) }但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。" b1 R8 k- v0 d k2 B$ r
. o2 R+ x) n8 D1 ]7 ^# U7 M
二、书写一个“真正的”窗口消息处理函数:
7 T+ ], g/ T% }4 i6 u* ^# p按照普通窗口的方式书写好消息处理函数。& ~/ U9 \+ e" {2 v& t+ p
(不要漏掉了DefWindowProc)
) v: z, M1 {: ]4 I5 g0 u# {
9 _$ T" M, o% i; T: J& F1 G7 q% i 三、注册窗口类
7 R3 D, e; u: f* A7 Q2 ~( _用书写的消息处理函数注册一个窗口类。, f' Q; N0 k/ D7 K; \* y0 J6 d
! s+ [2 y: H7 X. b! w' d/ f 四、建立对话框资源,指定窗口类为自定的窗口类。* L: D) C5 y; n( {9 O
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
% o& m" l- ] o) s, [6 Z(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")
; ^$ G& _/ t! W" L例:0 j% N& \+ t( o1 @5 J" Y3 q# A: }. B: y
建立文件Some.dlg% h: S: a. A. _4 h
书写:' l3 \; H( A7 W) o/ ~
HexCalc DIALOG -1, -1, 102, 122
, u( B; m- r6 W" V5 C! r0 C \1 ?7 s" T+ v& q
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX' O( D" n& V5 w8 L4 l- H$ D
# p- d9 m _- j" S; ?' V
CLASS "HexCalc" //填写上自己注册的类名称
9 O! g/ J* n% l2 X/ \# ~! `* N4 I l+ J0 e: u0 l! p
CAPTION "Hex Calculator"
4 S% k/ n- U8 A6 Q5 L2 t3 \8 Z6 g2 h
{
" J5 D2 a2 o8 X
$ I6 N* {# G: t4 H+ h* T PUSHBUTTON "D", 68, 8, 24, 14, 14
. a! q; z: k9 N3 B$ j) Z) x5 X" d. a# K: d7 @; K M
PUSHBUTTON "A", 65, 8, 40, 14, 14
& T. ^. s) x- n% Q0 U; [) O2 f/ E7 T5 C% s% C$ z3 p" K1 j1 U
//各种控件( h- m7 n8 L$ W
: r) I/ |; o g# }& j} 3 t9 W# X% r! K; O
% w2 x3 P: u; D& q# ^) D; D! K3 s2 T. T五、使用非模式对话框方式建立主窗口:
' E, Z- B$ Y6 {建立主窗口的时候,使用CreateDialog。
* Q. V9 {) o" J% k3 ?hwnd = CreateDialog (
! A4 V( Z, }. v hInstance,
* S2 H7 a8 f" v3 i& s' _8 m szAppName, //对话框模板# _$ n5 @4 o, K5 ?" @4 g" Z! U
0,3 y7 b' C' N1 A/ R4 B8 O; _, W/ k
NULL) ;
& U7 }+ R- G' s: i( M, f4 e2 h5 wShowWindow (hwnd, iCmdShow) ;
. m. |6 Q# o3 y* n% ]( X3 B" m
& F; a! E* ~: q [0 }% h 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
( b7 Z6 a8 I& O( D0 s$ `( s0 c* {# t Ⅱ.在对话框中建立自定义子窗口
1 b' C! s- l9 p1 B6 \% }可以自己定义控件,然后在对话框模板中使用
. I* M8 b, w- X1 v
4 o6 q/ s. {8 S! S 一、定义"窗口类"与消息处理函数:* v0 C: O- O" p
在WinMain中
# V u( X% p* c. J9 j& W9 y8 J除了注册主窗口类外,
8 m. B8 T! f% w) ^+ ?" I另外注册用于对话框的类,指明类对应的消息处理函数* i2 L' M _! I W2 x( r" i/ ~
wndclass.style = CS_HREDRAW | CS_VREDRAW ;7 J+ {4 w: C' B- m$ g8 _
wndclass.lpfnWndProc = SomeWndProc ; //对应的消息处理函数6 h- k- L, ~5 d2 m/ Y$ Z: T# b
wndclass.cbClsExtra = 0 ;
( a% {! j7 I% dwndclass.cbWndExtra = 0 ;
$ d5 \# T/ K6 ~, L/ H0 Bwndclass.hInstance = hInstance ;: b0 c" r1 L; z+ s: v4 k
wndclass.hIcon = NULL ;
4 ]1 g3 U/ J5 uwndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
) j1 @% _( V0 Z! }# e* N) f$ ]5 Jwndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
4 |: b+ q3 r7 } x+ e4 n3 wwndclass.lpszMenuName = NULL ;# o5 T' }7 w8 T, J, `4 s3 Y @
wndclass.lpszClassName = TEXT ("SomeControl") ;7 [% M. k, P* P, p4 Y) H
RegisterClass (&wndclass) ;: B# r( S1 m5 t- _
" I* a8 G$ W" K" ]/ Y5 o
同时,还要书写好消息处理函数SomeWndProc。 7 ~, t' P) z( z7 i; U
二、在对话框模板中添加自定义控件窗口:- O0 g& |; N. a
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。! Q* X8 m8 h! [% t1 n ?
|