原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
' d7 p. T" X7 m ]0 D
/ V4 w! I9 s# Z- t3 C一、概述:
# v9 w* I5 n8 z: [: L9 M9 E在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。4 r* L. y0 D! t# ^
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。# u+ a3 q3 {' e- q8 q4 `
! G n% @' L0 `5 U
我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。4 I5 k/ L \' A
但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。. A3 z+ m( P/ J' R; w
- x% b- F: R0 W3 ~, Y 二、书写一个“真正的”窗口消息处理函数:/ O9 l4 n. X' z: ~( e
按照普通窗口的方式书写好消息处理函数。' i5 P( X# d Y: N; u' J
(不要漏掉了DefWindowProc)9 b; g- o* {4 O x9 i4 Y m6 W
# \1 \" T( v! J4 p
三、注册窗口类7 c: ~8 x: h! M/ [0 z0 e
用书写的消息处理函数注册一个窗口类。
' x: q- M* v% d) b" d+ G/ V- {# p$ `/ E1 \3 d# f% I
四、建立对话框资源,指定窗口类为自定的窗口类。4 k$ _" k5 |! \7 |8 b
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。- a! b: m& Z7 Z5 [- o4 x( H9 p
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")
7 r4 `& V+ x: P$ J例:
6 G3 n X, V4 j: n$ S+ W. q) @$ z7 W建立文件Some.dlg
- m7 Y4 f) u8 p6 ]7 g书写:
( M1 d% N2 Y! N+ z# Q- qHexCalc DIALOG -1, -1, 102, 122; r+ U4 a) p. o4 V% I0 g
* u' ^+ B' M+ u4 U0 s' ^/ G* ^STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
" X' Y* _" K, y) J& U3 c. ^# F1 m& r
CLASS "HexCalc" //填写上自己注册的类名称
1 T4 J1 ]* z9 d, v( V/ E$ S c3 N
- b, T- G" _1 [5 bCAPTION "Hex Calculator"6 x: p8 }2 S8 }4 b4 B
7 b, U! G1 G4 Y0 d
{
8 K2 c9 Y9 r: ^ w* R
4 P. S- d1 k; ^: w, _$ k/ G PUSHBUTTON "D", 68, 8, 24, 14, 14
5 P4 b1 F* D, C) F* G: D& ]
- i, e4 K6 d" A" @ PUSHBUTTON "A", 65, 8, 40, 14, 14
( a* Y) ]7 A) x2 p! z. s: {+ V# y* U s
//各种控件3 T6 `% U& O6 T) B# ~* r% x% g) L: t
9 h' w0 | r" o9 R# L
} # ~% N5 T1 v9 ]' I
5 h* w# a) e2 e' u) {
五、使用非模式对话框方式建立主窗口:5 R. Q0 b- P- C! h
建立主窗口的时候,使用CreateDialog。
) e7 ]% g- E; h5 T8 {6 d7 phwnd = CreateDialog (: X6 T9 p+ {9 p8 d6 P. t; g/ ^; f
hInstance,
; f8 Y8 q; s0 q" Q0 W O szAppName, //对话框模板
% a4 w6 U/ F$ c5 q7 Z% d 0,
8 A, c6 w0 m# c1 ~; K8 W NULL) ;
1 a$ o& S1 r7 o GShowWindow (hwnd, iCmdShow) ;% ^- J8 C4 Y1 N% A, `8 ~# R |: z6 K. J
4 ?1 a$ v; ~# A3 A7 L1 p( p! c& Z 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。2 Z. @9 l2 _4 V( k% g0 m4 \5 J
Ⅱ.在对话框中建立自定义子窗口 & [2 r6 C& ^* F, ~& D! C0 m
可以自己定义控件,然后在对话框模板中使用) f2 k, v" Z- G H T
% M1 t" v5 T, M9 S) b
一、定义"窗口类"与消息处理函数:
9 f( ^- W' C$ [! V在WinMain中$ v+ q& l5 v, k$ W" u5 F
除了注册主窗口类外,3 b/ k/ g/ s- |. x8 r1 C4 a# e
另外注册用于对话框的类,指明类对应的消息处理函数
- t& N& G' ], s. X) F+ G3 ~wndclass.style = CS_HREDRAW | CS_VREDRAW ;6 r, I+ ^) e0 D8 C
wndclass.lpfnWndProc = SomeWndProc ; //对应的消息处理函数
! e( J ]/ d- I( Q( b" Twndclass.cbClsExtra = 0 ;
* E1 O! ?1 R# E" h& Zwndclass.cbWndExtra = 0 ;; m1 X' R1 q' ]
wndclass.hInstance = hInstance ;
5 N& L1 J+ O8 w6 R6 A0 ~wndclass.hIcon = NULL ;
5 F3 J+ l. C9 Z/ U9 |+ ]- zwndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;. S* B. G" h5 h
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
6 o" J ^, _9 I y5 T& Awndclass.lpszMenuName = NULL ;) U, v4 \9 ]# f! E+ z* f
wndclass.lpszClassName = TEXT ("SomeControl") ;
( S" m" w% D9 }RegisterClass (&wndclass) ;
% A; T; r: _$ @9 |1 @4 v3 X! T* [
1 w. m4 k" _4 P, W. k. X 同时,还要书写好消息处理函数SomeWndProc。
* R/ s' Z* b1 g$ A6 X; U 二、在对话框模板中添加自定义控件窗口:
: K# d" s( q2 g6 N; s! i在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
/ B6 }5 H' P O* w; J2 P |