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

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html8 r" n# g. N  a& {, t- t
: B1 Q6 x# {" t5 g% q9 r
一、概述:: F8 E/ A0 z& J$ U6 L
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。- q, _4 Q6 Q5 d( S
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。$ Q6 ?( B& B. T8 I; x

. P$ Y0 a2 o  [% Z, G7 o7 q: n我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。6 D- v' U+ u+ I' y
但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。/ O" k) v" p* ]* J0 z5 a" }: X7 ?
! M# d* ?( t1 I( Y
二、书写一个“真正的”窗口消息处理函数:
4 `8 C+ V# v# m- Z按照普通窗口的方式书写好消息处理函数。
! y" |4 I# E! o8 d(不要漏掉了DefWindowProc), r/ y+ y( A9 [7 n  j% G0 R1 F/ O

, b3 q2 X% g. F* d- U" M. u 三、注册窗口类, [0 w& ^6 @$ W) J9 ^  m! p
用书写的消息处理函数注册一个窗口类。9 J& _9 I: h& E) Q4 }- }2 W: t

4 F; @! G$ p& n0 i 四、建立对话框资源,指定窗口类为自定的窗口类。7 x* B" \" }7 V6 m  ]
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
  G6 {  k% r: C9 }" b5 u3 t7 M" @/ d(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")
" G# v6 s- I7 `例:
; q% o, h$ j+ L+ q( D建立文件Some.dlg
5 v' ~. ^% X4 _2 o7 N; L6 {+ y书写:
% G2 e9 n0 W7 r( FHexCalc DIALOG -1, -1, 102, 122
! @0 F- X* y; x6 \' A" g) R# [# [7 T. R* a7 i
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX7 @6 `0 v: x/ Q1 x
' ]! y' O- Y1 J5 _* Q
CLASS "HexCalc"    //填写上自己注册的类名称" T! M) X5 @+ \6 N. W4 |5 u* k! }

2 L. O- V+ m3 d4 _: h  ZCAPTION "Hex Calculator") s0 e( G8 k  z0 S9 h7 Y
1 d9 w7 _2 d6 b: |8 B
{8 q- J  `- W. R. F. `& ~4 {2 Y
/ A) G" h" @3 }+ E2 ~
        PUSHBUTTON "D",       68,  8,  24, 14, 14
6 Z7 B9 s8 ?* t4 i# Q, i3 n  y9 e
- o" v; G* L0 J* v; n4 G2 R! |        PUSHBUTTON "A",       65,  8,  40, 14, 14
1 p: U2 T2 [2 }
$ N; \4 r3 Z& A+ M" ]8 X: k0 T  n        //各种控件
" r5 C' F+ T8 Z: Q- K6 V6 G8 W& }: b! H# g
}
2 {3 t) N; }6 P5 ~
7 E0 _0 X. H2 e五、使用非模式对话框方式建立主窗口:
" @  O  D& i9 |7 k建立主窗口的时候,使用CreateDialog。
  _! z9 ?3 y3 x# O5 e
hwnd = CreateDialog (
' K: r& M7 [0 ~3 I) T                     hInstance,
1 A& ?4 l0 k3 h, z$ U# e0 r. E' R$ r1 r                     szAppName,        //对话框模板
7 a, }" a5 N7 B4 M$ |4 {: Y$ Y                     0,# j3 o- n+ `7 n- k) l8 I2 u' F. F
                     NULL) ;
( a. S" z9 O: y0 J* f0 }) Z- ~1 SShowWindow (hwnd, iCmdShow) ;2 q: v! i+ z! x' `4 g3 d

  K) [1 [0 [- ~8 a/ s  I  H9 @8 w 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
& G& F  C0 R  D. A6 F- ~
Ⅱ.在对话框中建立自定义子窗口

/ D) v+ {% X. {% X. e
可以自己定义控件,然后在对话框模板中使用" Q8 p9 _0 ?. V/ o, o/ L2 i

# x# E8 [: c- q3 N% Q6 R, S: {3 j 一、定义"窗口类"与消息处理函数:
1 d$ d. D! i) m; |( X在WinMain中7 n4 X7 r: c2 t: s9 X  B
除了注册主窗口类外,
) ~9 Z: Z: A8 Z4 N另外注册用于对话框的类,指明类对应的消息处理函数* Y# b, ^% G9 \% m- q" z* Y
wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
! w# T5 w* ^" j2 L2 k2 Dwndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数3 X8 V; t' k7 D1 V0 J3 B1 {8 f, T% w
wndclass.cbClsExtra    = 0 ;
. d9 E/ V) i  X5 j3 V  O4 [wndclass.cbWndExtra    = 0 ;) m- g/ G( m  ?3 {6 Q  G
wndclass.hInstance     = hInstance ;
) T- d8 w( F* y0 Twndclass.hIcon         = NULL ;
2 M/ t1 @5 j2 E% U% P( wwndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;/ R8 j% E# c/ P
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
8 ~* w. r7 K! l9 f% _; c& [& Fwndclass.lpszMenuName  = NULL ;9 O7 ~# y7 \' m" t7 H: y
wndclass.lpszClassName = TEXT ("SomeControl") ;/ O. J2 y  v+ V7 B* A
RegisterClass (&wndclass) ;
6 {) H/ B" K9 v2 ]7 r" Q( N0 D
% o$ Z9 c7 y+ ? 同时,还要书写好消息处理函数SomeWndProc。
! T4 }: J9 q8 I! ?: i  I1 q
二、在对话框模板中添加自定义控件窗口:
7 Z' R# v4 h; [, M( {
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
7 \- _7 u, c, f9 p
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-13 18:59 , Processed in 0.018666 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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