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

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
# Z" ?. a9 i! l0 Z# v  t7 e2 K  v& E* S5 k9 T/ N
一、概述:8 v1 e2 s( N* T1 }8 s! c
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。3 q$ O8 ]9 I2 r# O9 I, h
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。
  E5 |- z+ ^2 d/ v% _3 q( m( N4 j+ i
1 @  F" u; B6 E, D% [) F我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
# O- M& t$ V2 C: Z1 D! _2 p  U  o但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。
8 y& f0 e- a5 T+ ]( |1 g: [  |( A% L3 X1 [! Y
二、书写一个“真正的”窗口消息处理函数:1 |3 l$ z5 w+ O3 h& q$ _! ^1 h
按照普通窗口的方式书写好消息处理函数。
! S- ~1 X7 s7 k9 d1 y0 t(不要漏掉了DefWindowProc)
$ _: x# r8 X% w! X4 @) X! v; @) N9 F0 `! j- a
三、注册窗口类: p6 h$ {( Y4 s! ?
用书写的消息处理函数注册一个窗口类。6 @* J5 M) S9 L4 h; @6 O- \

' A* @5 v& R8 f: k2 `% f6 s 四、建立对话框资源,指定窗口类为自定的窗口类。
( |  H' \8 q; t/ W3 T
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
2 U3 O# S( x" r9 L/ w/ d0 [' j(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")
0 Y. z: @& n5 h6 j/ o1 c例:
0 G6 O! x  r; M9 |1 u3 @建立文件Some.dlg6 A' ~8 O8 }2 w
书写:
# P/ I; @7 W& e6 ~: X. S- n. FHexCalc DIALOG -1, -1, 102, 122! l: y3 f) u' `6 |5 v

( X/ I) ?& T/ v: uSTYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX% x  Y8 w$ e& ^; U3 t
$ H4 L' [1 C8 ]' O: }
CLASS "HexCalc"    //填写上自己注册的类名称1 o' _3 l7 A1 U( P9 s8 v
) _* l* k, g+ o8 ]
CAPTION "Hex Calculator"
9 q2 O  l( V, @) A1 p  v6 Z2 R0 m  ^( K: _; A/ t. \
{
7 `' u: w9 f  Q4 Q
5 i$ t8 e4 e3 u: u0 a  T        PUSHBUTTON "D",       68,  8,  24, 14, 14% C+ n7 p& m- |# X3 a

8 p. J- @* x& r2 b1 ~0 K  F+ L        PUSHBUTTON "A",       65,  8,  40, 14, 14- r3 n  x+ j+ H
3 p! t% n8 X8 L3 ?2 Q1 j) u
        //各种控件
7 K( o# N! n3 x5 A" s( ]) U8 U0 K1 t2 C0 U4 P2 j( m+ n
}
1 `7 Y0 B! M+ X7 F4 n# J6 {0 n: d
% |1 @( O  d! _% H五、使用非模式对话框方式建立主窗口:
3 Z. q# P+ |! }1 y! L3 C* c建立主窗口的时候,使用CreateDialog。
4 F  E; k2 E) ^; ?9 i3 v) z0 O4 a
hwnd = CreateDialog (
* H* R- P! Y: e                     hInstance," w+ f. `9 {5 b6 `
                     szAppName,        //对话框模板4 w8 [9 D% i" K$ h0 ~6 H  l/ s
                     0,
" ^* M+ Q! E2 j$ m- V" x                     NULL) ;5 J, _( A, b9 I! _9 I- U- S
ShowWindow (hwnd, iCmdShow) ;
' T  W" Q% D4 S6 r' x/ L  s' s6 C7 k" D! |; v6 F
其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
% E. Q+ r, u% U, j: b" Y/ L
Ⅱ.在对话框中建立自定义子窗口

8 H' ]" Y6 c- _  ~
可以自己定义控件,然后在对话框模板中使用
: X, r# ^2 Y; n% X5 x* j. @% `% m0 d: C0 W
一、定义"窗口类"与消息处理函数:. c% L2 ], b0 X1 q
在WinMain中
" d. P  b7 i* a: S$ {, [) L除了注册主窗口类外,2 g  P8 U# I) Z" b, g! m
另外注册用于对话框的类,指明类对应的消息处理函数. p& \$ F; s4 Z. Z' f  f
wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
, _, X: k" H/ K9 P9 f* O. ywndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数
/ `/ s% _: k- P. H1 E0 gwndclass.cbClsExtra    = 0 ;
' B) F9 X- Y, @2 _; ywndclass.cbWndExtra    = 0 ;# L5 k; \9 O1 ]( h
wndclass.hInstance     = hInstance ;$ l8 P! g0 {4 i8 d. P- J9 \
wndclass.hIcon         = NULL ;
1 p, z8 J: h6 J, y8 gwndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;7 k* L0 s: T, t2 N7 G
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;6 e% K$ `4 u$ o4 t* x
wndclass.lpszMenuName  = NULL ;
# n& `& W3 m: D  @  O/ `wndclass.lpszClassName = TEXT ("SomeControl") ;
& _+ U" \% L& k! URegisterClass (&wndclass) ;/ n  A8 s6 {/ L

0 c+ }8 X9 e* [8 ?( w  n  l 同时,还要书写好消息处理函数SomeWndProc。
* m* R8 W9 i! I) b1 `# p* S4 u4 h
二、在对话框模板中添加自定义控件窗口:
$ |1 v1 J, e7 h6 r  G
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
& [$ w: W6 Z* n& n& {7 {* |' m
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-19 17:00 , Processed in 0.018628 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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