原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
, {( I7 z J+ Q/ Q- N2 S1 q+ n; b5 e8 a9 Y/ \; M
一、概述:& \. Q- R* W! w: i; o8 W
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。& l% z; Q& r& S' |
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。
/ ?# {3 t' f* S# I5 z( Q0 l: M) o7 ^& k7 Q( ?7 D/ o; j4 [
我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。$ z8 K/ | v9 E5 ]0 ~
但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。
' |" [+ M$ Q# F
$ T/ b; ^0 Z; p1 ?( T5 f* z 二、书写一个“真正的”窗口消息处理函数:
j4 Z' H$ y0 f/ c" U5 n按照普通窗口的方式书写好消息处理函数。
! ~/ P( a; e$ \) z/ s/ g/ d5 ](不要漏掉了DefWindowProc)1 d9 @% X9 p y4 p. I4 i4 d
2 M1 N. q6 S' f( u6 M: Y9 |
三、注册窗口类. B+ d4 D# i/ C! M, A& M* w; @: w: O
用书写的消息处理函数注册一个窗口类。
& C) q; y! ?# B! u8 Q, _: S3 x& M4 T: G- h* w) M6 J* w6 H
四、建立对话框资源,指定窗口类为自定的窗口类。
5 r# _3 { q0 p& o手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。: X V; \9 n: a& h4 b- R% F L/ S4 }# h
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")4 ?% S5 e3 Y& W E. \. G2 B/ e
例:
) J. c, o5 m$ B, a l/ t建立文件Some.dlg
! N% s, u# a3 y% n* Z& Q' ?# a: h, X书写:
, v$ ?1 a5 z3 E1 V6 `" dHexCalc DIALOG -1, -1, 102, 122/ e5 N6 Q/ t3 f) b. I9 S+ l u! u
0 Z% q- X" x a, b
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX4 p7 s& q5 b* O
0 t6 W& P% Y8 Z! ] ECLASS "HexCalc" //填写上自己注册的类名称) l0 t6 h6 q1 f7 U S" ]
8 r9 K; |# a6 D' G, y$ J' B; @) G4 _CAPTION "Hex Calculator"
; t1 K! A+ p; G+ `6 @+ D4 U! N }1 e! { h; ^1 `
{
+ v; ]! j6 e& K# U O2 U; R4 u: {8 y/ D0 e; B
PUSHBUTTON "D", 68, 8, 24, 14, 14, ]% _; L9 `- u) Z5 l& Y D9 ~( e4 m
& T. M: M3 w% [) }+ L
PUSHBUTTON "A", 65, 8, 40, 14, 14
+ M- `. \3 h; ]' f0 P5 B
5 M: k4 ~- [1 D x: W //各种控件
+ [* N; N( p: N: g8 p
! o4 w& h! A( {' w} - e2 e7 }& Q+ u9 V/ v3 j7 l
. D* |4 I% s% m+ @. h T五、使用非模式对话框方式建立主窗口:+ n# t8 v* E7 ~! \9 f) P
建立主窗口的时候,使用CreateDialog。& H. h( C4 F* L% j5 I3 I# H& z* W
hwnd = CreateDialog (& p% s3 b0 A& l8 m( I- O
hInstance,
& S, o t+ y+ T% g szAppName, //对话框模板# b/ ?6 h( `6 N) Z; l# `4 {
0,
0 u. f" K) F7 e" {. k# \0 J NULL) ;
3 M5 \4 W1 Q& M) U; B# A! |) JShowWindow (hwnd, iCmdShow) ;2 i9 X; l/ g' G- J8 T
$ W V* k3 P0 D' Q _) X 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
: V- k0 D# I- ? Ⅱ.在对话框中建立自定义子窗口
L. R' x" Z% j0 v2 Y$ l, O) a可以自己定义控件,然后在对话框模板中使用
5 o+ Z J; Q6 _0 U/ R
: G& l$ U; }& u2 W& a1 ~ 一、定义"窗口类"与消息处理函数:! s0 l3 y# Z8 ?2 a& n8 a0 p
在WinMain中
3 |0 M, T3 {1 F7 \3 U除了注册主窗口类外,. q0 ?/ E, X7 b# K9 L
另外注册用于对话框的类,指明类对应的消息处理函数5 u6 G& h. E: E1 h" t' [
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
, o$ E* G* r; s, }wndclass.lpfnWndProc = SomeWndProc ; //对应的消息处理函数
. Q2 | K( D: N0 bwndclass.cbClsExtra = 0 ;
& k) X( s& C& D: Z$ g6 W- `+ Pwndclass.cbWndExtra = 0 ;
9 I v, r% v" u$ W! Twndclass.hInstance = hInstance ;2 o4 Y- k% P$ t+ m6 e/ Y
wndclass.hIcon = NULL ;' S o9 t- }) O
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
8 v. T$ |7 n5 k; ^! P9 nwndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
! Z- I9 S2 [: Y3 i% g9 qwndclass.lpszMenuName = NULL ;8 X8 X1 t3 @/ m8 c
wndclass.lpszClassName = TEXT ("SomeControl") ;8 N0 E) l/ r0 I) S. b8 m& {
RegisterClass (&wndclass) ;
: m, H: {* T( ~" P: R& s' I6 [/ y
8 I {% C/ W$ l) t 同时,还要书写好消息处理函数SomeWndProc。
( b- j% R# x3 N% n- {$ U 二、在对话框模板中添加自定义控件窗口:
$ [0 |& |( t4 n$ o3 d在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
. S, m) U0 o+ V$ j |