原文:http://www.th7.cn/Article/bc/VC/200702/10177.html- ?: n; R7 t7 b8 }- M) I
% H1 m) L a# t) J一、概述:
; f7 v( M6 j- N, h' L" {" y6 X在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。: g$ Q2 U* |4 K8 U) Q" g4 F) W# z
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。# T0 |6 p, z& c+ n1 b4 o4 b8 ~
2 R7 F. q/ `8 r# s ^& B我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。$ @7 N8 a& Q. l8 r! w
但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。2 G) a0 k7 d9 U
. o! P8 A! \4 n4 q( }7 m1 Z 二、书写一个“真正的”窗口消息处理函数:
+ Y5 O2 o+ G+ ?7 z按照普通窗口的方式书写好消息处理函数。1 r- {) j5 }7 X) _+ i* `7 C( e
(不要漏掉了DefWindowProc)5 a# H3 l- { O/ p
1 F, f: x5 c1 ~" |; w+ c& i* Z7 N& s
三、注册窗口类
/ K8 ~8 A% |$ G% v2 V% t' `用书写的消息处理函数注册一个窗口类。$ v7 I9 H& H3 P: ?: Z. z
g! |! n4 I$ s5 O( W$ H4 v
四、建立对话框资源,指定窗口类为自定的窗口类。; E. ?$ K6 k$ G: K) a
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
$ p1 j+ c# |. N(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")" b" l' K9 F* `2 V8 W+ i/ t
例:; b5 E- I6 [: f1 `% U
建立文件Some.dlg
! ?9 X9 B/ ~7 {书写:
4 w# G4 \! C5 u# `. W6 j wHexCalc DIALOG -1, -1, 102, 1224 m; l C- X% K( Z
4 g6 t2 s5 s& k2 r( B) bSTYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
6 D }. \3 |' n2 `) q/ k, ^. B; m& |% j$ b2 P- w8 b: ]( X
CLASS "HexCalc" //填写上自己注册的类名称
# N6 w, E* |8 u7 C
* b$ Q3 z' V( v1 Y# dCAPTION "Hex Calculator"
]$ g" k0 ~2 ]! }' R0 B* X
# x6 |; [# Z4 c. s' U) c8 W{& E) y# B3 ?9 N9 \, C p/ d
. a" T* L) @2 t d+ k, k# t, ~8 f
PUSHBUTTON "D", 68, 8, 24, 14, 14/ w7 L: T" R, i' D; h! ~
) n* c1 q( D; M8 `! Y. a4 E8 n/ i0 H
PUSHBUTTON "A", 65, 8, 40, 14, 14
, u! \( o: F; v5 n* C8 g7 s- C3 `3 O9 U' E# \
//各种控件/ {( y! S4 N( ?1 l/ }) t, s
9 _# U0 y9 o# G! i: K1 j
} 5 x9 N9 |/ ~$ O# s3 i" j; a
! U0 |, v% u3 d五、使用非模式对话框方式建立主窗口:- }4 C, U g+ N2 b9 q
建立主窗口的时候,使用CreateDialog。
6 t, ~/ m, Y: B* n3 j( Nhwnd = CreateDialog (
8 U7 |/ Z3 f- W8 I0 C8 H q; K hInstance," C) T! O+ K; k5 @* [
szAppName, //对话框模板
+ D. m7 |3 w2 B3 O- [# j( S% ], D) V' Z 0,0 m! i: e& _- S/ F- P& Z
NULL) ;. p# y _/ R v! K) |
ShowWindow (hwnd, iCmdShow) ;
% T0 V7 W+ r! M" c
1 p6 [% m3 b: {9 i3 Q 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。& c/ f% h* X' ^7 x8 ?
Ⅱ.在对话框中建立自定义子窗口 4 ]( b+ w/ Q% u! [* I! P
可以自己定义控件,然后在对话框模板中使用) {) A/ i: x$ P( j3 J* H7 c3 Q
5 x- e: W0 z0 I' O 一、定义"窗口类"与消息处理函数:
6 W: J$ x( X/ i6 a/ Z在WinMain中6 Y# l, h H) T8 {, q
除了注册主窗口类外,% O) @0 Q$ T- `! w, p% i
另外注册用于对话框的类,指明类对应的消息处理函数
/ }# e: u0 P3 c; m9 Y- M/ jwndclass.style = CS_HREDRAW | CS_VREDRAW ;
, o! N& V7 X( Kwndclass.lpfnWndProc = SomeWndProc ; //对应的消息处理函数0 t. `* R6 O' _6 J( q1 q
wndclass.cbClsExtra = 0 ;+ J# H5 m, N0 h% d' t
wndclass.cbWndExtra = 0 ;! V! V! @( a0 u$ G
wndclass.hInstance = hInstance ;* K% T8 V4 P( h: d
wndclass.hIcon = NULL ;
! J9 n9 W7 w: l# swndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
6 i; I7 u# v" k2 C7 H, e( rwndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;5 V! d) T9 v7 D7 K( L
wndclass.lpszMenuName = NULL ;
. v/ K. i0 D3 Zwndclass.lpszClassName = TEXT ("SomeControl") ;3 S' Q1 [) X( {
RegisterClass (&wndclass) ;6 B7 h; }8 W9 Y/ _$ e! s b
# Q1 D, l( Y- f 同时,还要书写好消息处理函数SomeWndProc。 {! f, _/ q2 I7 S, ^! r
二、在对话框模板中添加自定义控件窗口:
. r6 M; d: O% R% [8 T: ]7 {* o在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
# y6 {6 S! w1 [: t0 i7 d |