原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
& \7 s$ ^. N. e3 g: j4 ]9 d' n( ^7 X
一、概述:
, q7 U& y \% q/ w4 N在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。8 D# i d# L$ ]6 W% t/ ^) J
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。8 ?# }8 I! W7 e8 d4 n
" t0 g: \% b! b& t: _我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
U$ U! G# a3 p但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。. i) B, K4 K. w) x
! |! m, k* D0 `1 x# v7 ]! H 二、书写一个“真正的”窗口消息处理函数:
' t$ A# F& J7 z. y6 ]按照普通窗口的方式书写好消息处理函数。% n& H" I, w; J' J. y
(不要漏掉了DefWindowProc)8 ]3 a. P8 \- e% \+ s1 U$ b
# t( ?9 y/ [9 f. K! q& {. K 三、注册窗口类1 P- y6 d( R0 h* ^* e
用书写的消息处理函数注册一个窗口类。
, Z. e2 q7 B0 Q, o2 v, F
2 ~0 L% Y' f% L1 `2 q# B 四、建立对话框资源,指定窗口类为自定的窗口类。
8 I/ S' E. x9 d6 r) m: T+ J/ Y手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。8 J, m- @2 D( F7 | i4 [8 N& n
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")
! `$ N( P* }: L例:4 ^9 u) N5 F8 p8 B. k% n7 Q
建立文件Some.dlg( Q9 F- [+ v3 U3 v
书写:
L8 l4 I9 A8 `. I3 x6 ^HexCalc DIALOG -1, -1, 102, 122) o# l$ u' X6 K3 v
0 B: S) ?5 i5 ], GSTYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
7 p7 L) F0 T- b- F( v4 n4 x+ n& t3 ~& e6 n/ W- r9 i& c a+ g6 ]3 c6 U+ [
CLASS "HexCalc" //填写上自己注册的类名称
+ o* J/ F* f5 B9 G" N; ~
8 j* J" y2 a4 ?' {' I* o/ ACAPTION "Hex Calculator"
" v4 p& `; w; e' c7 C
. P- ^5 _7 A* a7 T{ B: i T5 z$ ^- @/ n) _
" t/ ^% a5 Z$ Q
PUSHBUTTON "D", 68, 8, 24, 14, 14+ I. A, m# P' A1 b. G0 X" ~
$ Y, N" [: g$ B
PUSHBUTTON "A", 65, 8, 40, 14, 14
( T( g6 c! @2 F; n2 E0 T. b* P. V' [0 B8 z2 A; G# g: r
//各种控件# B( L( K) }1 i" S2 X
: Q$ u: a) D" q
} 8 l5 k7 N+ s7 d6 t* {3 _* H
* y% k/ U0 O. N5 H( }4 {( }, l五、使用非模式对话框方式建立主窗口:8 ~2 E" c: G }- B' x; ^3 c
建立主窗口的时候,使用CreateDialog。
3 s; d7 f. o' j# Bhwnd = CreateDialog (
4 ^9 x3 k+ V5 S0 D2 a hInstance,
! s& `( _9 z0 N+ B szAppName, //对话框模板4 @, t9 P; ]* e5 g' A
0,/ P5 \9 h8 f) f, Z/ T
NULL) ;
( U0 _8 { b- _/ k3 d! O/ zShowWindow (hwnd, iCmdShow) ;
1 f+ c; x, ^: ]0 X
; A: ~# {4 k! S 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。9 H6 O h4 }5 B3 J) i) n2 k
Ⅱ.在对话框中建立自定义子窗口
/ s- `; C9 I' c' z" w, b- ?" u/ |可以自己定义控件,然后在对话框模板中使用+ g! V: W. m, B% l
. U( @6 n, w; P) Y7 ?9 s% o% e
一、定义"窗口类"与消息处理函数:- i$ H N9 n! N+ Q- U4 P. {
在WinMain中
' F/ [! o: [$ q1 G除了注册主窗口类外,
0 W9 {4 V, I" q) J: z/ {另外注册用于对话框的类,指明类对应的消息处理函数; r ?3 g" H" D' `1 `5 j! \
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
5 ~( `9 I5 w3 a& v5 e* {wndclass.lpfnWndProc = SomeWndProc ; //对应的消息处理函数
- N5 b- D9 M4 T1 h9 v7 i- ywndclass.cbClsExtra = 0 ;# j* I0 O$ k! y5 }' f1 s
wndclass.cbWndExtra = 0 ;
1 q9 l6 D! h; \* m0 A. B$ I& @wndclass.hInstance = hInstance ;0 Y$ h% O: Z$ m3 W# V
wndclass.hIcon = NULL ;
: h# n8 o# P% Z2 Cwndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;) ]( M( I0 P* L6 a) J& `
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;; S0 j$ v+ c- \; c, e6 V
wndclass.lpszMenuName = NULL ; w" v3 h* e1 w; n% k
wndclass.lpszClassName = TEXT ("SomeControl") ;
2 x# U. D; d2 @* W1 q) }( \RegisterClass (&wndclass) ;
. ]: u5 R' ]/ t* w
8 y9 O5 i+ X( A0 H' q. n5 c6 {* g 同时,还要书写好消息处理函数SomeWndProc。
6 o/ ?9 S$ H( D/ V/ [7 X' ^ 二、在对话框模板中添加自定义控件窗口:
. a' k$ `5 Y4 I3 z) c% u在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。+ a' W3 @3 q( {0 B* p! B4 [ F
|