原文:http://www.th7.cn/Article/bc/VC/200702/10177.html) Y/ k2 I o8 i. C* @+ T; r
' p. Y" R B3 V7 z4 |一、概述:) m% g! t/ e0 y$ q
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。
/ `8 R# A# F" f1 O使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。6 K0 b2 e: F, p! `
/ B3 F& \. v9 _3 f+ Q( r我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
7 x: s6 v4 [0 o3 X1 S' f但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。$ ?+ h' Z! p! y8 `2 l! d; T* Y
[. {+ \6 _6 n7 t& ?6 Z: K" c 二、书写一个“真正的”窗口消息处理函数:, V" X6 \& }# @
按照普通窗口的方式书写好消息处理函数。3 ^& u% O# l5 x# G" ?6 y
(不要漏掉了DefWindowProc)
$ l, I# i9 J0 P0 Y( r) p1 Z$ v+ J" O
三、注册窗口类
2 ?# W P9 _( O6 [3 ~3 _8 y5 C$ ?用书写的消息处理函数注册一个窗口类。
: @1 F" U, a! q6 s5 |" W
5 F2 `: H3 U; ?4 D 四、建立对话框资源,指定窗口类为自定的窗口类。2 v0 g- @* X) j( e: l
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
! X8 [1 A9 d ?' h, R) F/ ](使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")
. f* U q' Q& Y! x" |4 h- K例:1 m) \, \# b! H( ^; z4 V( U: d
建立文件Some.dlg
, O3 X; o: Z% q, M5 k; V1 Z书写:# c0 Q4 w* |$ q
HexCalc DIALOG -1, -1, 102, 122) @' X( W( ?# L6 R% t# D
: n" Y/ J; i: j3 ]% z2 b f/ t6 r
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX6 c1 x) `4 {2 b2 c, k; M/ d A
8 t' ~3 c' c! CCLASS "HexCalc" //填写上自己注册的类名称
4 G1 x! V. E% P3 A2 {
. i$ m0 _1 l7 p% xCAPTION "Hex Calculator": `+ {8 r0 d4 X1 U% W
2 Q4 q# p! d! V0 w/ m& u+ e4 N{3 w! r/ d! {6 ~
; l, Z9 }4 A3 S* a
PUSHBUTTON "D", 68, 8, 24, 14, 14' ]5 u7 o9 ?- W& T+ }0 @
: F" _2 x L+ m; J4 K% u PUSHBUTTON "A", 65, 8, 40, 14, 14
* Y3 q/ Q* q& _. t7 ^% F, w+ f# k. W% I
//各种控件
, X1 I; V* z% |4 U& i" p. s- ?% n* M, `4 J" o
}
Q- P5 f$ A5 f; u( y& c! l$ P! Q* |! g/ v3 S) D7 t2 h
五、使用非模式对话框方式建立主窗口:
0 G0 X! I! I7 H, W) b建立主窗口的时候,使用CreateDialog。* O) h/ B; D9 f. t7 b6 J
hwnd = CreateDialog (# V6 i' q: ]& `3 k: I( v" d1 Z$ N% ~5 w
hInstance,' ^/ i0 h$ B+ P# v
szAppName, //对话框模板( g. u9 O% r) H
0,
, V) n+ [( n* m9 a& D" M: F' R NULL) ;
/ G3 Q* \; s4 d" XShowWindow (hwnd, iCmdShow) ;
' K8 U/ z+ l, C& l5 E2 z s+ ~8 B/ e+ K* i
其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。8 S3 H# v! ^2 b( q
Ⅱ.在对话框中建立自定义子窗口 1 @, @6 f2 S/ f8 u. e( Y8 M9 d
可以自己定义控件,然后在对话框模板中使用
* ?3 l# o0 `3 t: d' ]: M9 P# U% O
一、定义"窗口类"与消息处理函数:
" e9 h3 h" l1 r3 r1 t8 y在WinMain中
/ O; D* K$ u( | L除了注册主窗口类外,0 I; V# E& t: L3 i" F
另外注册用于对话框的类,指明类对应的消息处理函数
6 i; G$ g, ?- ^% d: V$ {# Vwndclass.style = CS_HREDRAW | CS_VREDRAW ;
* M/ }, Q7 b$ x2 \wndclass.lpfnWndProc = SomeWndProc ; //对应的消息处理函数
# G; i+ e% y7 _3 p% R9 F! lwndclass.cbClsExtra = 0 ;) _5 T9 c7 I9 v y$ C! A* [& g9 I1 Q
wndclass.cbWndExtra = 0 ;
9 v9 R9 @1 h' j% @ I7 zwndclass.hInstance = hInstance ;4 s* e4 y: ^. _ B- `/ n. w( `
wndclass.hIcon = NULL ;
; m; H$ g& z4 E4 ^wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;7 N' P' Q7 f) E+ f+ N& M. M
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;9 `$ z6 A* d* S0 Q% H# u
wndclass.lpszMenuName = NULL ;/ Z, H' q" R$ O. w* g( D. z
wndclass.lpszClassName = TEXT ("SomeControl") ;1 A: K& X4 }: _/ W# h5 q3 C* X
RegisterClass (&wndclass) ;
+ o# |' G4 S2 |+ j+ U
1 r w0 J' r3 W 同时,还要书写好消息处理函数SomeWndProc。 1 K# Y. z) i3 t9 V# _
二、在对话框模板中添加自定义控件窗口:
$ w2 J6 G k4 U- L; L. j, M在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
/ z5 z: D$ A4 r2 D- _! B' J |