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

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html) }. H, m  t- d2 b" D, L7 P, A
! c* z1 @8 J' u' H( p
一、概述:
' D( R& _* A1 \) d- y在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。
" G/ w* `* h' Q; M: o$ I( m% A( K使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。
0 G" m- z' F8 R' h3 u# W$ `1 O- Q6 l
我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
8 j6 f) n/ ~' Q+ W5 v1 u' E但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。5 h2 L( |' m8 W! w& S7 f0 _4 n$ A: e

, d: W2 J4 w6 J# x* n 二、书写一个“真正的”窗口消息处理函数:/ g$ X* x' o  Z' S
按照普通窗口的方式书写好消息处理函数。
" g! i  z- H6 y4 ^& {7 @(不要漏掉了DefWindowProc)$ E) ~( H2 z6 f' Z1 N

% I& R% [: c. O; ^- C/ O0 P3 J 三、注册窗口类
2 t  r3 ~) n3 h用书写的消息处理函数注册一个窗口类。
5 D' Z9 T" g! K3 n7 p
6 z3 _$ y' ~' f$ E 四、建立对话框资源,指定窗口类为自定的窗口类。
  _* {: w: P9 f
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。8 l0 {0 N$ `0 J
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")+ D( R; `" W. M1 s1 ]. K) _
例:/ {$ s' s8 _* }! ^
建立文件Some.dlg
' ]' u( @5 ~; w8 C4 r. x) v书写:
' \/ D. _9 E) y% nHexCalc DIALOG -1, -1, 102, 122
0 ?/ x, o$ F3 ~% O# s' \5 u( }. l4 x( f: G* ^, }8 B
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
0 j0 J/ u! y3 h" A" K
8 D  A, B: O5 P8 [9 J  r) s5 U$ z  _CLASS "HexCalc"    //填写上自己注册的类名称% ~: O( p0 B$ P+ r9 Q# I7 B
+ a; _% e* [5 h( S$ O
CAPTION "Hex Calculator"
0 t4 D5 y  ?7 @  P- w4 k
- G( O/ U: F  S3 t7 C) Y{+ F& Q0 v+ X5 C+ b) U$ s' ]& U7 l

3 Z' `9 w0 g# d/ @" G& Q        PUSHBUTTON "D",       68,  8,  24, 14, 14
$ ]& r  X7 U) b1 h$ _6 P  F1 f
        PUSHBUTTON "A",       65,  8,  40, 14, 14: E9 f) ]% J& C
% F1 y7 Q& i9 V( P( J6 Q7 m
        //各种控件- g( {) l& l( l* X
! h# r  ]6 ]2 c
} / n* P' B$ Q8 T  T; e+ b
+ T, w, Y' p5 S+ X+ U0 R9 ?
五、使用非模式对话框方式建立主窗口:
- c* J' y4 \& L# F建立主窗口的时候,使用CreateDialog。' o  n" Q4 k4 O; X2 E: l4 {
hwnd = CreateDialog (
# f7 _+ w2 D6 l                     hInstance,: A& x, i# ~. V3 \' L
                     szAppName,        //对话框模板8 w6 C) k4 }# ?! l& c+ k. M4 T& s
                     0,  U$ d# \7 J* L( O/ j9 u( ^% S) K
                     NULL) ;: E+ C# o$ s. Q. M0 t
ShowWindow (hwnd, iCmdShow) ;
/ `. K7 T# o$ b& q8 V# F+ a" \  p' C) L" D, \; _0 v0 k+ j
其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。  P7 L9 O% a% M* P9 I7 o6 |
Ⅱ.在对话框中建立自定义子窗口
, K& a# a# K4 ]6 a9 H  g
可以自己定义控件,然后在对话框模板中使用
& a8 ]0 ^' g6 d2 N1 c7 R" k* i2 T" m
一、定义"窗口类"与消息处理函数:3 I" H7 ]6 y4 C
在WinMain中
# a" s# N4 u; ?除了注册主窗口类外,
( ?0 Z) m" M' P! g2 l另外注册用于对话框的类,指明类对应的消息处理函数
3 `" G/ o3 j, R: _# ]! C" twndclass.style         = CS_HREDRAW | CS_VREDRAW ;! x6 }( H; j( H& J) K( N! r; P( v
wndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数6 S8 w: z: R8 a, j8 D" w
wndclass.cbClsExtra    = 0 ;0 G+ E+ l8 K) U
wndclass.cbWndExtra    = 0 ;
0 C+ ~( {. e% A: S9 gwndclass.hInstance     = hInstance ;6 j4 t! k' ^& O% v
wndclass.hIcon         = NULL ;
* }3 b: {, d6 f+ W9 Xwndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;0 I3 {( a4 Z9 v) X+ [( p* ]/ K3 P
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;* l( ^% {3 ~- }  U8 w( C6 O
wndclass.lpszMenuName  = NULL ;
  D# v$ s' j" h! ywndclass.lpszClassName = TEXT ("SomeControl") ;
: _6 G4 _4 x" q. s) M" xRegisterClass (&wndclass) ;
) r6 m9 K4 }+ W% T
: g; M2 p3 o3 ^1 h9 S' Y- Z5 [ 同时,还要书写好消息处理函数SomeWndProc。
* m0 g2 c( |& n+ c' ~) W7 C
二、在对话框模板中添加自定义控件窗口:  ^3 ]9 M( b1 H" |8 Y  t, g
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
- l" D% M1 A* F
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-9 00:31 , Processed in 0.035550 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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