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

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html9 b! a2 S6 S3 N$ y! C4 p

: L9 u( N& w. H' q& m+ K' H一、概述:) l4 k6 `: u8 X
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。
  @  t' B+ T3 _3 b使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。
2 P1 j. e9 X- w% ^9 ?, [6 M( p9 c; s# ]- e3 `9 \0 k0 f' S+ l% E+ V
我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。) h% r  S) \) B% n/ X# W9 e: O
但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。
, _' ]* d6 E6 [; F8 b& C
7 _9 g8 o* y8 ] 二、书写一个“真正的”窗口消息处理函数:
: g" W7 t. T! |0 E/ `9 m按照普通窗口的方式书写好消息处理函数。" \+ Z, `" p8 u1 G6 a" c0 S
(不要漏掉了DefWindowProc)
) q" `% a% o. n. f  R, _0 c  i
/ o( p, g# C+ E6 O: U8 y 三、注册窗口类  v6 w$ t+ Q3 |; z% S& S
用书写的消息处理函数注册一个窗口类。
! j, W& i9 g+ V0 k' V7 y3 ?1 D3 a8 n' k; T! ], ?
四、建立对话框资源,指定窗口类为自定的窗口类。1 t, U! t! q/ t0 v- [
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。1 s0 L+ @5 B* D  }8 p5 J
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")/ J* o# m' I: @  a4 J9 k6 B+ x) [6 C
例:
& h) a' |- ~9 |, A8 B* o  D. i9 T: @建立文件Some.dlg; m( a' A# X( I* i* Q# Q5 X
书写:8 `; l+ p* C0 d( P
HexCalc DIALOG -1, -1, 102, 122
3 o: @5 e/ B7 \- N1 ^" e) _& o! d5 ~" i; _- l
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX' v8 t) o0 d' b& J

) |6 T# L, p" K0 I3 p* z4 N1 QCLASS "HexCalc"    //填写上自己注册的类名称
. K8 q3 M& Y" m: Z$ }7 n$ O0 c2 }, f0 x: i  d; B+ F
CAPTION "Hex Calculator"/ w& A6 ?) r; c/ U) A+ @7 }
( O  p! Q* V4 y: ?& l$ p
{! N! X2 l- l; n$ C

1 q* Z" H4 P' f1 \( ], E  U        PUSHBUTTON "D",       68,  8,  24, 14, 14
: s+ |/ r7 B% F: r% |8 ~' k. w" h& N5 D) d
        PUSHBUTTON "A",       65,  8,  40, 14, 14
% Q1 d, k2 U$ ^. I+ d: I0 g
6 i3 a+ Z7 ]1 x! s  g        //各种控件
% e) e* D6 b. A, E0 y+ U& P4 X( o: L
}
1 {" P* [. t( Z0 V4 b( T0 o$ _' r6 Y& N; c  O8 M
五、使用非模式对话框方式建立主窗口:) m7 T  D! K7 f+ _
建立主窗口的时候,使用CreateDialog。
+ B: {* B# _2 l; R# r0 K' r7 |: `
hwnd = CreateDialog (. i3 ^6 a: u3 {
                     hInstance,
- {+ O+ Y6 ?; B8 q! S( T                     szAppName,        //对话框模板! [! @0 ]5 t, d7 J2 w
                     0,
" p9 d  _/ b' A) Z) o" k) H3 z( H                     NULL) ;
0 f7 m+ V& l( n3 h4 n9 i, c* ]ShowWindow (hwnd, iCmdShow) ;
! Y4 S0 n' M' v4 W7 F5 c& v! w+ T! d7 a' L0 T3 z
其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。$ T" }9 s  t& l+ I; I
Ⅱ.在对话框中建立自定义子窗口
  W8 ~( V& r/ `, ]1 L) y" Q4 G
可以自己定义控件,然后在对话框模板中使用% \- O# T1 U+ @7 n3 q  z( M$ Z  t( d

7 A. a3 x7 A1 s( t# ^ 一、定义"窗口类"与消息处理函数:
% u2 m) ^3 e5 p在WinMain中
, `3 Y; U! P7 ^7 i$ L! ?- g除了注册主窗口类外,# h0 \0 y3 O. c0 a0 _# D! _
另外注册用于对话框的类,指明类对应的消息处理函数
0 O0 H1 \0 ^- s7 J# n5 Ywndclass.style         = CS_HREDRAW | CS_VREDRAW ;
+ y- @7 y+ Q" T% Owndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数
( K+ n. k' K/ W0 M- K* B7 kwndclass.cbClsExtra    = 0 ;
" {. E8 ?5 I2 Z/ twndclass.cbWndExtra    = 0 ;
1 P) ^) x- v! \  Pwndclass.hInstance     = hInstance ;
4 C% f+ s# k- W: ywndclass.hIcon         = NULL ;6 s# u/ @+ n' U9 z) L( ?
wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
% Z3 F- ^: o( {wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
% U" k% _, {' M3 N) e8 I9 Rwndclass.lpszMenuName  = NULL ;$ A; M7 b& R8 u; `0 R( x
wndclass.lpszClassName = TEXT ("SomeControl") ;
1 X$ {; Z7 C! ~5 k! x/ TRegisterClass (&wndclass) ;
0 p; V1 D. n4 c" I  Q: p$ V& M. y0 a
同时,还要书写好消息处理函数SomeWndProc。
  p2 w/ T7 ]& m5 ]" }* A
二、在对话框模板中添加自定义控件窗口:
, _5 L( p  ~+ t9 l6 C7 {
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
3 I$ F4 X, [9 Y8 Q7 y3 }- a; j
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-9-30 10:40 , Processed in 0.036088 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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