原文:http://www.th7.cn/Article/bc/VC/200702/10177.html5 \) u! N- c+ I+ ~8 B
9 m- P( [: t* F. J2 c
一、概述: [* k' _: a7 w3 _2 ~/ ]4 O
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。: I. R4 L, _) }$ C5 I
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。
' m) d( O1 f; B% `
5 |8 |# t3 I; `# A6 W* s我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。 p5 ^6 M& Q: q: i% o
但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。6 F# R& s. I9 Z7 K
# L( S: p7 [# _2 G) ]
二、书写一个“真正的”窗口消息处理函数:
/ y s8 r7 a; R) W( m3 z, l; @按照普通窗口的方式书写好消息处理函数。
& n9 T* H7 y7 E k& ~) V(不要漏掉了DefWindowProc)
( t; {) x" Z$ q2 q; t; E5 K. T" K$ G* O: {
三、注册窗口类
$ ~$ q: k' \, U2 G- y用书写的消息处理函数注册一个窗口类。
7 M `7 h- |6 F9 P! ]) D7 K: b7 e* Q3 q3 X* F+ J5 U
四、建立对话框资源,指定窗口类为自定的窗口类。 m& n1 p) ?/ H6 F
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。7 F% ~0 k" @: q5 t G N7 c
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")3 n9 D y3 r+ T# L8 J4 A# ]
例:
; j4 D& C# L8 h5 V8 R' b9 q7 u建立文件Some.dlg
# j- [$ @ R% x1 l: u书写:1 S# Z7 c* d ]
HexCalc DIALOG -1, -1, 102, 122
9 y+ s( U: _, k1 P; u" {9 d6 K! t, r4 v; g. \1 |
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX9 }* j }' h5 I( L, m% T: @
8 a4 A' k7 a) H3 z9 R& P6 a
CLASS "HexCalc" //填写上自己注册的类名称
0 k9 P; K! I; n a
S/ Q/ Z$ f7 z/ ?2 S7 mCAPTION "Hex Calculator"
6 n: g' w& d3 N" V2 x( M. J, R7 P0 X5 H0 P- ]8 C
{, [7 O: [' R- W* [4 K1 v! V. V
8 L( P: N! m4 \$ Q3 \' e3 a PUSHBUTTON "D", 68, 8, 24, 14, 14
$ E, H. f/ L- n4 @' h( o" E7 p
5 Y# X7 W7 Q c9 w; y PUSHBUTTON "A", 65, 8, 40, 14, 140 Q. h, L; P* z) |1 q: @
~% @( E; e0 |$ ?/ d$ F8 o% Y$ w
//各种控件- _4 l5 O& }( u- F
" n" ]; R+ t0 b
} ) ]" v9 |" P; [
# O' y! U! [0 w7 N/ k
五、使用非模式对话框方式建立主窗口:$ f% m! v. J! @# Q N
建立主窗口的时候,使用CreateDialog。
: |2 t4 D" s6 J' }hwnd = CreateDialog (% r8 v; M# ~! B; C* x% b* Z' Y7 m
hInstance,0 j+ `" c8 F9 c8 H- A) }# \
szAppName, //对话框模板
8 P/ I6 p1 W2 f' j- ? 0,1 A. z( c8 k+ i/ Q0 |! l
NULL) ;
/ {6 x" X5 Y. I+ eShowWindow (hwnd, iCmdShow) ;, O8 {! l5 x9 a. ~' F: S/ x
; b4 G+ Y2 @6 f: [- L0 N
其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
# ?! j3 V" V6 g0 N R& Q% ]0 p: E Ⅱ.在对话框中建立自定义子窗口
* K1 j- @) z+ Q) v" ?2 m, I* ~! O可以自己定义控件,然后在对话框模板中使用
2 V k6 v4 O2 `
/ U4 J4 @( d4 I# p- l) D2 L 一、定义"窗口类"与消息处理函数: p$ m. Z: q T8 s d
在WinMain中
0 s" {4 a) E0 i( K# Y除了注册主窗口类外,$ z4 H9 P. F C+ ^% W
另外注册用于对话框的类,指明类对应的消息处理函数7 D" V# Y |5 O; S2 j+ N0 W
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
0 W" n2 `+ F0 c7 b! m2 m7 bwndclass.lpfnWndProc = SomeWndProc ; //对应的消息处理函数0 H( D' O% d+ {$ _
wndclass.cbClsExtra = 0 ;
/ V6 h% x% x {# U# S) iwndclass.cbWndExtra = 0 ;/ X- t8 d5 e. o) d( S
wndclass.hInstance = hInstance ;
' o, l# H, Q: P7 Q* ^' b7 awndclass.hIcon = NULL ;: S, H5 U( n, d/ j) I
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
5 h4 d2 n J! Y6 r+ P! @/ U* owndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;7 f( y7 i, q) R- h& z
wndclass.lpszMenuName = NULL ;
' z: L1 i% p5 i6 pwndclass.lpszClassName = TEXT ("SomeControl") ;
! c$ h0 g4 R2 f& PRegisterClass (&wndclass) ;4 l% F2 }0 H$ P% o$ g
, U& n$ c. \2 {, l6 J 同时,还要书写好消息处理函数SomeWndProc。 0 a; ]& G7 ~$ |: ^# ^
二、在对话框模板中添加自定义控件窗口:8 ]9 K0 M8 V9 D; z$ P- f
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
! T: X0 I6 v( q0 X) `, w |