找回密码
 注册
搜索
查看: 3742|回复: 0

Windows SDK笔记(六):使用对话框资源建立窗口

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html  D9 [, o4 M4 y) f

: G' |# `7 U9 ]# b一、概述:
4 t. Y( |; F1 G  e在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。# B: e2 w' g! w  n
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。
3 v5 a( K' {8 C6 r# F. ?! h( _3 _. T% D# F+ b0 D9 B
我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。8 m# J( f: b1 L
但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。9 E3 t* ~4 I) R! R- s: P6 x
" w0 z" G; F) B' \! d. [" ?
二、书写一个“真正的”窗口消息处理函数:( |5 N6 E- f! u# n6 w
按照普通窗口的方式书写好消息处理函数。
) ^' V! s) e, ~! s# X, {(不要漏掉了DefWindowProc)/ R3 d/ T% N7 t" `- V

0 e# |* \- y( E# y& x4 S 三、注册窗口类  H. N; [% C  b* r6 s8 |. N
用书写的消息处理函数注册一个窗口类。
5 |3 H' s' X: @/ B* ?( g1 O
; }8 B% x0 ~, i" g; I5 j 四、建立对话框资源,指定窗口类为自定的窗口类。0 a/ q! H) p1 x8 f9 B; S
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
1 v( G  N4 V0 O8 g( q(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")  D4 V) u6 ?, C' ^6 V  A
例:+ g' z5 Z9 @( O1 G2 D
建立文件Some.dlg
. N8 _4 Z! q1 g$ n( q& S* x- R书写:
( U6 J4 a' t0 F7 e+ KHexCalc DIALOG -1, -1, 102, 122/ r/ Q# K. D/ d: y) O

' G8 m) H' [7 F0 f+ kSTYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
5 b' T- K- i' n
. G7 H7 u9 O  G4 \0 {2 [; ^CLASS "HexCalc"    //填写上自己注册的类名称
& D) H6 C$ ]& W5 r( k1 Z: e2 R# _! M  C
CAPTION "Hex Calculator"
4 K% I: ?/ f$ s; q! ^4 @
# M" \/ X8 Z) w, G& o7 q{0 q$ s* w9 K4 J! x3 H! ?$ z4 [
; G6 n" `; C& ^9 c
        PUSHBUTTON "D",       68,  8,  24, 14, 14; K2 X7 v' ~0 X

- v* v5 \- w2 U1 v# u6 V" H        PUSHBUTTON "A",       65,  8,  40, 14, 14
* `  f2 I0 A  _+ v
& o* o2 d5 J4 [; R* X8 ?$ C        //各种控件8 p  H# ^; |3 n3 x6 K) F. D

& f' v7 q/ t( p  M2 b}
1 z' x9 P4 a" Y4 }
2 H% W- G# j' q  |: {五、使用非模式对话框方式建立主窗口:
- }+ Y* |. T# L9 O  [9 l) D/ Y6 s建立主窗口的时候,使用CreateDialog。
* W0 N6 k) }$ d4 x$ P8 t; E
hwnd = CreateDialog (
! i. C# E. ?( ?- c. W' ?                     hInstance,
; S, t0 O9 l0 C' E0 w0 v) D                     szAppName,        //对话框模板# G+ O! G0 ^. Y! ]
                     0,
+ o2 S7 x" |7 }& ?2 C& P                     NULL) ;
' {% |; ^1 }- N* V9 m  o0 kShowWindow (hwnd, iCmdShow) ;
+ f+ E3 q' M# O
0 t* i; S: D- V 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
6 |4 S7 C& c/ H) M& @! U) L# Q
Ⅱ.在对话框中建立自定义子窗口

" P! b: h+ D( w) c: P
可以自己定义控件,然后在对话框模板中使用. x% ^1 Z  O9 v2 j2 d, O

. Z1 t* w" T0 N0 X2 h 一、定义"窗口类"与消息处理函数:
7 |0 e/ |: U9 u在WinMain中
' c7 X7 g5 P& M. Q除了注册主窗口类外,4 |& T# h7 Z8 F  U" Y
另外注册用于对话框的类,指明类对应的消息处理函数
9 r' m# k& A3 G6 E: f( W2 _wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
7 E. l; C* h4 T7 ?+ O8 ^# _/ E  Jwndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数' f4 _6 x  z8 ^3 {1 e" B
wndclass.cbClsExtra    = 0 ;
5 K5 K5 a; t/ A/ S% S0 xwndclass.cbWndExtra    = 0 ;: ^" P. @1 E: H7 }# Z
wndclass.hInstance     = hInstance ;: ?2 P, E8 C8 I1 T0 ~
wndclass.hIcon         = NULL ;9 {8 I+ _8 L- {! g! K( Z( w
wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;; g# T1 k9 L, X. q; f/ A
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
9 [/ P: f& _% [- Q3 m( iwndclass.lpszMenuName  = NULL ;3 ^0 }7 Q% f0 d7 G
wndclass.lpszClassName = TEXT ("SomeControl") ;
9 E5 u2 L$ l, C* u' x- E; m, nRegisterClass (&wndclass) ;$ |; B. D) P4 N
/ ~$ L4 T: n( `# G5 O8 Z
同时,还要书写好消息处理函数SomeWndProc。
$ o7 i  C+ ~1 a$ k* R# `3 L
二、在对话框模板中添加自定义控件窗口:* _5 L( W7 ~+ Q& M' o2 [
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。; P: t( w) y6 G7 K& R8 q
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2026-8-14 01:14 , Processed in 0.020689 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表