原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
3 W. e; g/ ^. q9 ^8 ^* X) `5 _) a3 G
' L% \4 Y- {6 ]一、概述:
0 Y( N4 G/ j' [. r, Y在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。
; d1 j) `/ B! S( B使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。
8 _$ v; P, f( Q$ ^
1 s5 n9 l6 m- T$ }" w6 r8 h+ H我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。+ Y* V( M" o# ?
但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。: l* J: w* {: L y
$ M: n% [; U6 Y9 G* K4 W 二、书写一个“真正的”窗口消息处理函数:/ O; U2 Z& W) r7 ~% ~
按照普通窗口的方式书写好消息处理函数。4 m: \' ~7 L. [1 ]
(不要漏掉了DefWindowProc)
- D1 G3 p" | F$ X/ L) y9 d
' t1 R3 p8 o- v9 V. e 三、注册窗口类
6 S+ {2 {2 ~ h' g# h) d用书写的消息处理函数注册一个窗口类。
N; c" V& |& G) `' T( k5 ^6 b4 B( j8 [ o$ D0 E
四、建立对话框资源,指定窗口类为自定的窗口类。' [$ _9 }+ o! U& F4 ^1 S/ X
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。5 z% v) _# A& u3 V6 D2 z
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")
4 {2 W. v/ x: i3 p$ u6 L8 j例:
. l0 ~$ d# \1 o. W* D& v' L7 R7 B建立文件Some.dlg% v9 @3 ~& W/ M. j7 i" l5 L
书写:
& z: j: l) T4 B0 g; k6 w# NHexCalc DIALOG -1, -1, 102, 122
3 D% g& c6 ?5 \0 D! q0 [3 B
" Q: c. J$ ?, M# ]& u+ P g) HSTYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
$ ]1 `+ T- T [# m% b) d$ O, O% M T9 o! l! L
CLASS "HexCalc" //填写上自己注册的类名称
h; t9 G$ [$ j9 c k/ o: v$ R; X9 i. b! [5 I
CAPTION "Hex Calculator"
' j% {) S, y& S5 A
5 U& S& b9 q0 @( k{
9 g' l& p4 }$ v( @$ r9 d& |8 B8 K/ E! r. {/ N9 Q
PUSHBUTTON "D", 68, 8, 24, 14, 14
9 L7 k$ ^% w5 h& P# l
" U- \; l4 K2 V PUSHBUTTON "A", 65, 8, 40, 14, 145 l7 X/ L7 o- V' V$ n) L# ]
) ]" k& B b9 B; m+ [$ x g [
//各种控件
0 c x. P7 s& c& k0 x
- |4 G6 n1 d8 d+ M5 R' ?/ v1 R, F}
* V; L# @& b% K+ M" @! i
, P* Q; E3 `( ?/ Z% v五、使用非模式对话框方式建立主窗口:+ U+ U1 o% d9 f% e: g0 Q
建立主窗口的时候,使用CreateDialog。
- e( t/ S3 @9 t# vhwnd = CreateDialog (' N. u' i$ e& V% V+ ^: J* z! Z
hInstance,% G( k/ U+ U: U7 r: E4 A
szAppName, //对话框模板$ L. i* @2 U- ?7 S: k g
0,
. `2 @) k" S" f- h; q4 S! b NULL) ;
+ a- l4 ~% t+ j* ^ nShowWindow (hwnd, iCmdShow) ;
. y- Y- P( c4 }6 u) r2 C2 _; I! A: y% b; f; X5 @
其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。, \. k: C1 R) U+ G; _4 [! M9 V9 G
Ⅱ.在对话框中建立自定义子窗口
6 o9 z; f* }9 n- k6 T: j可以自己定义控件,然后在对话框模板中使用( P3 W$ X. g1 P. D
" k" M! H( o" q \! }" r6 m( A
一、定义"窗口类"与消息处理函数:
/ ~& N" p5 h( f& a在WinMain中4 _- x+ S+ D- g- c1 @
除了注册主窗口类外,) I: A$ |8 R( `9 }) W) y' H' }
另外注册用于对话框的类,指明类对应的消息处理函数
5 k. B+ `! }% m/ Uwndclass.style = CS_HREDRAW | CS_VREDRAW ;; L. i* B' [7 a
wndclass.lpfnWndProc = SomeWndProc ; //对应的消息处理函数
k P* w9 \- |8 Gwndclass.cbClsExtra = 0 ;/ a! G# L9 v- D
wndclass.cbWndExtra = 0 ;
" q1 u, [0 K6 }4 ]# lwndclass.hInstance = hInstance ;$ I* H9 w2 K9 B* D& B! ^
wndclass.hIcon = NULL ;( T* W7 D; [" ?5 R
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
! l! f/ F5 q. L/ f2 m2 Y- F9 `7 q2 [wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;: @1 f- u8 }: o, n
wndclass.lpszMenuName = NULL ;4 y5 U8 X6 s4 Y. K
wndclass.lpszClassName = TEXT ("SomeControl") ;( D4 R3 h3 U- E# b" b
RegisterClass (&wndclass) ;
4 G) I' J4 [( {0 M1 ?4 |$ P" C" t1 l) Q) K) ?, ?
同时,还要书写好消息处理函数SomeWndProc。 / M7 E8 o( X8 k
二、在对话框模板中添加自定义控件窗口:8 ] Y/ C& z7 N) [0 K+ c' v- S
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。! Y7 h8 l" f* q# s$ n
|