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

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html  U" M' {; D( u  O6 y5 W

7 h' t) }1 k1 y0 l" K一、概述:
1 d- F, j7 ~5 _8 K在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。, o, p( ^# d# x0 I
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。8 `' w" S# l  B( j1 @6 q  v- u

9 _# C( Q1 Y* `2 p$ g: S9 l我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
. J* Y. h6 ]# Z3 p) }但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。" b1 R8 k- v0 d  k2 B$ r
. o2 R+ x) n8 D1 ]7 ^# U7 M
二、书写一个“真正的”窗口消息处理函数:
7 T+ ], g/ T% }4 i6 u* ^# p按照普通窗口的方式书写好消息处理函数。& ~/ U9 \+ e" {2 v& t+ p
(不要漏掉了DefWindowProc)
) v: z, M1 {: ]4 I5 g0 u# {
9 _$ T" M, o% i; T: J& F1 G7 q% i 三、注册窗口类
7 R3 D, e; u: f* A7 Q2 ~( _用书写的消息处理函数注册一个窗口类。, f' Q; N0 k/ D7 K; \* y0 J6 d

! s+ [2 y: H7 X. b! w' d/ f 四、建立对话框资源,指定窗口类为自定的窗口类。* L: D) C5 y; n( {9 O
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
% o& m" l- ]  o) s, [6 Z(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")
; ^$ G& _/ t! W" L例:0 j% N& \+ t( o1 @5 J" Y3 q# A: }. B: y
建立文件Some.dlg% h: S: a. A. _4 h
书写:' l3 \; H( A7 W) o/ ~
HexCalc DIALOG -1, -1, 102, 122
, u( B; m- r6 W" V5 C! r0 C  \1 ?7 s" T+ v& q
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX' O( D" n& V5 w8 L4 l- H$ D
# p- d9 m  _- j" S; ?' V
CLASS "HexCalc"    //填写上自己注册的类名称
9 O! g/ J* n% l2 X/ \# ~! `* N4 I  l+ J0 e: u0 l! p
CAPTION "Hex Calculator"
4 S% k/ n- U8 A6 Q5 L2 t3 \8 Z6 g2 h
{
" J5 D2 a2 o8 X
$ I6 N* {# G: t4 H+ h* T        PUSHBUTTON "D",       68,  8,  24, 14, 14
. a! q; z: k9 N3 B$ j) Z) x5 X" d. a# K: d7 @; K  M
        PUSHBUTTON "A",       65,  8,  40, 14, 14
& T. ^. s) x- n% Q0 U; [) O2 f/ E7 T5 C% s% C$ z3 p" K1 j1 U
        //各种控件( h- m7 n8 L$ W

: r) I/ |; o  g# }& j} 3 t9 W# X% r! K; O

% w2 x3 P: u; D& q# ^) D; D! K3 s2 T. T五、使用非模式对话框方式建立主窗口:
' E, Z- B$ Y6 {建立主窗口的时候,使用CreateDialog。
* Q. V9 {) o" J% k3 ?
hwnd = CreateDialog (
! A4 V( Z, }. v                     hInstance,
* S2 H7 a8 f" v3 i& s' _8 m                     szAppName,        //对话框模板# _$ n5 @4 o, K5 ?" @4 g" Z! U
                     0,3 y7 b' C' N1 A/ R4 B8 O; _, W/ k
                     NULL) ;
& U7 }+ R- G' s: i( M, f4 e2 h5 wShowWindow (hwnd, iCmdShow) ;
. m. |6 Q# o3 y* n% ]( X3 B" m
& F; a! E* ~: q  [0 }% h 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
( b7 Z6 a8 I& O( D0 s$ `( s0 c* {# t
Ⅱ.在对话框中建立自定义子窗口

1 b' C! s- l9 p1 B6 \% }
可以自己定义控件,然后在对话框模板中使用
. I* M8 b, w- X1 v
4 o6 q/ s. {8 S! S 一、定义"窗口类"与消息处理函数:* v0 C: O- O" p
在WinMain中
# V  u( X% p* c. J9 j& W9 y8 J除了注册主窗口类外,
8 m. B8 T! f% w) ^+ ?" I另外注册用于对话框的类,指明类对应的消息处理函数* i2 L' M  _! I  W2 x( r" i/ ~
wndclass.style         = CS_HREDRAW | CS_VREDRAW ;7 J+ {4 w: C' B- m$ g8 _
wndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数6 h- k- L, ~5 d2 m/ Y$ Z: T# b
wndclass.cbClsExtra    = 0 ;
( a% {! j7 I% dwndclass.cbWndExtra    = 0 ;
$ d5 \# T/ K6 ~, L/ H0 Bwndclass.hInstance     = hInstance ;: b0 c" r1 L; z+ s: v4 k
wndclass.hIcon         = NULL ;
4 ]1 g3 U/ J5 uwndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
) j1 @% _( V0 Z! }# e* N) f$ ]5 Jwndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
4 |: b+ q3 r7 }  x+ e4 n3 wwndclass.lpszMenuName  = NULL ;# o5 T' }7 w8 T, J, `4 s3 Y  @
wndclass.lpszClassName = TEXT ("SomeControl") ;7 [% M. k, P* P, p4 Y) H
RegisterClass (&wndclass) ;: B# r( S1 m5 t- _
" I* a8 G$ W" K" ]/ Y5 o
同时,还要书写好消息处理函数SomeWndProc。 7 ~, t' P) z( z7 i; U
二、在对话框模板中添加自定义控件窗口:- O0 g& |; N. a
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。! Q* X8 m8 h! [% t1 n  ?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-14 14:43 , Processed in 0.018482 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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