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

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
9 x1 s" T8 ^7 a  |4 O, S$ R, K/ ^3 A# @# e
一、概述:7 l( q: ?1 x) k2 J
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。
: K# b0 O# e; K6 B3 j使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。( f( s1 m& d1 U8 D; u

! h1 h+ J1 q' h, g' k1 s- U我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。  ^4 v: s  b+ a/ E* b
但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。! o/ h0 e2 @, z: e" @2 `! R$ s
( ]  _$ i+ J( y: `
二、书写一个“真正的”窗口消息处理函数:$ F% y: p# B2 S- H: b
按照普通窗口的方式书写好消息处理函数。
% G' [4 R' p' R. v& p- d(不要漏掉了DefWindowProc)# Z3 i. A! R! K. ^
6 R0 H3 S, \2 R1 f1 G) a& M' m( r
三、注册窗口类' u5 ]+ n3 w5 h) \7 {
用书写的消息处理函数注册一个窗口类。+ l7 q# s/ v. J

! v2 Y) l% Z: R5 R' ^ 四、建立对话框资源,指定窗口类为自定的窗口类。- [1 s# g% g4 P1 K8 `8 k
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
4 M; ?; j8 L6 @, b  n" z(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")
! P* x3 Y0 v2 M8 [! }例:
/ ?+ z: \! d: G9 |4 @5 W2 J6 O建立文件Some.dlg% z; F0 Z) O' ~/ ~7 T
书写:. I1 K3 `) N9 v  [! M
HexCalc DIALOG -1, -1, 102, 122
$ }  b. Y) M8 k: P2 N9 G0 Q& N* T
& }* n. w% m' {. ^8 CSTYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX( o5 u; z% r& M! U5 o3 _
: l5 }# c6 \' i
CLASS "HexCalc"    //填写上自己注册的类名称7 x+ S* Y; O" ]5 c; i; d$ _5 o
- _% d9 G  ]& K8 b8 i( l2 }- i' y
CAPTION "Hex Calculator"
6 V$ Q: N6 |  K% j
' m4 X2 g" [7 m% j, I{$ h( V( b. o" v" A; i: G

% t8 u$ n) L1 b3 V8 K/ s4 f4 v        PUSHBUTTON "D",       68,  8,  24, 14, 14
! U1 D2 e2 D$ S* {6 M, n: Z- Y2 d" r
1 t9 w* Z% P/ a        PUSHBUTTON "A",       65,  8,  40, 14, 14+ A+ b3 @' E' S! i

! Z. S" ^: K( C8 m        //各种控件
, L4 |! l6 _  A: G; T  p8 G- i( r; }
1 y& O4 E' i; X- J} + r8 Q$ m: ?" K, O1 B# y8 C* m
4 \7 ^  B  [2 s
五、使用非模式对话框方式建立主窗口:
3 s, K( G" W! }& |建立主窗口的时候,使用CreateDialog。- y* m  M9 ?7 P0 K' _$ C, I/ }4 k
hwnd = CreateDialog (" N' \. q8 M( F, H# w
                     hInstance,
' o& W" ~7 {7 J& C+ V: E( Z0 U                     szAppName,        //对话框模板) E9 s+ |9 S5 @2 m* a5 F( j# E" N
                     0,& `3 n/ I6 Y, ?; ~
                     NULL) ;
. |+ b5 ]; G/ _# J* g: \& \9 zShowWindow (hwnd, iCmdShow) ;; d+ T) \! e. G& u$ P& }

, @- Q& P5 }% b 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。# V6 a( ]& X7 y
Ⅱ.在对话框中建立自定义子窗口
0 G4 s6 l" E  Z2 h, }: S: y$ B
可以自己定义控件,然后在对话框模板中使用
& U/ C1 H& D& t) r4 [- V$ H9 B) J- k6 B- u7 f
一、定义"窗口类"与消息处理函数:
; J# q2 Y& c/ M( O/ ]1 @在WinMain中1 d- {$ E2 ?! ]3 V, N
除了注册主窗口类外,3 _) Y0 |2 h3 T& s0 j4 ]5 U
另外注册用于对话框的类,指明类对应的消息处理函数( {" y; d0 o0 M# m7 d+ G2 s
wndclass.style         = CS_HREDRAW | CS_VREDRAW ;, A' A0 B- _+ F) C. f1 |
wndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数
3 Y0 l1 g) p1 X% x3 C1 hwndclass.cbClsExtra    = 0 ;7 T0 ~) n2 y" \0 B, }3 l4 t: s8 ]
wndclass.cbWndExtra    = 0 ;
2 M! A+ _' g1 {/ X7 V, Q0 N3 Y+ c+ _wndclass.hInstance     = hInstance ;
; A3 C  ^$ M: c( M/ a1 N9 hwndclass.hIcon         = NULL ;
- w' G. i! f- v" Ywndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;$ _4 x* N8 A0 c4 j" n
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
& h- v7 ]+ z( N' G" ~wndclass.lpszMenuName  = NULL ;3 C' h2 |' w" T% D3 ~% d& c
wndclass.lpszClassName = TEXT ("SomeControl") ;: @2 B7 e" l  a4 D/ D
RegisterClass (&wndclass) ;! Q* J' ^8 a2 Z8 e: M- F

- H% U8 K2 _% I. E$ s1 g 同时,还要书写好消息处理函数SomeWndProc。 5 Z6 E  Y$ p, Y5 y
二、在对话框模板中添加自定义控件窗口:
# K. r/ q  U" i+ R1 X! h
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
( Y  a1 ?2 l4 w5 K# _
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-8 23:20 , Processed in 0.033725 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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