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

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
- u  V6 ]: E1 U
0 n" V) T2 @6 U8 ^4 ?& U一、概述:
: U2 {5 i( \# ^在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。* q# k* r- F* q' l
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。
) E" L/ ]) E, W% V2 f' Y  K0 w/ t0 j' O7 _$ }7 @: Z
我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。9 Y$ t4 ?% U4 o! N5 r0 F9 u
但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。0 V. b: J- ]8 R, |' ]5 |
: C6 ^7 d: W& V5 [1 j$ T; X6 B
二、书写一个“真正的”窗口消息处理函数:, n, T1 W0 d/ M& u! h. n* P" \
按照普通窗口的方式书写好消息处理函数。
+ V7 _; P0 {# x- R( z% m(不要漏掉了DefWindowProc)8 L% W* N6 B" w" G" U# b

6 C. ^& d) |1 b' }& {+ v' P3 D 三、注册窗口类
- I7 X  [. p' d+ A用书写的消息处理函数注册一个窗口类。' ]7 Y# {; i& }2 M

( @+ ]6 N/ r$ @ 四、建立对话框资源,指定窗口类为自定的窗口类。9 z5 n! h! [, M5 D
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。9 a: `# z( A; U  r+ G) |+ W
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")
" {  [3 G' ]6 U9 T8 A4 l% o例:; s4 f& }2 g2 {# z0 D0 |
建立文件Some.dlg
6 W7 z2 J0 M5 W4 J" ?书写:
) h6 K# H/ r, K6 [0 A3 R7 JHexCalc DIALOG -1, -1, 102, 122
8 i5 Q; G# T: @6 N" b. Z' C9 U2 b" U5 g+ E! T) L! u8 o, C
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
- Y& T4 \* ^, a& E: e, e
# U. z( d% f' B* E6 _/ r9 K0 [8 @CLASS "HexCalc"    //填写上自己注册的类名称
5 l+ |. B" n# S
1 s" Q/ v$ G+ V6 m! ]$ ^+ i3 kCAPTION "Hex Calculator", V5 @7 U0 l; K# @$ l2 i

$ o/ B( s; V- L) G- e5 H7 D{
' k8 `4 S7 }/ m! a. R& f" P( `$ c7 t- t" Q1 N4 M
        PUSHBUTTON "D",       68,  8,  24, 14, 14& {( ~" v% D  C7 x6 q/ F
0 c5 `) S4 ~& P+ N( u
        PUSHBUTTON "A",       65,  8,  40, 14, 14
* p9 H7 }' a4 y$ b# Y5 O+ ]" E7 k5 u8 ~! i% M4 w5 b
        //各种控件, g3 U4 v% H7 o. t( c4 A

2 ]$ Q' q5 s! ]- E- E}
$ [4 F* J7 \" J" _5 f- p, u- s
0 z" L  P4 n' b6 \五、使用非模式对话框方式建立主窗口:. z; H$ N& N8 B, f
建立主窗口的时候,使用CreateDialog。
% ~8 ~. W4 S" L. k9 D5 y
hwnd = CreateDialog (# F4 i# S" w& q) x# o8 o+ a
                     hInstance,
" S6 k( m! ^; V* x2 a7 a% _                     szAppName,        //对话框模板
" ]' ^0 S* J: r+ X  x$ K                     0,
- w  B& n! m/ C; ~! d                     NULL) ;' g6 n  Y9 a. d
ShowWindow (hwnd, iCmdShow) ;
  U' W9 R& x2 R# Z1 n9 O" z3 e5 H7 c
其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。7 f2 Q/ }+ j* z* |* S( y. c; c
Ⅱ.在对话框中建立自定义子窗口
4 z8 e- O1 G# `* r  _' M4 J, E
可以自己定义控件,然后在对话框模板中使用
" _4 t, E& N& s3 ~% A. T  {
0 [0 o  ~* r& i# b' w 一、定义"窗口类"与消息处理函数:
5 q9 _! O; J. C6 \9 t5 z+ b7 j在WinMain中
% F& [  T4 J. W- w8 a  G除了注册主窗口类外,1 u' m- C1 m/ N, c+ B
另外注册用于对话框的类,指明类对应的消息处理函数
) ?. G# z+ w$ N. p9 Owndclass.style         = CS_HREDRAW | CS_VREDRAW ;5 k% n  f  N% n4 j# Y# w
wndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数% v1 z" S. i/ `2 u; s! t
wndclass.cbClsExtra    = 0 ;  t) k/ S. }! z+ H* I
wndclass.cbWndExtra    = 0 ;7 W3 t4 u  J5 B, s7 Q* W
wndclass.hInstance     = hInstance ;
1 W- j9 `% g; S1 pwndclass.hIcon         = NULL ;
' Q8 b8 c( k4 \" \( S, Bwndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
( [/ M! I3 ~' @0 i+ V: ]wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;6 V' P$ g5 P' h, n" h
wndclass.lpszMenuName  = NULL ;  Y' X) |1 S6 X) @
wndclass.lpszClassName = TEXT ("SomeControl") ;
2 E2 h1 t9 {& o# Q% hRegisterClass (&wndclass) ;  O+ T! _' f( r# `; E% e# y

+ v2 Q. V% P9 z! ` 同时,还要书写好消息处理函数SomeWndProc。 - P$ Y9 U% G7 \& A1 [- o& H+ ?
二、在对话框模板中添加自定义控件窗口:' v& k$ _! u# z5 w% T$ G4 W9 }
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。0 }# Q* \( @+ r0 B, f3 w
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-8 20:22 , Processed in 0.034752 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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