原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
+ O+ c w4 y/ t g. f9 _3 e& a: r3 c3 Q% I; D
一、概述:
' m; m& C1 B# o& Q在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。
+ u1 @5 N+ b Z* E+ m: r+ {使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。$ x; c( Q, u) b6 k
; i, M/ L& l0 [
我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。% i8 o' B& c- \8 ]' ^( s7 R. h& h0 G
但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。
$ h4 q9 _) @1 ~1 | R9 F3 G0 W# K G% W
二、书写一个“真正的”窗口消息处理函数:
( Y5 H' g, P2 R6 t按照普通窗口的方式书写好消息处理函数。8 X: F( H+ x! G) p
(不要漏掉了DefWindowProc)9 {" N2 Q0 \% C+ C1 U% |
9 k7 b, V- g( [0 P$ f 三、注册窗口类' X q4 [3 d3 I) u6 M/ G; w
用书写的消息处理函数注册一个窗口类。
- N0 Z& V% F# g. [2 x, y9 a0 v
' ^+ {3 B8 T: v' S9 `1 f# a 四、建立对话框资源,指定窗口类为自定的窗口类。& {' q S4 ^8 \2 q5 z- d
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。9 V: X/ j: @8 I s
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")8 b6 r$ m8 c- Q- H4 H9 T4 b0 C
例:- h5 X) M1 N L/ }* A6 p
建立文件Some.dlg
5 e) l e) Z$ o( Q' y' M9 ~% Q书写:1 d. ^9 p: P' D( e
HexCalc DIALOG -1, -1, 102, 122
8 k4 R E' A, N7 W8 Q: v2 z! r6 L& K" m4 n G9 Y
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
! x! E0 [% B4 B% g" q" g% q
- G* t. I& e; U. i. i6 s- WCLASS "HexCalc" //填写上自己注册的类名称
$ F! B( `0 X0 r
: ?) N: ^& @7 E, W8 G+ rCAPTION "Hex Calculator"
7 z9 W4 p3 ~' v, C* v8 k, P) K& w$ m! Q) C3 O+ v6 n# |4 d
{( T0 a# S: `/ z# C; Z
3 V ^7 q8 B* i9 o |7 E+ E. v& y PUSHBUTTON "D", 68, 8, 24, 14, 14* t U* u" S( {
- a3 X: k, r$ k* u6 M' J: b PUSHBUTTON "A", 65, 8, 40, 14, 14: I# {( a% N/ K
" b7 }# J$ o1 W1 @7 R
//各种控件* ^. ^/ U3 B# m: N# u9 F* J& H
( |: B2 M/ @6 Z# L D3 H: f3 _$ h
} W; e1 u' a9 I+ w6 C/ k O
, b8 D" Y9 k7 G: [" k4 p" c8 N五、使用非模式对话框方式建立主窗口:( s0 J' D% D: u" B0 B9 }
建立主窗口的时候,使用CreateDialog。
, {; y2 @+ N2 Dhwnd = CreateDialog (
0 J# C9 ?; _, a$ u# v/ Y5 T1 v hInstance,
; o2 U! G9 U% Z5 t/ T7 M* q szAppName, //对话框模板3 x6 }/ d( H' C7 p( |2 A* j
0,
* b) W- U- A4 E7 J w- Q/ K+ [ NULL) ;+ D6 G$ L# q* |# @2 J) U' L
ShowWindow (hwnd, iCmdShow) ;) i3 T* U. f+ Z( i- Z+ J
- k- R5 s2 ^3 E. U2 V7 W4 N7 i 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。6 i0 i4 ^, S4 W* T
Ⅱ.在对话框中建立自定义子窗口 6 {8 ?$ _/ o; |2 y0 W2 k; b5 p
可以自己定义控件,然后在对话框模板中使用
# g* D, _$ {3 b
: {6 ~2 I2 D0 O 一、定义"窗口类"与消息处理函数:& i: w8 Q8 H- \% Y
在WinMain中5 I4 _3 B# E+ v
除了注册主窗口类外,2 o e, z2 i# C4 I! I6 v5 R
另外注册用于对话框的类,指明类对应的消息处理函数
6 `+ O# T0 Q; g6 [wndclass.style = CS_HREDRAW | CS_VREDRAW ;
8 a4 T* |/ z3 U: Y, B. D9 u! U1 Wwndclass.lpfnWndProc = SomeWndProc ; //对应的消息处理函数! T, B' F2 \! c4 |3 b$ x
wndclass.cbClsExtra = 0 ;
$ Q8 I/ z5 g& g7 D, A+ v; y( bwndclass.cbWndExtra = 0 ;5 G# \ Q5 ~) r# {' ^
wndclass.hInstance = hInstance ;
I2 W5 U9 G/ E# n5 t0 z: Y zwndclass.hIcon = NULL ;
* k* \& t( g/ C5 i8 ]wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
1 j# {" O# P7 x1 m* A! Bwndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;+ B8 \: o* [4 p0 G8 @
wndclass.lpszMenuName = NULL ;- J: A, J3 t- { A
wndclass.lpszClassName = TEXT ("SomeControl") ;
# b& E9 n$ j: {( z |2 _# o' bRegisterClass (&wndclass) ;. Z S+ o, A. D8 C
" `; X; f( }" H" X. D/ g3 M6 a& T 同时,还要书写好消息处理函数SomeWndProc。 0 d* }$ t8 u9 v8 f- O
二、在对话框模板中添加自定义控件窗口:
1 C- ] S. T: @- |在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。) {9 R+ u1 X+ P* f+ c+ z! K' m
|