原文:http://www.th7.cn/Article/bc/VC/200702/10177.html M3 R" X" b! U& z
L7 t7 h+ q" X; k% ?, S
一、概述:
2 T: s3 X% S- e( H) [* m在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。
; R v/ e( k1 d% M( J使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。2 h) @! G# w }3 g0 S4 ]
+ z4 I" c! P+ L, N
我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。/ i7 X8 c3 n, i2 m5 t+ [$ ?
但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。
% Q4 T: @- K# `; B& l9 m) t: B' l0 i) L
二、书写一个“真正的”窗口消息处理函数:
$ P# v& J. t: i- T$ X2 |& k* H按照普通窗口的方式书写好消息处理函数。4 i4 y9 ]5 g0 F- p
(不要漏掉了DefWindowProc)
, d+ P" _* Y) T, n- N8 Y2 r1 B- J2 y. v& k
三、注册窗口类
( Z. G2 w8 J( _( y" _* z用书写的消息处理函数注册一个窗口类。
3 n4 j7 V; R3 n! k4 W, }; P9 j, s) T- x- W, G
四、建立对话框资源,指定窗口类为自定的窗口类。, @+ `9 t/ U. ?& [
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。9 T/ P8 ~9 ?) I$ n! J
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")
7 ?, D4 t! K. |例:
# N! z7 P- \3 s T3 n建立文件Some.dlg
7 C9 j6 T! O2 k书写:+ E0 d, b7 S4 ~
HexCalc DIALOG -1, -1, 102, 122
9 v q! V& a+ v4 Y! {
! o- t0 ]4 L6 NSTYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX6 J* A% x- P. @. j# E
. ^5 o# U: A' B3 D/ e% c# L
CLASS "HexCalc" //填写上自己注册的类名称* f# W8 r2 B2 ?) J% a; z
% j( H9 D6 r ^$ cCAPTION "Hex Calculator"9 Z1 w& j* F0 P7 s
, {( p% c0 U3 S; P# f
{
& b+ z9 y- c$ ?" P1 q
' t% n6 Z! g7 X6 v PUSHBUTTON "D", 68, 8, 24, 14, 14 V9 j: O7 ?* T9 V) s8 ?
0 r' H, l4 s, [4 s; N4 @( Z
PUSHBUTTON "A", 65, 8, 40, 14, 14
( J( _6 U# ?8 I [4 s
- ?" k0 i: k) H5 H //各种控件6 X9 j* H" |' F' P/ H8 A
% y: p' X$ ~8 [}
, p* ]+ H0 ?# H3 X6 n; s8 i& t; p$ U7 M) k( ~
五、使用非模式对话框方式建立主窗口:
6 s8 ^: {- X! n' j建立主窗口的时候,使用CreateDialog。" q. H% Z' q1 r, f
hwnd = CreateDialog (/ U5 v7 r" x6 Z8 s+ u
hInstance,
# \" G9 t v) M( A6 E0 F$ Z szAppName, //对话框模板
, ~* y+ C* H% Q e 0,1 P* I: j2 ^6 A2 F& p* I6 s
NULL) ;8 q, P7 {: P ]2 P
ShowWindow (hwnd, iCmdShow) ;
# M* m p' w9 ]; g$ A; V
2 ?4 ^# {1 ^! b3 d4 l 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。" f; ^* P' r- B J8 F1 ?* m" d0 q" z
Ⅱ.在对话框中建立自定义子窗口
& p; I9 P( x0 Y! c2 a _可以自己定义控件,然后在对话框模板中使用
2 T# ?6 `- L3 C" S" q2 n# }$ G2 j9 C8 W. D( y" z0 I
一、定义"窗口类"与消息处理函数:! G8 J- g4 M" P- ?! C2 d
在WinMain中- W: s+ x# x( e7 ~ S
除了注册主窗口类外,2 G0 g& |8 _5 z+ C* _
另外注册用于对话框的类,指明类对应的消息处理函数
W" G; @3 f4 uwndclass.style = CS_HREDRAW | CS_VREDRAW ;/ W: Z) U' f( A- }: G1 Q3 T4 x% X5 X
wndclass.lpfnWndProc = SomeWndProc ; //对应的消息处理函数
- b5 I$ ~9 m/ i4 P1 cwndclass.cbClsExtra = 0 ;
/ y- f1 t( Y! b! hwndclass.cbWndExtra = 0 ;
9 { D2 D+ m% z. m/ I2 Twndclass.hInstance = hInstance ;: i8 j* N/ r, e
wndclass.hIcon = NULL ;) x7 z/ i; U: X& W6 Y
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;+ p% c4 Y' T9 K# Q2 j5 o
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
' j) K/ H- n& mwndclass.lpszMenuName = NULL ;& h4 q c) @$ t1 @% |2 r7 r
wndclass.lpszClassName = TEXT ("SomeControl") ;4 l" E" X% u# s3 L* ]: h
RegisterClass (&wndclass) ;2 i1 v- H5 J+ g4 C5 f2 S
2 Q, ?+ E) f! B8 ~ 同时,还要书写好消息处理函数SomeWndProc。
: {3 W- _2 j& \- }2 H 二、在对话框模板中添加自定义控件窗口:- |4 [5 C6 A5 V! z5 W9 P7 Q' X
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
5 v- L+ ~' e! q, X6 N) E |