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

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
+ f2 j$ D! c) e1 t0 i4 l; z) @* D$ D
一、概述:# B- _  _1 m0 Y
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。
6 w: A# \1 w1 z! o. U使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。/ q2 g7 Y& m% p: t
  B; n$ \) a( ~# a5 n
我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
4 F, x7 I% B( i但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。
) n6 Q* l) n* g' k5 m
0 h  S+ p/ Z: {% Y 二、书写一个“真正的”窗口消息处理函数:
8 Q& k% H2 O" L/ c+ |按照普通窗口的方式书写好消息处理函数。
  n. W5 o! |7 N: Q(不要漏掉了DefWindowProc)5 F$ Z- M$ z+ [7 p; K. m
. ~( ]7 v4 z# a( M" S
三、注册窗口类
$ f7 O2 W% h+ Q用书写的消息处理函数注册一个窗口类。+ r% ~; B+ i) ~( P
3 Y' t! k. X8 [% C, r2 I! G( e9 Y; H
四、建立对话框资源,指定窗口类为自定的窗口类。
/ p  e* t8 z  t( Z9 e$ l* l7 V4 W
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。' ~$ Z$ P# e2 A3 P" ?% a5 u, o/ `
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")
" l0 J  g  l+ ?8 x( i) a. k- q例:
5 w" \  a& Y2 e8 G" y建立文件Some.dlg
% M  q3 X6 B/ E! ?书写:
  ?* e+ U2 N( S2 I8 W$ [HexCalc DIALOG -1, -1, 102, 122+ z( H' X  P  |, K5 E. i% ]

0 w( T6 b7 L. U( E2 X# I" ySTYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
+ a; A1 ~0 T2 p* r, X  T3 k9 i1 L# l  N. L- F6 b
CLASS "HexCalc"    //填写上自己注册的类名称+ C2 L6 Z& \" H
  C$ H( P4 y5 U! s3 I. {' P% X& V
CAPTION "Hex Calculator"
7 Z. e$ |0 Z3 Q( D" D  x/ l( U* j# v' h) O  o
{& T. G+ @" A% A
0 b  X( z0 c; Q
        PUSHBUTTON "D",       68,  8,  24, 14, 14! t$ ]% H/ v! [$ @& G) f
6 f) G6 ~7 ^% z7 r
        PUSHBUTTON "A",       65,  8,  40, 14, 14
: d- l1 x% t. n7 Q
4 G, P" v3 U: w, u5 `( ~        //各种控件/ p: e* `* ~0 m. b- I

9 }" b: m; b7 o3 b2 {6 K% i( J2 }}
5 Z) E( g8 X3 ]# V- w9 |+ M% z0 k( `! X
* e/ f! R2 c1 k% i3 G五、使用非模式对话框方式建立主窗口:
* i0 ]. U. x1 }  a) d/ ]建立主窗口的时候,使用CreateDialog。6 b5 h- C/ o8 Q/ T
hwnd = CreateDialog (
/ K# m! m# }6 ?  n/ h  z                     hInstance,
) `" a1 k  ^" P. I. B                     szAppName,        //对话框模板
; p( ?6 f0 M* V7 e# m0 C% L; ?" A                     0,
3 c: e( t* s; Q' s. D, O' N                     NULL) ;
1 R4 |+ D" L& ?  @  Z% wShowWindow (hwnd, iCmdShow) ;0 ~, d. U  n" |
+ r2 N; X: }! k+ v9 s
其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
' O1 G" E3 ?/ y4 N/ f9 V
Ⅱ.在对话框中建立自定义子窗口

9 d  ]) i/ t* _) V) e5 B% J; v
可以自己定义控件,然后在对话框模板中使用
0 q; w9 G" X0 O( U# X0 z' f; `& m# h1 D3 C& O; b2 i3 d! U4 q! r$ Z9 A
一、定义"窗口类"与消息处理函数:! R) ~7 M( z( b* e
在WinMain中
% o. [6 w7 N% `& I! s. o# ?2 S# c除了注册主窗口类外,
7 ~2 ], Q" G" w7 N2 e6 A另外注册用于对话框的类,指明类对应的消息处理函数! \5 f( n$ H9 r' h: |$ q! r
wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
) p, I0 b* N# u. uwndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数
: e6 A* ^9 |( N3 Owndclass.cbClsExtra    = 0 ;6 L: D$ B% s9 T- q( s/ @9 q+ j* X
wndclass.cbWndExtra    = 0 ;
8 A* o# g% t% W2 K7 f/ Y/ wwndclass.hInstance     = hInstance ;
# c5 ^, |+ _* |7 Kwndclass.hIcon         = NULL ;
/ [4 e8 s" p6 i# dwndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
4 r" Y( {% o+ q# A3 r5 C' mwndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;7 S2 T/ W3 `  @; ]9 M
wndclass.lpszMenuName  = NULL ;
$ j* Q1 G8 t2 H7 p% n  m; M  pwndclass.lpszClassName = TEXT ("SomeControl") ;7 T, h% Q( P3 Z- ^
RegisterClass (&wndclass) ;1 ^! n4 B0 M# a
/ V, w) J, [$ a- Q5 Z3 E8 e
同时,还要书写好消息处理函数SomeWndProc。 4 u: w; Y6 J. o. N+ [& Q2 ]( E& X
二、在对话框模板中添加自定义控件窗口:$ B' g8 c$ E9 P7 r
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。( ~5 L7 D. y6 o" \% A  x4 t7 p  i
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-14 16:31 , Processed in 0.021136 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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