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

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html# J) I7 ], n: n" A% n% ~* K1 e
' ?9 z+ [1 C+ e* O* C
一、概述:: d7 m: W& ?  K8 e" T$ g
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。. Y; O  C+ G9 n/ i9 Y: C4 F3 g
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。
0 H9 K# f; r! C  f$ b' e0 f
! M2 J: T5 c7 M6 V9 c我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
; c9 ^1 x8 j' C$ j但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。
  }( B& Y$ T$ d- C( c: Q- q8 l8 y  a8 D* H2 g8 `3 F6 j
二、书写一个“真正的”窗口消息处理函数:* |, U4 {/ R. C% i7 |" X
按照普通窗口的方式书写好消息处理函数。0 l* e+ Q: A) Z
(不要漏掉了DefWindowProc)1 J7 q' X4 @; G8 M' d

8 n0 r3 R. g6 S 三、注册窗口类  P6 \4 G' O* O- u' N
用书写的消息处理函数注册一个窗口类。
+ g: t9 @1 `) I# o% E. Q' |6 J+ c9 o( b
四、建立对话框资源,指定窗口类为自定的窗口类。  B9 G% @$ y% l+ y4 v
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
* x, t1 [0 n/ j. g0 d# O: v/ R5 z(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")- z8 Q# b: }4 g# s4 u3 P: I8 N" K
例:9 B; `! D) C: [. E& M7 K
建立文件Some.dlg
5 s" ~& f8 F1 P/ @3 R5 l# c书写:! {5 ?+ V4 M/ Y( O" \
HexCalc DIALOG -1, -1, 102, 122
/ d! F; [. q8 ~4 ~* s0 L) L
# o. O1 J2 i2 l; Z( RSTYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
' q! L$ A2 \8 }1 s8 Y( ^# o9 c0 b" X. F: F0 o7 e  s- |
CLASS "HexCalc"    //填写上自己注册的类名称1 Z% w3 x% K: \& _
3 X% V% w, B2 R: ^. o+ X9 S7 h
CAPTION "Hex Calculator"+ D% U, w2 Y8 J: c0 n

0 f) m$ l8 Q* S' M- M/ x{/ Y- r' w' ^/ k& q
6 v0 G& I" M  ?# I
        PUSHBUTTON "D",       68,  8,  24, 14, 14
0 r: p& ]! v4 `6 C4 g6 p+ @# L) j. ~/ X9 v
        PUSHBUTTON "A",       65,  8,  40, 14, 141 u% h9 A, y8 D5 U% _  s) H
/ p& K. j+ l) k+ M  N3 \9 `; a
        //各种控件( J1 y4 K( x: Z- O
$ S1 v+ k. v, [* l: t' _
} 1 \1 b, n1 r+ [" f! w

1 j! S4 G4 ~, l5 V五、使用非模式对话框方式建立主窗口:
! _# T$ ?6 B9 }/ k1 U/ ~; l建立主窗口的时候,使用CreateDialog。
/ A; K+ h- E0 O* e! G8 o
hwnd = CreateDialog (
$ v2 u; K2 }- I+ M& i: l& g- w5 q. W                     hInstance,
, @* y% Y0 M- z+ ~7 E1 d& u                     szAppName,        //对话框模板
9 q# a. O5 a3 M) z, W6 Q: W                     0,# v% G' [( ]3 M9 Z
                     NULL) ;
6 s$ p1 y& I/ Q1 dShowWindow (hwnd, iCmdShow) ;
3 ^9 ]; C2 {9 y0 j6 p" [% A0 W1 Y) C$ Q0 f$ _+ }2 j* c" T
其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
( q: S+ b1 T/ R6 i& B2 r
Ⅱ.在对话框中建立自定义子窗口
/ o. X1 u: X/ n) T7 m
可以自己定义控件,然后在对话框模板中使用' z/ j: ~- j! I- w4 w2 V1 E# R9 |- n
1 B, D4 ^/ |3 I# `9 T; {
一、定义"窗口类"与消息处理函数:
! a& N/ ~0 X# ?# l) m. r, M1 ]在WinMain中0 `/ m' w0 ^; {; M; y
除了注册主窗口类外,
- L+ h4 w% s: @! k. ]& `; Q另外注册用于对话框的类,指明类对应的消息处理函数
3 `. ?: \4 q5 D& Y, c. T* g, Owndclass.style         = CS_HREDRAW | CS_VREDRAW ;
- _& K" Q1 D" J- y2 Y$ d" Awndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数6 O: {7 x% i6 q$ S, F9 _+ U7 \
wndclass.cbClsExtra    = 0 ;2 g/ Q2 _0 T0 z3 w: {- n
wndclass.cbWndExtra    = 0 ;0 e- ~: ~/ O$ }$ l2 j/ \
wndclass.hInstance     = hInstance ;
. {3 u3 ~7 c1 Kwndclass.hIcon         = NULL ;
; q0 n5 R& j7 A8 pwndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
2 @' z+ W+ n: x! h4 ^5 I" nwndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
( _5 \$ C' F7 M8 D7 x( [! dwndclass.lpszMenuName  = NULL ;# X1 J0 L0 A3 z# h- o; S
wndclass.lpszClassName = TEXT ("SomeControl") ;: V: w1 A6 [' U" ]; H5 w( q! i5 v
RegisterClass (&wndclass) ;
" A3 o, B5 [4 w: P: U" e, P2 ?
: \+ ^8 o9 j4 w( S6 X) j 同时,还要书写好消息处理函数SomeWndProc。 3 I. w$ M6 O4 B0 ~' n& t3 M
二、在对话框模板中添加自定义控件窗口:
! U  C0 @6 c- c, D" F, l- C
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
/ Y# z6 b" d8 A' e8 V
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-15 00:07 , Processed in 0.018271 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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