原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
6 ]0 I$ y+ L0 g% D1 u9 Y* v8 X/ C% M* ]& E; n- w
一、概述:
, [7 n6 B% r5 H% Y+ C, t在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。2 f4 J- y. G" V2 Z/ r! v7 I
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。2 _3 e# d G6 b: F: V
% ]# S. ^9 |4 J+ k, \7 X) F
我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
|0 t$ I' ~' ? Z! M5 ~但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。4 J. T8 k5 h# j' ?# U
( ?1 i) f$ y; i
二、书写一个“真正的”窗口消息处理函数:" Y5 n6 y8 q( ?) C0 h
按照普通窗口的方式书写好消息处理函数。0 E5 f) n7 J. g/ l
(不要漏掉了DefWindowProc)
U# Y( _- C! ^) r0 i( P. i% u/ Y3 ^
三、注册窗口类; q- K( i. E% }5 {1 q) M' I# r& }
用书写的消息处理函数注册一个窗口类。, d: o& p$ `9 j. v* `% p9 C3 z
! E& H/ H" s' o0 X, e3 D
四、建立对话框资源,指定窗口类为自定的窗口类。
) j+ r' c+ q2 u& x* c8 H1 j手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
, R! Q+ p9 n- H: k% g(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")6 |0 ^( a X7 w( F1 p* f
例:: @2 u& Y; s2 l9 r6 Q
建立文件Some.dlg0 |, u9 ^7 C; I* W% U* Y" a
书写:
, R% g; m$ Q; fHexCalc DIALOG -1, -1, 102, 122
4 G1 i) G7 E8 I" `; O
6 D2 b7 Z0 l6 X, [6 \6 LSTYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
- C: s0 @* E- Q
$ E& ]6 S# V+ D6 @* rCLASS "HexCalc" //填写上自己注册的类名称2 C6 d, E t+ e# o K; x
$ J" R$ e& Y' w9 w& Y3 cCAPTION "Hex Calculator"* {8 m: g+ |; x/ ^1 E7 U
- @, V, b0 [' h! G+ t) [% T% {
{/ c0 k J7 M) T# h
) e! G" L( O: v: R, j% K PUSHBUTTON "D", 68, 8, 24, 14, 14
4 p: ?9 M3 y6 }6 P5 [4 a! e
4 k9 H' F0 Z% r; ] r" |' k PUSHBUTTON "A", 65, 8, 40, 14, 14
+ ^3 Q2 n, J, U$ E& a6 Y" ]$ z
0 H; R* \ Y5 u* u: F //各种控件0 O& F: F4 J1 P- z, D
5 q: D% j1 ^" S. R) m1 U. |}
# o1 N7 D- _. r* W
0 ]6 g$ T8 I7 b, R. Y# ]五、使用非模式对话框方式建立主窗口:
. E' t7 O. X2 C4 e W1 x8 H! l建立主窗口的时候,使用CreateDialog。. U0 |6 B8 W# Q6 s/ L
hwnd = CreateDialog (
8 h9 W" e2 \; |6 D8 B% t hInstance,
; H7 g$ d' ~3 Y# b; i& z7 w szAppName, //对话框模板
6 _$ [( K: w) n* G2 d: G$ s/ P 0,! a6 y! q f. V/ j; v
NULL) ;+ F. k2 G9 |" W, S+ [9 @+ ^8 r
ShowWindow (hwnd, iCmdShow) ;% [( i( ~* w7 Q' {: g
' P3 H" z/ j2 ~- {
其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。, w: f. b) y: Q) w$ ?
Ⅱ.在对话框中建立自定义子窗口
. H6 N8 Y9 d" ^! @可以自己定义控件,然后在对话框模板中使用2 p# m' L" |2 o
5 ~1 }& z- a9 _( ^. Z
一、定义"窗口类"与消息处理函数:
$ B5 {4 |5 R3 e ^在WinMain中
1 q* ^ P i3 `$ Y, T* t/ _4 T4 |除了注册主窗口类外,
$ C7 x1 f' v6 O另外注册用于对话框的类,指明类对应的消息处理函数
+ A9 ~3 [! f4 u9 s6 fwndclass.style = CS_HREDRAW | CS_VREDRAW ;
2 m# e0 [" z% W. I' Ywndclass.lpfnWndProc = SomeWndProc ; //对应的消息处理函数9 ~5 T; v6 f, H6 q3 E1 w
wndclass.cbClsExtra = 0 ;
. o( Z, W" z, h; l* D4 U: V8 C3 Jwndclass.cbWndExtra = 0 ;
& t; o$ y/ j2 }) M' Wwndclass.hInstance = hInstance ;
3 h- u5 a/ I4 o6 y3 {+ y% Y4 uwndclass.hIcon = NULL ;, a2 W/ D0 L/ Y% b2 L2 [$ n
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;: X! O% ~ J2 Z, w7 ]3 ?
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;6 u- W j# y$ d
wndclass.lpszMenuName = NULL ;- w2 B" \% i1 o; \
wndclass.lpszClassName = TEXT ("SomeControl") ;8 R# m7 [9 L3 H; j# L
RegisterClass (&wndclass) ;
$ }3 i3 g. Z) _7 a$ C1 h6 R
! m7 R4 I* K& c6 t# J2 o1 k5 I 同时,还要书写好消息处理函数SomeWndProc。 v) T+ A! p% R1 p
二、在对话框模板中添加自定义控件窗口:
( e0 j7 \1 O& Z' ^在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
! r8 M1 O+ `% m4 [6 _# X# b3 c |