原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
' Q: W2 `. B& w3 |* @
$ w" _) R5 {0 L4 |; H0 m一、概述:
4 q# B1 a: I7 J) B* J在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。/ b# K5 G) g- a$ K/ ]: ?
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。
! J1 X3 j! x7 l8 I: j9 T* [( G& {5 d3 z1 L3 g2 x' k7 Q
我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。9 p2 _8 Q4 m$ T8 h* Q- p
但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。6 t4 C, h+ @. E+ K% B* s
4 ^. W. W e3 I- J 二、书写一个“真正的”窗口消息处理函数:
6 f4 p, \ V+ q& S& i按照普通窗口的方式书写好消息处理函数。
, K) V6 g) Z+ V7 V4 U [" ~(不要漏掉了DefWindowProc)
" W; R* r* Q" R7 O- _1 v" _3 \9 R$ l2 q1 T
三、注册窗口类1 b6 ~2 R; {. B% z4 h# H# @4 P: W
用书写的消息处理函数注册一个窗口类。- k9 k0 L+ ~5 p, e& ^& ?
* y1 l) K, q+ a& j$ \ 四、建立对话框资源,指定窗口类为自定的窗口类。
+ w' s' D) F$ g3 r4 c5 [( O手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。( X" O$ `! L) d) m: S" Q
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")
0 N9 Q, F e) A: [4 }+ K例:
2 ]7 g0 V2 ]" b. U% y建立文件Some.dlg" j. m' L0 `8 w9 A
书写:
2 [) y! O/ _9 n) @HexCalc DIALOG -1, -1, 102, 122
/ P+ A/ F* r) n# x% L, n/ h) y9 V7 Q. }2 i8 L9 B: p' s$ W; Z
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
9 u5 ]/ l% K N: U
t/ G: I3 J) ] U- v" X& _CLASS "HexCalc" //填写上自己注册的类名称
2 r# J7 Z1 M- S" R$ \3 P9 ]8 u7 n O9 W5 s8 O" O+ M- o7 B
CAPTION "Hex Calculator"- F. ~' y4 [9 j( I q
! N- D% l- o/ D6 q9 V
{
( ~) {% N* d$ J8 o! R) _5 r1 x/ l( g
PUSHBUTTON "D", 68, 8, 24, 14, 14
+ f: b! d+ m; k2 r, A5 c
/ g* ~3 \; t" y( P% m4 o PUSHBUTTON "A", 65, 8, 40, 14, 149 ^2 p# Y% P: [7 L+ e7 H
1 E: \( `$ G- w1 J //各种控件, |$ }7 O$ r% j6 j" }5 g
8 B( ?* v7 A; k. B" r2 t} / g5 ]' o1 B% g- k! `' X
3 K$ Z' j/ N$ y+ ^- V/ ]
五、使用非模式对话框方式建立主窗口:
; w% B. p( n; S( ~& T" D建立主窗口的时候,使用CreateDialog。- q6 y* o7 n! @4 g/ I( o; v
hwnd = CreateDialog ( I; _0 b( L! M7 C3 Z
hInstance,
4 U6 r. A* }- i7 L szAppName, //对话框模板
. Y1 Q8 X6 k* g& E$ N4 g+ | 0,
! |! k, F' w. {6 l4 Z$ w2 ` NULL) ;
+ g# [' L/ S& _' ZShowWindow (hwnd, iCmdShow) ;
$ X' r6 W y3 p- p2 N# |* Q0 u. S% B- w: @, l* u& L' ?
其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。# V: V9 g# O f
Ⅱ.在对话框中建立自定义子窗口 8 P# T5 E! p5 h9 l0 ^' A
可以自己定义控件,然后在对话框模板中使用8 C( W2 t: w h u' `: }8 h& w& F) X
3 }7 t/ l. N7 @# S& r a 一、定义"窗口类"与消息处理函数:( R Q ] a- n) F. G6 M
在WinMain中
5 O; T- D1 l$ C除了注册主窗口类外,) J, E {. [8 G8 p, K' {( h
另外注册用于对话框的类,指明类对应的消息处理函数
d% Q6 J% W f" @5 }% B9 {wndclass.style = CS_HREDRAW | CS_VREDRAW ;
3 @ h/ L9 q. Z8 _wndclass.lpfnWndProc = SomeWndProc ; //对应的消息处理函数
! E. F. X$ k- \* ~9 N6 q) n5 B- ^wndclass.cbClsExtra = 0 ;
Y3 ^8 O/ Z8 S6 mwndclass.cbWndExtra = 0 ;
" a/ v8 O: e) p$ d$ twndclass.hInstance = hInstance ;3 b D) p* T e& X$ ?+ E/ z
wndclass.hIcon = NULL ;6 t: C$ T* h% I8 r9 R
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
5 S! A7 e. Z; W, Q! q) x- k! g1 a% ~wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ; ~( H" a* U% e, x; u
wndclass.lpszMenuName = NULL ;0 \& A* E# T& A6 K4 H# e! Z
wndclass.lpszClassName = TEXT ("SomeControl") ;4 \1 o9 J0 d9 w4 r9 X
RegisterClass (&wndclass) ;
. x! H r8 L: C, k' y4 ?; Z' u5 p7 u: l8 U; F. `, Z6 l8 h- K* c
同时,还要书写好消息处理函数SomeWndProc。 ! @* X, b8 C5 {% f
二、在对话框模板中添加自定义控件窗口:/ m' G& y' n6 @/ n& O2 O
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。8 }% C2 ^ b6 [' U; s$ ]. N
|