原文:http://www.th7.cn/Article/bc/VC/200702/10177.html5 L5 V- a8 B; u% _% f' Q
! R8 c1 A, E: x8 Y( D
一、概述:
% i( F2 @% r# \2 Y1 d在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。
j# j7 E* ~& V( U; i/ \使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。
( e& `- h" D& Y, W) U1 {
$ U a/ _6 G( K/ q ~; d我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
1 C3 t9 h" r: I% ]' p但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。
8 Z) X. [* H1 f& D; ]# |2 Z( P6 }2 H. e/ l) h) Z
二、书写一个“真正的”窗口消息处理函数:( v0 w& X3 I( ]3 ?: W% V
按照普通窗口的方式书写好消息处理函数。8 I1 Y" [7 F( W8 B& N5 T
(不要漏掉了DefWindowProc)* O e: a6 e$ o
2 o2 a" n2 s' A/ c( l0 X" _. C: o1 k K+ ~
三、注册窗口类
4 R. X; X% d; a: l8 I! c$ r用书写的消息处理函数注册一个窗口类。+ C( f& n0 C7 Z% O1 y6 y. H4 N
5 c4 |+ f( T$ v. C
四、建立对话框资源,指定窗口类为自定的窗口类。
! h$ ^% Q. c2 `3 i) V. K手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。% G3 e% s. I. k K1 s9 x3 m6 @/ B
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")
+ A/ A+ l6 N6 b5 X2 z, k例:
6 ^% ~8 w8 S4 ~) k( F建立文件Some.dlg$ L* t# Y1 d: \! ^& |
书写:$ r# r1 ]/ }8 b3 U, A
HexCalc DIALOG -1, -1, 102, 122; e, g, s; D4 v Y
+ |, F( _0 P+ Y' \6 Y
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
$ a% w8 h( r) u; G c, s7 e( o) n
CLASS "HexCalc" //填写上自己注册的类名称
5 N) J% z" r) I5 B2 n. L0 F# s' L. p0 W& l4 s6 ^2 @
CAPTION "Hex Calculator"7 [* v$ ^8 w2 K) R- W! D7 E% q
- k8 P8 C2 h, p0 k{
6 S/ m! y1 j& z3 c! T+ G
* P7 `: l$ W2 D9 d- _3 `" W- L3 @ PUSHBUTTON "D", 68, 8, 24, 14, 14
6 h. g$ f- f% ]
% V# x* Y6 q3 q/ e8 V+ X( v PUSHBUTTON "A", 65, 8, 40, 14, 14
- ?" n# p" ~: E% p" {& J
" H3 U* E4 B/ g, q //各种控件
/ y* E( V- s+ S5 n7 [' m# C2 A6 c; E' u4 b' D
}
) B. R7 F, h* i, o7 p: f- h; U$ i
% {8 U. w# u+ C五、使用非模式对话框方式建立主窗口:
6 L. s. S0 Z% O1 @9 M6 O3 c+ e建立主窗口的时候,使用CreateDialog。
: W3 R8 j3 k) E$ o hhwnd = CreateDialog (
9 x8 \ Y: x8 I: f5 F% A hInstance,
; B5 \* n$ G' q- m, Y szAppName, //对话框模板8 t$ ~/ f! m& _5 `
0,
3 ~3 r9 s& I/ g9 v; W NULL) ;
3 A; c- q( q6 Z! VShowWindow (hwnd, iCmdShow) ;9 @" @( n9 o# o! Y
, c* [( q1 L* r3 p 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。2 _6 c# ]3 m& s- \0 z0 t
Ⅱ.在对话框中建立自定义子窗口 ! i* v! ?; b+ a
可以自己定义控件,然后在对话框模板中使用; o+ a) b' l. W. P
% [/ f9 c# `6 H' ^4 ?2 Z" ^8 n
一、定义"窗口类"与消息处理函数:
! K1 H! _+ T7 h; Q1 f在WinMain中
w$ l* P% _% f2 Z$ y5 q. g除了注册主窗口类外,7 V0 F( l7 B& r7 _6 P
另外注册用于对话框的类,指明类对应的消息处理函数* }$ J$ s! C! S, z9 D( H0 g
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
* {+ |2 g, |0 Q0 m/ `( W' V9 ]wndclass.lpfnWndProc = SomeWndProc ; //对应的消息处理函数
7 G" h) p2 a- T8 T P9 b1 [- jwndclass.cbClsExtra = 0 ;
4 K) }) a7 H6 L0 ^wndclass.cbWndExtra = 0 ;# q( a$ |% ^ }5 G
wndclass.hInstance = hInstance ;
# y( `' Q# y. |9 ]- E4 Kwndclass.hIcon = NULL ;% F, W& j5 ^2 e/ I7 ]
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
- J5 T; T* M( P/ Rwndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;, P6 P# T" X7 @5 w: t; P
wndclass.lpszMenuName = NULL ;
: [ Z- r, B4 Ewndclass.lpszClassName = TEXT ("SomeControl") ;0 p, W& V/ x3 ]0 _- d. R1 c
RegisterClass (&wndclass) ;
5 }2 a, Y: L. M9 }* a* M3 C2 P5 Y2 `; |# O5 S+ m G) A! O- x: J" ~3 ]6 a
同时,还要书写好消息处理函数SomeWndProc。
. J: z* O# x- o4 T( T$ g4 ] 二、在对话框模板中添加自定义控件窗口:
& ]" I7 E+ |3 b+ C2 r在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
$ X4 H6 W$ _1 @. d |