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

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
7 \8 S9 N: C# [3 e  b$ `2 N4 f
; S$ `, v" m) T, C: C3 C+ b/ u一、概述:: C1 ?+ ~) i+ A5 ?
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。- O* C0 b8 W# Z4 d; T4 ~& z
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。9 c/ M2 a3 W$ f
6 c% b% M0 Q) m6 x( u% ~! ?, ^- |2 n
我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
4 L. N2 O* j8 f但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。
8 @' `" f8 Q8 O. z( W  a
# \% w& y/ G0 r+ m( O4 [ 二、书写一个“真正的”窗口消息处理函数:5 @* x7 J8 U7 O
按照普通窗口的方式书写好消息处理函数。
' l" J* I) F+ e1 E& d: _(不要漏掉了DefWindowProc)& u5 x" `/ O) r- h) @8 L
( h/ G7 M/ S4 r6 s/ D
三、注册窗口类
. _/ \# X, S8 j  N& \用书写的消息处理函数注册一个窗口类。
, w. r6 w& A$ i& x
" C' t/ d2 f8 M4 \3 M' ~/ g- W 四、建立对话框资源,指定窗口类为自定的窗口类。
$ O, @! r: k8 f
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
1 M; S6 f! h, u1 t" c1 `! z(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")! [5 P) z  A' Q, Y" A
例:7 F  K% N& O# L5 T; l1 V" W
建立文件Some.dlg) c6 K' C3 h9 ]
书写:
9 T0 c- ^$ s0 d; @HexCalc DIALOG -1, -1, 102, 122
4 _/ }. _# x) w% n7 ]. P/ |% C4 }
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX* p, S7 [7 n. _3 w

' O4 Q) Z6 ]+ L* @CLASS "HexCalc"    //填写上自己注册的类名称7 [1 i6 k/ z9 C9 i4 T
  ~" p  J% H. E9 _
CAPTION "Hex Calculator"- ?1 M2 t9 x7 g! Y9 q2 K. h

  S4 ~8 e9 G  d, A{
2 ?, X; x9 D7 k) l
3 H' X/ U7 [; q. J0 }  ~        PUSHBUTTON "D",       68,  8,  24, 14, 14
& d3 Y9 b: i! j, E
5 Y. b2 d4 e0 K3 I; C7 M        PUSHBUTTON "A",       65,  8,  40, 14, 14
* q+ O$ c0 j% w# M) t7 ~, e& B: x0 K* t4 r: U$ ?  w
        //各种控件
! g5 q5 [, Q. `7 o, r' g
: j; R" U$ G' f$ V9 P; v}
. L4 B& o9 X0 `0 @) y7 Q* i- }
7 }9 W8 |( V/ }- X+ g五、使用非模式对话框方式建立主窗口:0 G" |8 F# G. ?  L9 |* O4 ^1 g
建立主窗口的时候,使用CreateDialog。0 |  b3 l# I8 a/ t1 D1 j
hwnd = CreateDialog () {) f7 o% q1 d  x; X
                     hInstance," L: H/ K7 d% E6 M+ j9 H% r
                     szAppName,        //对话框模板
0 ^5 \  O4 }* ?5 ?4 K8 O                     0,
* t& m; o2 V" q$ X9 N5 {  C                     NULL) ;
5 `5 P: G# e2 u. I) Z: @+ N: D. CShowWindow (hwnd, iCmdShow) ;
8 j$ k9 Y. A) j: z1 k
, m5 U4 o( s0 Y9 l4 F 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。0 F% n) Q1 v, L# [
Ⅱ.在对话框中建立自定义子窗口
! A! F$ ], r: X, F
可以自己定义控件,然后在对话框模板中使用
+ ^. V  H' c" d" C9 s9 v/ K
6 B$ t7 J6 d; Z0 K- O 一、定义"窗口类"与消息处理函数:
1 v  ]2 n  K2 N- W0 a" @在WinMain中
/ o8 q/ [* c5 f# s除了注册主窗口类外,: [5 Z3 F  k& S0 _: @0 t
另外注册用于对话框的类,指明类对应的消息处理函数
2 v8 O. e' ?( _: B: p: ]wndclass.style         = CS_HREDRAW | CS_VREDRAW ;: r2 j  d/ H, a6 x( j
wndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数
' F9 z9 j2 x# y8 D- @# ]2 n$ A# w1 Vwndclass.cbClsExtra    = 0 ;
3 M3 X( m, \2 b4 Twndclass.cbWndExtra    = 0 ;
2 H8 s1 F# i% {7 W+ }; ?wndclass.hInstance     = hInstance ;
( f9 V$ L) p5 |, o  @2 V; vwndclass.hIcon         = NULL ;
  q/ v* I- H1 \$ s6 G6 M: |8 }wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
7 ?' A. E3 \. E& [7 b+ Z' owndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;- m! F! c$ I/ B% z6 H& l: v# B2 @
wndclass.lpszMenuName  = NULL ;
) Y" w/ F; h) K: b% ewndclass.lpszClassName = TEXT ("SomeControl") ;
; H/ v' S# P+ I* {RegisterClass (&wndclass) ;
) V3 m& K$ {" ]0 ~- V, c
. Q) C& S( t+ X( E 同时,还要书写好消息处理函数SomeWndProc。
% [* q; h8 ?0 E" G
二、在对话框模板中添加自定义控件窗口:$ ]$ P! X% [$ r& L
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。" V7 u$ c+ e( z1 ^# v* Q% q& |" C
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-9-30 11:05 , Processed in 0.042804 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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