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

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
. T4 D2 K& c( e6 q
: c; [* |/ b) ^. b7 x9 K; U1 H一、概述:0 G% Z; F, \1 b$ E( K: a/ R6 P
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。
  z" v) V# S7 ?- v" G: @( |使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。
& o+ S+ \# k5 W8 ?+ t' L& p0 X4 a6 Q# z4 P7 i1 `
我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
* Q7 Q( V; q1 ^; Z  I7 k5 P, J但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。
: C/ g, \6 t6 N, W# B7 ~3 t# S! P$ B4 q; ]* k
二、书写一个“真正的”窗口消息处理函数:
- W7 |& J+ D- ~3 v0 i按照普通窗口的方式书写好消息处理函数。
* `  f/ e! U2 A# V3 q2 ]8 I/ }(不要漏掉了DefWindowProc)% Q4 H9 R2 V9 l% Z

" T$ l* e" G0 V, i1 ~& f, f 三、注册窗口类2 @: [+ H$ V& c) y
用书写的消息处理函数注册一个窗口类。6 T* J7 b5 d- }
5 {2 k0 Z2 T1 s6 T- Q
四、建立对话框资源,指定窗口类为自定的窗口类。
+ C; d( R4 ^' ]& a7 `8 D( A5 H
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
# |- B4 H4 T, L(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")
3 z) B- o- t, M例:
% u- l, L% m" i% X5 v建立文件Some.dlg1 C! P8 _& \. M0 y7 n2 p* G
书写:
* T& l4 S. V# Q% Q" P' Z: ?HexCalc DIALOG -1, -1, 102, 122
  B% d9 K3 ?; @- K3 N+ o! B  L' [2 V* c; \$ a3 {. a
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
; X! c2 }6 M9 K: Q% \6 ~. N4 h: {7 j5 N0 u$ H4 L  m1 f0 V  k# `7 p
CLASS "HexCalc"    //填写上自己注册的类名称
+ T9 u& v" q& i: a( X
1 [7 W/ ]$ o- ]0 D9 B/ x3 HCAPTION "Hex Calculator"
/ |" w' h' \: Q7 _( ~
1 F* z- c" A+ j" J3 t- P# S' U{
+ X0 C0 a) H$ f% g$ R) p5 e
8 m& f( s" Q9 p8 a. ^        PUSHBUTTON "D",       68,  8,  24, 14, 14+ ~) ^* n; q3 r  B

+ g% T6 Q6 m: t2 R% q7 \, f- Z        PUSHBUTTON "A",       65,  8,  40, 14, 14) F- h/ G) F+ ~  Z6 }

4 M# X9 C& E/ ~        //各种控件
! d" {1 c6 u0 V
: I& W( `+ z  m}
6 a2 }, h# o. ^% M8 m$ m
" g) |" j; i. ?五、使用非模式对话框方式建立主窗口:
) Q. n2 q1 S1 Q7 t4 r建立主窗口的时候,使用CreateDialog。- C* l& x) S" H4 }; a
hwnd = CreateDialog (, h0 O, _9 |" ^7 `6 J
                     hInstance,& x2 A" Y2 |6 n% f0 o! _4 E
                     szAppName,        //对话框模板- H8 Z0 H: M& D7 F7 r
                     0,4 D2 F! R6 A/ z4 w) l- h
                     NULL) ;
. J1 d- r- V$ sShowWindow (hwnd, iCmdShow) ;& X5 Y  |7 ~! i6 b2 F
0 k; y1 R2 u7 @. u
其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。+ y$ }! {/ S; i7 o
Ⅱ.在对话框中建立自定义子窗口
& g: @5 }, }9 x7 n& R3 C
可以自己定义控件,然后在对话框模板中使用* i  }9 `% D+ f+ Z* o9 y
' d. g# j6 Z8 F8 G
一、定义"窗口类"与消息处理函数:$ A) P- M: M8 K) |# I; S( {  u
在WinMain中
) U! |6 G  h) m* w1 Y* H" b. O4 v除了注册主窗口类外,( `5 Z( ?8 W+ @9 n
另外注册用于对话框的类,指明类对应的消息处理函数
$ z" \$ Y# k# K' Q0 zwndclass.style         = CS_HREDRAW | CS_VREDRAW ;+ d' H2 S% ]) D' H8 M$ u. O9 n
wndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数
: o! j6 P/ D( d6 k  p% owndclass.cbClsExtra    = 0 ;
+ C2 d8 z% q; s# f# G- Twndclass.cbWndExtra    = 0 ;) }6 T4 k* ?- K5 E
wndclass.hInstance     = hInstance ;
- f) E" S; v$ f* s0 p: ^/ Z# twndclass.hIcon         = NULL ;% j- K7 Y3 m, ]9 C  W# b8 t5 J
wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;( @0 l; L9 j( [* _2 Y0 x
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;, o5 z  s- M4 }7 v: X# H2 ~
wndclass.lpszMenuName  = NULL ;
% u* n7 b4 y3 n1 e& V7 jwndclass.lpszClassName = TEXT ("SomeControl") ;& V0 a) H3 \, Z8 b# j
RegisterClass (&wndclass) ;
1 p+ N* g0 S! B0 _6 V4 f6 s' ~5 W
同时,还要书写好消息处理函数SomeWndProc。
7 ?% }* P- w) h
二、在对话框模板中添加自定义控件窗口:
5 E- a# i0 k/ L
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
& l/ o3 A2 ^1 v. W0 z
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 08:53 , Processed in 0.020289 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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