原文:http://www.th7.cn/Article/bc/VC/200702/10177.html( o3 B8 [8 u9 E. ?& h( z! D! ]5 ~
) X% j# k* ?6 V一、概述:
. O8 ]" y: b8 I1 a" R在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。, o( v S( ^1 w- T( a# P
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。: ~+ @ O, H" k
) O8 ?* f: n- i, j/ O
我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
, P L1 t( E7 Y/ p$ Z7 z3 i但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。
0 S* l- T) i# S5 c7 J# R# {# C" n8 j$ R: j/ u- _+ k( [
二、书写一个“真正的”窗口消息处理函数:0 Q: l$ R/ b5 {/ u- J# y
按照普通窗口的方式书写好消息处理函数。- i% C; W0 l/ w
(不要漏掉了DefWindowProc)
" k( B7 f" u# C9 N& z# f* h
/ ]7 X, R% }) B" n- ]$ s& h 三、注册窗口类# V/ B; n+ i" `. z& `
用书写的消息处理函数注册一个窗口类。
& F- Q# a1 ]7 o" P% e. W. j# K
9 @8 ~0 n' _$ J' s' R& [ 四、建立对话框资源,指定窗口类为自定的窗口类。
; F/ H$ V5 w/ Y& P9 L手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。( q9 Q$ p/ E6 [9 s4 K7 S
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" "): A9 F, K2 r$ e0 }
例:# c/ @1 l4 X) u
建立文件Some.dlg
. R9 g+ G# N# k+ ~1 |" R6 J; K书写:( x: A8 a2 ^% N: K; Q9 M8 G
HexCalc DIALOG -1, -1, 102, 122
6 k2 j8 G6 E0 g( G& `: ]% z R5 \5 I# A% {9 v
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX" [& H* x4 e# S; X
+ B* f. h/ B' q' v
CLASS "HexCalc" //填写上自己注册的类名称
8 B( z( C3 q5 w2 `. F9 F& Q. \/ a; V1 `4 L+ c/ D& `6 f2 f
CAPTION "Hex Calculator"9 k! G9 T* g- _( S4 G9 e/ \( w
6 a+ @6 h, Y, t B9 H2 U# ?' |( p{- U' Q* o% l& K k/ ~8 j
# ^# a$ y+ B7 R PUSHBUTTON "D", 68, 8, 24, 14, 14& ]' y# k/ U. x# L
; F( ?; r8 P. v0 N0 B& Y; L" p PUSHBUTTON "A", 65, 8, 40, 14, 14' h3 `& [0 |) o) L
$ V& M) H9 _3 N+ M) F
//各种控件# v3 J2 K R0 {! |, B! U+ O
: M* |* y( i% n4 r7 ?9 u8 }}
! q/ j: Z( D$ _* P0 L; ]5 q5 ^4 k4 i1 R" E
五、使用非模式对话框方式建立主窗口:9 @ V; ~ p5 I! P
建立主窗口的时候,使用CreateDialog。7 A: y4 ? v7 M4 Z2 }3 c
hwnd = CreateDialog (* e7 W: k" W5 X; e5 b
hInstance,
8 a2 @. e& z" v! |# x0 H szAppName, //对话框模板) g2 o9 x: M- F3 O
0,! r/ O4 r6 ?$ ~# F
NULL) ; p) p- r' K, {: P) w- j
ShowWindow (hwnd, iCmdShow) ;
/ q" o: Q9 _) ~9 g( I8 ^5 B- _: N C% E c
其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
' o) i/ \( k% f3 m$ \; T Ⅱ.在对话框中建立自定义子窗口 8 |+ |6 _9 }/ ]- d/ Y, r2 v
可以自己定义控件,然后在对话框模板中使用
/ Z4 j9 }: j P. L3 c$ t' T, A* d- ]- }. L
一、定义"窗口类"与消息处理函数:
8 `2 A: v8 T7 M在WinMain中
/ E4 g5 j4 h2 }& y$ }4 Q- m除了注册主窗口类外,
) M" S. N) G+ X5 z! W" u另外注册用于对话框的类,指明类对应的消息处理函数
1 t6 s# u# L. U. wwndclass.style = CS_HREDRAW | CS_VREDRAW ;
. @9 i. O$ c1 n, |* r5 z$ N9 I* Lwndclass.lpfnWndProc = SomeWndProc ; //对应的消息处理函数/ h9 p* M+ J" I% I1 W1 L. I# w1 |
wndclass.cbClsExtra = 0 ;6 D) Y/ B/ [3 v2 v# b% `# ` W5 ?# D
wndclass.cbWndExtra = 0 ;8 H* C" b: v' {# u4 w
wndclass.hInstance = hInstance ;
! b9 B- M1 n0 v+ U# Swndclass.hIcon = NULL ;9 Z7 H& P( V" o A$ @- M
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;- i8 o* T" c% p( u
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
3 ^9 ~, b+ Z! m8 f$ F4 rwndclass.lpszMenuName = NULL ;9 E. D# s# z- S2 j. O
wndclass.lpszClassName = TEXT ("SomeControl") ;, T& J8 o# v! [! K2 W, F/ `
RegisterClass (&wndclass) ;, }+ P2 V I* S8 M' `
8 i: p% t- p4 u- P1 m R' ?+ C
同时,还要书写好消息处理函数SomeWndProc。
% C6 L% R/ }5 G0 q. M. P 二、在对话框模板中添加自定义控件窗口:
# _9 z. E- Y; b2 @在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
9 ]) Y/ `, `4 E |