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

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
1 Y8 q5 b1 |* Y8 ]5 z. R# P( V# S! L
7 i5 Z/ M" X& i! ^  G/ j+ l一、概述:' b/ H% ?1 j7 b$ Q0 }; m
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。) W' N! x. u) T
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。
! z! X3 m; v' K" u3 C( R  K9 y& D: w6 f
我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
6 Y8 ?7 \: D6 X$ I8 ~, l但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。& u% F* [: L6 T4 k/ w: b3 R
" W/ @2 @$ l0 g
二、书写一个“真正的”窗口消息处理函数:# e6 t# M0 _: U! B- l
按照普通窗口的方式书写好消息处理函数。
' M) k3 X- y0 M5 y! X  D- G" }  ~(不要漏掉了DefWindowProc)
# n/ M3 _+ U$ ~
! n7 y/ E+ y8 w 三、注册窗口类
: ^' U' S1 ?' y- i7 [用书写的消息处理函数注册一个窗口类。( N3 D& O6 j2 G% o$ s' }
; L+ E# a: ?$ o" U3 I4 t  B+ R
四、建立对话框资源,指定窗口类为自定的窗口类。
3 v% ^8 Y# f& V. h( W: t0 B# o" z
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
8 U; `" P9 p, W# t8 G) T- Y(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")" J5 ?( ^5 ]/ _5 x" d
例:
& f! U1 J9 u, Z4 p建立文件Some.dlg5 q5 Z4 h! W8 a, k3 }; H
书写:
8 A2 U3 `4 F( ?8 S% E5 I. DHexCalc DIALOG -1, -1, 102, 1223 p( ^3 o+ K4 n6 r& F/ y6 L' W

" p# y3 c4 x5 ]4 N, kSTYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX+ s  }- Q# _$ I( d
5 H$ ]- W6 E6 F' D: m$ L
CLASS "HexCalc"    //填写上自己注册的类名称6 M0 b4 w6 e& W% Z8 u

- m1 a( Q7 u. JCAPTION "Hex Calculator"* k- W3 }/ W* S& n6 F$ r* v
; m6 ~! A+ _8 p- ]
{2 g% y, }4 Z* s7 V6 K5 C6 w9 O

) ~4 S& i* o$ a6 e( v- Y        PUSHBUTTON "D",       68,  8,  24, 14, 145 A* B9 R2 D9 O5 m9 E
2 G$ {* l7 o- A; F* L: Q/ _
        PUSHBUTTON "A",       65,  8,  40, 14, 14
3 S- Y: G( D3 p
# n6 O0 z" H3 x" g* Z9 E        //各种控件" P" {9 U" V1 @

0 @7 t, ?+ L- k( G  y. {}
$ n. Z+ z! `+ E7 s4 I9 a7 j6 t: j# t: k- M; {2 e. J1 g
五、使用非模式对话框方式建立主窗口:3 ^8 |1 Q7 o1 s7 R
建立主窗口的时候,使用CreateDialog。
5 D6 M; x$ w* Q9 h* f, L+ Q
hwnd = CreateDialog (0 K, V9 j  L9 c2 v1 {3 W
                     hInstance,6 O+ x1 u7 B. F' i- l
                     szAppName,        //对话框模板
, _8 Q, [; G9 T: }9 A0 Y                     0,
, y# Q# b2 L" g7 S; Q                     NULL) ;
! I3 V; o+ B! WShowWindow (hwnd, iCmdShow) ;' I( K4 x* S$ r/ \

7 ~6 g3 A. x- l9 b7 w- e0 _% }# H 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
5 y5 |4 {! r$ n. R& ^9 T! }( I
Ⅱ.在对话框中建立自定义子窗口
3 ]9 J5 i- U7 d2 n6 B( v
可以自己定义控件,然后在对话框模板中使用9 Q8 l; n* d! M& e/ J! e) h5 N

) M& d8 Q, I0 t( y# h 一、定义"窗口类"与消息处理函数:& O1 e: Q! ?5 Y- \
在WinMain中# b8 j/ X/ L5 f# z, M1 ]
除了注册主窗口类外,$ _$ t' j# N" F3 U6 T& c7 H6 F
另外注册用于对话框的类,指明类对应的消息处理函数% K* v# \* M9 d: m2 V
wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
( _- O; _7 c+ Hwndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数
7 N2 A( A* [' q8 x4 c" q% qwndclass.cbClsExtra    = 0 ;# G5 f) L4 c% n) V4 R* v8 c8 M
wndclass.cbWndExtra    = 0 ;
; w9 t4 W! B) iwndclass.hInstance     = hInstance ;
8 U/ B! ~9 M8 w& xwndclass.hIcon         = NULL ;
# p5 ?3 i) k5 \' ~( C  owndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;0 s9 `7 n) b2 c: B. S
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;& ~: u9 X. }. l& d
wndclass.lpszMenuName  = NULL ;
4 Z5 M6 C, w1 G" I3 g. twndclass.lpszClassName = TEXT ("SomeControl") ;
+ r; s" G2 f) q8 D+ f! ARegisterClass (&wndclass) ;; Z6 p) c' s6 h( h' I! F/ b

6 _) T  ~  ^1 q# ?. | 同时,还要书写好消息处理函数SomeWndProc。
0 f+ ?4 d: K% H7 G2 Q! N9 ~! a
二、在对话框模板中添加自定义控件窗口:4 U; w. _/ t0 s9 W! n+ D& x) ~8 M
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。4 R( h% x4 A' E- D
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-4 23:16 , Processed in 0.014142 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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