原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
0 q0 K4 z( K3 Y4 X# _- V) _. K5 u/ k3 |, z1 Y% `
一、概述:, E( b6 Z' ?' \# b6 A$ t; }, h/ L6 D S9 k
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。
. m6 w/ V6 l) F8 j6 `3 ^; W使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。
( H6 _ S2 ?$ T7 W1 E
2 p. \! v# z: U9 t我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
/ `5 I' Q& v7 _$ ]- U+ Z但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。
" L5 z* v2 H, C9 N
1 w/ U3 A5 c# N; T7 c 二、书写一个“真正的”窗口消息处理函数:2 P3 y" H1 v8 ~( t% B
按照普通窗口的方式书写好消息处理函数。
4 u5 r& \. p P/ c5 O* p+ p: Y9 k(不要漏掉了DefWindowProc)9 P4 F. B0 S: H
7 _- W/ a9 B" {) K& u
三、注册窗口类
4 n0 ]) ]9 v5 C8 ^9 ]用书写的消息处理函数注册一个窗口类。$ O& A. h- x7 R o$ M. H
6 H" E/ d. [, C# l: n
四、建立对话框资源,指定窗口类为自定的窗口类。% N. \4 c8 M% i& ^
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
w' [0 o$ y' G! F& h4 l P(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")
, |# N, Q& D2 e, |8 Z/ X0 r例:7 P- [! Y/ ], o( z# q2 u2 C
建立文件Some.dlg
0 {. n7 P; L3 J; E书写:9 B9 s H. v$ s
HexCalc DIALOG -1, -1, 102, 1228 w9 \3 e& [& w
- w6 }' Q7 r! u2 @2 _( JSTYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
' C0 \! K1 [! X" J0 \! Y3 z/ U
. p( k( R* W' W3 u7 {8 _2 W% L7 sCLASS "HexCalc" //填写上自己注册的类名称
0 j) \/ J. [4 o# p5 {2 j: u1 l0 E7 b0 I; w' K& P. p
CAPTION "Hex Calculator"$ E1 [- E$ h& x0 I2 \) |' b
6 I+ p; W) l2 O% Q- W
{
9 R* E+ ~: [7 R, A1 z
' Y4 x# R6 {( @ x+ A PUSHBUTTON "D", 68, 8, 24, 14, 14
+ K2 ~9 h) j. Y7 H# w6 E: e5 a; V3 i$ M
PUSHBUTTON "A", 65, 8, 40, 14, 14
# p; r& K9 C$ X: W6 n7 ?
+ d0 A b8 {' k# e& F V! }& j //各种控件" v& i S2 z5 t
' c' m( M5 N: Y2 C}
" ?' [, W! u8 x8 s8 B
& }6 |9 Z* o* V* G6 {五、使用非模式对话框方式建立主窗口:
, Y' P+ d6 [. I+ M8 ]建立主窗口的时候,使用CreateDialog。
9 d5 E! b3 S2 w& Zhwnd = CreateDialog (' }; h& \0 w5 `7 J$ @6 A% x
hInstance,
% i) [- G' E( W6 U9 n- e+ Q9 { szAppName, //对话框模板; G3 x7 ?0 g2 l5 m( ^
0,
( Z2 g+ b v3 ^0 O; } NULL) ;
' B2 X* o" F5 F) q6 EShowWindow (hwnd, iCmdShow) ;# _( u. X: i. L' K7 }- c* Z+ N# ^
h' l! \6 L& J- T- u7 | 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。8 x# l7 n! [& S; c- P
Ⅱ.在对话框中建立自定义子窗口 4 k S K; j& C- Q; b, D
可以自己定义控件,然后在对话框模板中使用: ? k+ |2 W8 \
J4 S( n6 c1 m/ ^+ d 一、定义"窗口类"与消息处理函数:
; N7 {7 f" ?) F7 m2 ^在WinMain中+ t2 X: ~' M: C9 Y, I; Q) r' a
除了注册主窗口类外,
7 ^) k- o" ~ C$ l另外注册用于对话框的类,指明类对应的消息处理函数; V: x; q8 s) _, @) I
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
8 K% Q* e/ }. g6 E& twndclass.lpfnWndProc = SomeWndProc ; //对应的消息处理函数# _" a8 f( V0 j* i2 [
wndclass.cbClsExtra = 0 ;; _3 R) R {0 U$ W8 @9 A
wndclass.cbWndExtra = 0 ;& s! P, }8 I# @+ l K# z: D
wndclass.hInstance = hInstance ;* t, Q4 b0 q( _- _# s4 G4 s
wndclass.hIcon = NULL ;
% i3 R+ i% k2 B: l$ wwndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;. {/ X& R6 a+ f
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;, v- B5 _7 S M
wndclass.lpszMenuName = NULL ; A) Q7 ?3 b3 C
wndclass.lpszClassName = TEXT ("SomeControl") ;
5 y8 T! T( O9 R) v4 w4 ?6 jRegisterClass (&wndclass) ;% x2 a f0 e; j+ k
4 w8 T+ ^0 E8 N+ `1 D. Z' c 同时,还要书写好消息处理函数SomeWndProc。
" l; \/ M4 I6 b+ @ 二、在对话框模板中添加自定义控件窗口:
! _1 O! g Z5 H3 Z9 j在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
' Y0 I( O2 K! X/ `) a |