找回密码
 注册
查看: 3806|回复: 0

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
2 G, A" H& ?" s2 L' t
) z5 [! z# U* j( d一、概述:0 o0 [6 f6 K" X3 r. |( h, y5 I
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。0 ~$ L) a% R7 C4 ~
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。. S9 Z; U2 Z( n8 {# T9 x7 o

' k. v/ b3 q/ S! ?" s" C我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
( Q. }: G3 o# l  D7 Q: d. e9 L* Y但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。) L3 @$ X" A( s7 x2 Y% V7 ]
* b/ m1 O3 O) W. D2 O' I) n
二、书写一个“真正的”窗口消息处理函数:
2 V3 c& U  G& k: ]- {6 f  j按照普通窗口的方式书写好消息处理函数。
- N/ E4 O8 m& |$ Z4 l(不要漏掉了DefWindowProc)' o3 d6 e9 j0 o. j* A: ]: J: P) f
# v* |; h( g( r# y" Q
三、注册窗口类. w! K* o0 j: z+ c9 ]+ Q
用书写的消息处理函数注册一个窗口类。
% J0 K; n+ J/ `. A0 v; b( v
6 R7 a0 z# i5 Z 四、建立对话框资源,指定窗口类为自定的窗口类。3 A5 q/ L5 T2 E% {
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。" e' [" i( R/ K% A
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")
( a3 h0 ~7 ]- z* c; i" Y. _8 U例:
9 @' c: l, j; c3 [7 ]建立文件Some.dlg4 D0 s  f4 \, f# ]9 X
书写:5 A3 T4 c7 D' N  c1 s
HexCalc DIALOG -1, -1, 102, 122% X# N, |% s5 T, W
- |1 a* Q: \/ W8 J
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
/ P% O% B: L- N& s& K
* k3 T4 o+ ~+ x$ N" {6 L5 [CLASS "HexCalc"    //填写上自己注册的类名称
/ b4 K1 X8 `' v  C: |+ ]8 P- q' I$ p2 J
CAPTION "Hex Calculator"
0 k% V0 E9 }" u9 m! h8 X& d" v5 e0 A3 ~& p5 l- W. v' V! e
{
6 h1 `; C& ?2 F* G. _3 ]# y  Q
" C4 K! t0 d% ^4 [8 L3 s        PUSHBUTTON "D",       68,  8,  24, 14, 14
7 K: u& x! g; A
: B5 \2 ]5 A! v3 K  M# F% ~. a        PUSHBUTTON "A",       65,  8,  40, 14, 14
7 E& s# k0 t5 X0 }9 v3 a& L
5 \8 N0 i. o0 ]% W        //各种控件
! l' e) C. _& z8 n' }# h6 ]+ c% E3 Y4 T
}
) A9 c/ W' k* h" y* P
) v& y& e8 K7 ^* ~4 W五、使用非模式对话框方式建立主窗口:( c* d: [/ K7 a4 O; _
建立主窗口的时候,使用CreateDialog。$ I' L' s5 r" z7 ]" D
hwnd = CreateDialog (
3 {+ N6 ~. Q: o" R2 `                     hInstance,
" a9 M8 Q/ r5 C  S) L7 `                     szAppName,        //对话框模板& [6 |3 l6 M8 I4 X! [
                     0,
' s, M0 Z+ P/ y3 i! f/ ^6 e                     NULL) ;. n6 ^/ T( o  o6 F- p
ShowWindow (hwnd, iCmdShow) ;5 r3 k( d+ t8 R  }7 A9 ~3 d

8 `. X. e: `  t 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
0 s9 V2 @3 \0 t4 a7 h& p' z2 B
Ⅱ.在对话框中建立自定义子窗口
$ ^1 r, K  G9 X" h8 F
可以自己定义控件,然后在对话框模板中使用
# |% s( E9 E6 k8 K9 @" C. m# h+ X$ u, B
一、定义"窗口类"与消息处理函数:
4 l# a- f' A% K' K! ^# q  e, R在WinMain中1 d; ?5 b" G" e: Z, u
除了注册主窗口类外,4 g, J- c0 D6 Q
另外注册用于对话框的类,指明类对应的消息处理函数9 G( b7 }8 p" h) S
wndclass.style         = CS_HREDRAW | CS_VREDRAW ;7 J0 [2 x, I& c9 N* P  \0 J1 M; f
wndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数
6 ?4 |& y$ F" r; S) zwndclass.cbClsExtra    = 0 ;
$ R0 \1 j& n& V" y$ Lwndclass.cbWndExtra    = 0 ;" O2 A$ N; q$ D5 s0 M
wndclass.hInstance     = hInstance ;
7 }" R: F, K. E3 c6 Y6 q8 ewndclass.hIcon         = NULL ;, K- o3 Y! _- m3 W( o4 k/ Z5 g9 v
wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
+ y, t+ }9 |! S4 Pwndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
  e  j# s7 i1 I" v1 jwndclass.lpszMenuName  = NULL ;
2 s$ v' ~* s1 K/ [4 p: ?2 x# [' Hwndclass.lpszClassName = TEXT ("SomeControl") ;) x. x& o) g" g& I( f
RegisterClass (&wndclass) ;0 F! S; w: _, v
$ z3 B; w/ U' f' q1 a; |
同时,还要书写好消息处理函数SomeWndProc。
: X, Z, q: z$ h
二、在对话框模板中添加自定义控件窗口:
- h4 G0 d. U3 x3 ]  d
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
8 J4 m/ w; ]7 l5 G1 s- n- T4 n
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-1 21:53 , Processed in 0.016638 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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