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

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
! r) p6 v( W' ?; E" i% z4 m$ n% L% V3 \8 D5 ?/ }
一、概述:7 V9 O. y1 Z5 K) D/ y! j  H8 s
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。
! X) c! A9 B  ~, q- E使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。3 Q! w, d% D) T2 l; d$ e9 M
: u. [1 o/ g2 r
我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
; l0 w$ L- h  E2 v9 x但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。
1 C3 G) q* Y5 R9 M, B1 x* _5 i: v$ C' V, @) v5 v2 O  C
二、书写一个“真正的”窗口消息处理函数:' E: B, p% e. L: x
按照普通窗口的方式书写好消息处理函数。
) G% ]7 ]9 z5 f- S# h, H$ Y(不要漏掉了DefWindowProc)5 `% |. U# J+ S. S( r/ o' t

4 i3 H+ e8 P' Z: c7 n( b 三、注册窗口类
" U7 C4 d) m. E) l, W0 `. S用书写的消息处理函数注册一个窗口类。, p4 |  }9 p0 o4 @
5 A$ x9 e& `9 \8 u8 |
四、建立对话框资源,指定窗口类为自定的窗口类。
: K0 q' p! |3 R5 D3 p3 S
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。+ M, O/ R" h* c" n
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")9 G' u" c, d0 k( h8 v( _% j
例:
1 S8 ~9 T% {/ O9 Y6 u6 H建立文件Some.dlg
$ R7 ^# Q& I4 M5 e& k书写:
4 {* }  X2 j' Y+ f% }) L% XHexCalc DIALOG -1, -1, 102, 122
0 K3 j* Q2 k: ~0 @* K
+ s' o) y( N5 k8 H0 \STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
) \% x& t1 a& t' Y$ K) A* B( f9 ?0 d9 b+ Q
CLASS "HexCalc"    //填写上自己注册的类名称
! w& f+ V& r3 S  H! L) P  @3 h" K
/ \3 F% E, e" }# j  m) o8 ECAPTION "Hex Calculator": \; M1 q9 n$ b# V

9 A2 g( R8 \, p4 B! w* B# n8 [* _. e{' a# n9 f4 F/ ^2 t& Z# s

9 r% j" J* R. q/ ]( p9 X3 Y# z        PUSHBUTTON "D",       68,  8,  24, 14, 14. i3 n) N( ?- q7 w8 x
3 V: n$ q. h. ^( E
        PUSHBUTTON "A",       65,  8,  40, 14, 14
+ R* F& B+ |# c
9 l0 v" ^# T5 v3 y3 L  a' m        //各种控件
& W9 X! |, k% ^# \
9 F( G7 I2 Y/ _  D: M/ {}
) c# B  R" M; e7 Z% v
/ K5 x  p% ]4 R, \& q6 ~五、使用非模式对话框方式建立主窗口:
( A  I' M: Y& g2 g  o+ F! H" j8 r建立主窗口的时候,使用CreateDialog。. k# c; H- u" e4 ^9 g( j0 ]
hwnd = CreateDialog (
0 z. K3 I! w/ r  |; v                     hInstance,( b9 d! ~/ N# z. m1 A) V1 y0 }
                     szAppName,        //对话框模板
  q. p  \( R7 ]( x, o                     0,  P4 p, S7 y0 b" ]$ k
                     NULL) ;5 s( `/ L0 g: h4 G' m& L
ShowWindow (hwnd, iCmdShow) ;% O  ~, _4 U& [+ n
) A  j, x3 B/ K' |* U6 i3 J, v
其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。9 c2 q* P  D1 g, s2 ?
Ⅱ.在对话框中建立自定义子窗口

. [! O1 y1 ?  m$ s
可以自己定义控件,然后在对话框模板中使用
3 G! T2 _3 w- j& e! `6 H9 s' L# L+ ~! f* v; n/ j8 E) ?* w
一、定义"窗口类"与消息处理函数:
( Q- l9 u. \9 J+ |( C6 t$ I. G在WinMain中
) \( _- b" C; ?' ~6 a+ W除了注册主窗口类外,
8 j+ `: ?# f# [另外注册用于对话框的类,指明类对应的消息处理函数
% u5 E: _  s& E2 P0 Vwndclass.style         = CS_HREDRAW | CS_VREDRAW ;+ `6 O$ b0 Z$ }2 c  k
wndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数
" P9 J' q! a$ F0 X3 mwndclass.cbClsExtra    = 0 ;6 [: N8 A! R$ T3 u7 L( _" V
wndclass.cbWndExtra    = 0 ;
% e) v+ n& W) a6 ~wndclass.hInstance     = hInstance ;, d' E. \$ s! W5 T( R1 t2 @
wndclass.hIcon         = NULL ;
5 N/ z. v% `) |, Y& a! iwndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;- u0 w6 g4 D0 a
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;  V; [' E3 [: v* v  ?5 c
wndclass.lpszMenuName  = NULL ;* {$ w. ~# n" U) y: N% T
wndclass.lpszClassName = TEXT ("SomeControl") ;
3 B6 C. w: O: O8 I$ YRegisterClass (&wndclass) ;( P* Z2 g) h, T2 |

. Y+ b& d- v' W" T  R5 [ 同时,还要书写好消息处理函数SomeWndProc。 1 n; E6 E9 ^2 W! N7 B
二、在对话框模板中添加自定义控件窗口:" b+ ~- V+ d" O9 g# \
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。  \; t& L5 w% G% L6 m: k& `! k
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-13 22:37 , Processed in 0.017271 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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