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

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
: Z0 G" V2 O5 }
: C; T3 k) p! `一、概述:6 @$ R8 @3 T. w) ]7 d; L3 ^7 K
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。/ A( s- D: v7 D: D" c! G/ j6 [
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。! s  L# t2 [! D  U: X% g

7 ?0 z7 u2 n/ P7 _9 |4 ^3 c我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。: ]. y6 o* f* q, [
但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。- \+ |5 H* M8 f$ `! n6 s+ \
' Y9 e9 _6 }+ W; ~, t* x9 R/ ]
二、书写一个“真正的”窗口消息处理函数:7 c2 P+ o4 I" M& f
按照普通窗口的方式书写好消息处理函数。
* g7 U- X' n4 c2 [# a. u3 r(不要漏掉了DefWindowProc)
) D0 K* V2 t+ j/ z! B9 h3 C
3 ~* w3 Z1 S. h" [! Z% ~7 w 三、注册窗口类
* {% J9 Q4 w/ E2 I" i+ i用书写的消息处理函数注册一个窗口类。
3 d2 |& l' H1 N- O
- C% l  t: k" Y; b- S$ q4 {1 n 四、建立对话框资源,指定窗口类为自定的窗口类。
: b$ ]6 w* g2 M$ v7 T! J5 \) o5 k6 e
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
8 q0 A  @. w. c3 h; C" C(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")
3 p$ d) \/ y+ U8 L; o4 A! D例:1 L4 K# y- }. ], O  V3 p) C' D
建立文件Some.dlg
! A: u% ?8 q% j# K; E6 L1 `  x5 z书写:( g  `5 m8 s4 c& m' j
HexCalc DIALOG -1, -1, 102, 122
- N8 @; I/ _$ ^$ m4 J9 h7 y( W7 D
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
: X. k+ ?; j+ k" u  A  ~  |4 i
" ]' [7 E7 J) F4 k* [CLASS "HexCalc"    //填写上自己注册的类名称* a, i5 o4 W! p" m  P9 n
* C, b2 T! C5 K0 k4 u( t
CAPTION "Hex Calculator"
. P8 l! @4 y3 j$ j5 D& e  x% n) [7 K- T2 v' e6 q7 z; G* c6 w
{( b) O, ~5 M6 L5 t  j$ x( P1 G" D
0 R! b$ ]2 V3 c- `; F. L
        PUSHBUTTON "D",       68,  8,  24, 14, 14+ c% B4 o$ \" H. f0 |
6 G8 y9 N, c7 r9 W. W- U9 [
        PUSHBUTTON "A",       65,  8,  40, 14, 14+ q' ?7 @7 v; n' c: u5 v% @

! D+ s7 d  ^' k7 t; f; h3 a. S        //各种控件
9 b4 {. R/ @0 P# v) @2 d. ?) k; m" _$ C0 L2 V; _# `+ S2 a: ^
}
- G6 E# x4 T! K1 g. J* |* P, S6 T' W: k2 `5 G0 b
五、使用非模式对话框方式建立主窗口:
& q& v6 B" N7 I建立主窗口的时候,使用CreateDialog。
* S4 ?# [1 [  \- K0 x
hwnd = CreateDialog (
3 N8 X+ e2 ^. h# T  r% V, s                     hInstance,
3 v7 \7 w8 a( M) n; }9 Q7 C                     szAppName,        //对话框模板
2 O: n% p+ ~; x                     0,
7 N1 x" d  ]$ P, g/ g                     NULL) ;
1 t3 W9 p( v9 w% ]. g* f) T5 I( ZShowWindow (hwnd, iCmdShow) ;2 A: |# B% `3 ?
) ]1 L! ^+ I/ T1 M% o
其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。# E2 k6 Y& V: z; W- V9 J2 |! d
Ⅱ.在对话框中建立自定义子窗口

7 ]# P- H9 f$ r- ~
可以自己定义控件,然后在对话框模板中使用
5 g) B! t# N7 R8 @( _8 A& S0 M1 l2 f/ r; j$ x' R
一、定义"窗口类"与消息处理函数:
' t; z4 p: D7 s  S1 F  j# E在WinMain中
# h% d4 X; T+ [除了注册主窗口类外,
2 H6 E9 i- ^5 _, O& N- I% O; x2 o另外注册用于对话框的类,指明类对应的消息处理函数
- H  m- e5 N3 w, ~4 x/ n! ~wndclass.style         = CS_HREDRAW | CS_VREDRAW ;# R/ ^) ~" c5 t1 G( i
wndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数/ n4 \! y, Z* C$ `
wndclass.cbClsExtra    = 0 ;
# B( K& ~! S7 z4 Fwndclass.cbWndExtra    = 0 ;* L' k1 X3 E9 V  Y7 K' u4 p
wndclass.hInstance     = hInstance ;
8 J+ |; ?- S+ W/ F6 k6 I* H  ~wndclass.hIcon         = NULL ;
/ G/ i7 Q( x9 n# lwndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;7 S- v- g$ I8 m! S! q9 R9 n0 m2 s
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;6 W( D( v* r/ ]/ T+ S
wndclass.lpszMenuName  = NULL ;
" u/ i% z/ U# U# _1 u( _wndclass.lpszClassName = TEXT ("SomeControl") ;: F0 V' e0 I7 ?0 w& ]! p: A
RegisterClass (&wndclass) ;
, C. z' S/ g' |- `7 K* Z5 H/ h. ?6 J5 I
同时,还要书写好消息处理函数SomeWndProc。
2 }5 w1 _) V+ R. j* S9 ^) b. V! m
二、在对话框模板中添加自定义控件窗口:% S/ L$ w) y! q: x
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
$ {. R- ?" U# M
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-5 00:03 , Processed in 0.103026 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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