原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
7 \8 S9 N: C# [3 e b$ `2 N4 f
; S$ `, v" m) T, C: C3 C+ b/ u一、概述:: C1 ?+ ~) i+ A5 ?
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。- O* C0 b8 W# Z4 d; T4 ~& z
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。9 c/ M2 a3 W$ f
6 c% b% M0 Q) m6 x( u% ~! ?, ^- |2 n
我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
4 L. N2 O* j8 f但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。
8 @' `" f8 Q8 O. z( W a
# \% w& y/ G0 r+ m( O4 [ 二、书写一个“真正的”窗口消息处理函数:5 @* x7 J8 U7 O
按照普通窗口的方式书写好消息处理函数。
' l" J* I) F+ e1 E& d: _(不要漏掉了DefWindowProc)& u5 x" `/ O) r- h) @8 L
( h/ G7 M/ S4 r6 s/ D
三、注册窗口类
. _/ \# X, S8 j N& \用书写的消息处理函数注册一个窗口类。
, w. r6 w& A$ i& x
" C' t/ d2 f8 M4 \3 M' ~/ g- W 四、建立对话框资源,指定窗口类为自定的窗口类。
$ O, @! r: k8 f手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
1 M; S6 f! h, u1 t" c1 `! z(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")! [5 P) z A' Q, Y" A
例:7 F K% N& O# L5 T; l1 V" W
建立文件Some.dlg) c6 K' C3 h9 ]
书写:
9 T0 c- ^$ s0 d; @HexCalc DIALOG -1, -1, 102, 122
4 _/ }. _# x) w% n7 ]. P/ |% C4 }
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX* p, S7 [7 n. _3 w
' O4 Q) Z6 ]+ L* @CLASS "HexCalc" //填写上自己注册的类名称7 [1 i6 k/ z9 C9 i4 T
~" p J% H. E9 _
CAPTION "Hex Calculator"- ?1 M2 t9 x7 g! Y9 q2 K. h
S4 ~8 e9 G d, A{
2 ?, X; x9 D7 k) l
3 H' X/ U7 [; q. J0 } ~ PUSHBUTTON "D", 68, 8, 24, 14, 14
& d3 Y9 b: i! j, E
5 Y. b2 d4 e0 K3 I; C7 M PUSHBUTTON "A", 65, 8, 40, 14, 14
* q+ O$ c0 j% w# M) t7 ~, e& B: x0 K* t4 r: U$ ? w
//各种控件
! g5 q5 [, Q. `7 o, r' g
: j; R" U$ G' f$ V9 P; v}
. L4 B& o9 X0 `0 @) y7 Q* i- }
7 }9 W8 |( V/ }- X+ g五、使用非模式对话框方式建立主窗口:0 G" |8 F# G. ? L9 |* O4 ^1 g
建立主窗口的时候,使用CreateDialog。0 | b3 l# I8 a/ t1 D1 j
hwnd = CreateDialog () {) f7 o% q1 d x; X
hInstance," L: H/ K7 d% E6 M+ j9 H% r
szAppName, //对话框模板
0 ^5 \ O4 }* ?5 ?4 K8 O 0,
* t& m; o2 V" q$ X9 N5 { C NULL) ;
5 `5 P: G# e2 u. I) Z: @+ N: D. CShowWindow (hwnd, iCmdShow) ;
8 j$ k9 Y. A) j: z1 k
, m5 U4 o( s0 Y9 l4 F 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。0 F% n) Q1 v, L# [
Ⅱ.在对话框中建立自定义子窗口 ! A! F$ ], r: X, F
可以自己定义控件,然后在对话框模板中使用
+ ^. V H' c" d" C9 s9 v/ K
6 B$ t7 J6 d; Z0 K- O 一、定义"窗口类"与消息处理函数:
1 v ]2 n K2 N- W0 a" @在WinMain中
/ o8 q/ [* c5 f# s除了注册主窗口类外,: [5 Z3 F k& S0 _: @0 t
另外注册用于对话框的类,指明类对应的消息处理函数
2 v8 O. e' ?( _: B: p: ]wndclass.style = CS_HREDRAW | CS_VREDRAW ;: r2 j d/ H, a6 x( j
wndclass.lpfnWndProc = SomeWndProc ; //对应的消息处理函数
' F9 z9 j2 x# y8 D- @# ]2 n$ A# w1 Vwndclass.cbClsExtra = 0 ;
3 M3 X( m, \2 b4 Twndclass.cbWndExtra = 0 ;
2 H8 s1 F# i% {7 W+ }; ?wndclass.hInstance = hInstance ;
( f9 V$ L) p5 |, o @2 V; vwndclass.hIcon = NULL ;
q/ v* I- H1 \$ s6 G6 M: |8 }wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
7 ?' A. E3 \. E& [7 b+ Z' owndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;- m! F! c$ I/ B% z6 H& l: v# B2 @
wndclass.lpszMenuName = NULL ;
) Y" w/ F; h) K: b% ewndclass.lpszClassName = TEXT ("SomeControl") ;
; H/ v' S# P+ I* {RegisterClass (&wndclass) ;
) V3 m& K$ {" ]0 ~- V, c
. Q) C& S( t+ X( E 同时,还要书写好消息处理函数SomeWndProc。
% [* q; h8 ?0 E" G 二、在对话框模板中添加自定义控件窗口:$ ]$ P! X% [$ r& L
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。" V7 u$ c+ e( z1 ^# v* Q% q& |" C
|