原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
7 k8 p6 ]7 J) D% H3 z8 x/ d& k2 k7 m- L' W1 H
一、概述:4 Z1 v; C; k9 t6 V- g7 r9 [# v
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。& D- K: @- Q6 w g+ k8 h0 D( V
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。4 E1 Y T$ E0 i9 ?
3 R$ S9 k/ `0 p; x我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。& P1 Q( q( b9 U. n: X
但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。8 P" S" [. D: h$ u3 B$ @
7 a) A& n: D8 v: e& X
二、书写一个“真正的”窗口消息处理函数:
# W9 m, C/ i7 u3 S+ S按照普通窗口的方式书写好消息处理函数。
1 Q0 {% l7 a, ^3 @$ I(不要漏掉了DefWindowProc)2 p: ^$ `4 h3 ^) T) L" f
9 Z* q# ~0 B+ q& W/ _6 {! y: ~
三、注册窗口类
0 ]9 ~8 M' A/ {. c. t* H用书写的消息处理函数注册一个窗口类。1 Y+ j# a# C/ w( H
5 X- N6 R- x& j0 B) e x% x7 S( P 四、建立对话框资源,指定窗口类为自定的窗口类。1 s( i6 M/ a7 B6 M0 J
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。+ a8 Q2 `& \; M: y$ m
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ") o5 F: k9 h' d6 P- C
例:: O* q/ b4 b5 A. i ^6 {" n
建立文件Some.dlg
, D% I7 F1 F" ~书写:) x- k1 N) m, i2 |; M
HexCalc DIALOG -1, -1, 102, 1224 Q7 L. [8 V, l1 l( c% ]
7 [! C" m8 |) A1 m4 G; K7 m7 Y
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
& @. T) O' m8 ~8 r, |
6 H. Q% [- F+ U* U# q k8 o$ i( @CLASS "HexCalc" //填写上自己注册的类名称 E9 k8 \" {' P* T& c* k% _
+ p5 Q$ l+ |# T; T; R/ n
CAPTION "Hex Calculator": Z$ b* n6 ~: {0 t8 C
# ?" R& J+ [* O
{& I7 S; ^; R: Q6 c! r. M: U/ u. p
( T. @! _3 D) g7 O
PUSHBUTTON "D", 68, 8, 24, 14, 145 q7 v: z, V( I/ A0 b D+ Z3 L
1 {6 R% Q+ \; h% x& H% ?) T* O' O
PUSHBUTTON "A", 65, 8, 40, 14, 14" D' u8 M9 s% B2 r
' |% H! T5 t2 `; S9 [4 a+ p8 L4 z
//各种控件4 g o' z, b, S6 V( @
9 I! ]5 Z1 e A& b; U& F7 S}
1 k! N- C: P: |7 Q" i: M
$ L# `* D i$ }" e" P# F+ `五、使用非模式对话框方式建立主窗口:; D' G$ K# K5 i3 b# h. v; Q% |
建立主窗口的时候,使用CreateDialog。
8 G2 ~* X. }. t* vhwnd = CreateDialog (3 b% w# A+ [6 p8 R
hInstance,
5 a1 n" y2 ]4 W1 P6 Y. B( d4 N szAppName, //对话框模板
6 t6 c- d+ _; S% v c0 R+ Q3 C 0,5 {/ r( e0 P7 Q8 L
NULL) ;
# m) J$ Y, w$ Y4 B; K z; i2 xShowWindow (hwnd, iCmdShow) ;; B5 q+ A$ [8 v4 i
2 \. r1 d% Z/ m& | 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
5 V9 a9 v8 [5 {6 \ Ⅱ.在对话框中建立自定义子窗口
+ R6 p% I( m0 w2 C可以自己定义控件,然后在对话框模板中使用4 k! D B" R8 f% i
4 S# u& k! {/ j
一、定义"窗口类"与消息处理函数:$ ^ g6 C/ S+ s% g) { g+ z7 q* X
在WinMain中
$ q! V# _5 O. v9 q除了注册主窗口类外,2 v5 d, s" R& `4 P. Y$ D
另外注册用于对话框的类,指明类对应的消息处理函数
' X+ L( Q0 Q7 @$ G5 C: awndclass.style = CS_HREDRAW | CS_VREDRAW ;
/ n3 j* N+ G/ h( kwndclass.lpfnWndProc = SomeWndProc ; //对应的消息处理函数2 S; H1 G% P7 k, E/ i, C$ |
wndclass.cbClsExtra = 0 ;
% m8 j* C- ^0 |5 t/ iwndclass.cbWndExtra = 0 ;
* U* `) m$ ]. \" S. S/ w. J! [, |wndclass.hInstance = hInstance ;- D9 ^( W0 E" n) R- j: L
wndclass.hIcon = NULL ;% ^, K2 T; |2 u' a2 d+ @
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
, ]( k) j6 D5 |9 ]: F6 Ywndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;, n Q2 ~4 \4 U" X0 X/ h
wndclass.lpszMenuName = NULL ;
, c6 m3 _$ H9 G7 cwndclass.lpszClassName = TEXT ("SomeControl") ;) w7 q5 K/ F7 \% h
RegisterClass (&wndclass) ;+ z2 X! R/ x* H; n$ _5 K
% U7 |; n& \% I9 q 同时,还要书写好消息处理函数SomeWndProc。 ! n( b/ y z" b* \8 W6 ?" _
二、在对话框模板中添加自定义控件窗口:
' M2 t7 r& L2 y& a* Y; N4 y在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
' L4 |0 \8 Q! j |