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

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
$ C' F, d/ q3 J
- k, d. H, I: n  o, m一、概述:' q4 g- q4 ]) I; t3 x0 r, x7 V
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。) [( h& G: T4 ~% n
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。
% I% O; Z5 Q: `. [. L* p; G
: F& m+ {) l$ i/ p8 f. M- w我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
" r1 q0 q* z  N但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。8 R2 y$ h+ s" _/ o

. f/ E  h3 G7 c; C5 y 二、书写一个“真正的”窗口消息处理函数:3 }6 {* b9 g3 @& N$ B* w
按照普通窗口的方式书写好消息处理函数。
5 p2 ?1 [* A) X9 r; |/ f$ o* W& ~(不要漏掉了DefWindowProc)
5 |7 w7 o+ p2 O& R% S8 O8 D, I2 B1 i! N2 n1 U. s% R" z4 y/ s2 t/ B
三、注册窗口类- j& k: b; `/ _, j: [
用书写的消息处理函数注册一个窗口类。$ c( V3 K/ u% }0 z% ?) |
( V) x% ?& B  |8 M: ^
四、建立对话框资源,指定窗口类为自定的窗口类。9 |0 O  M3 o! k% j" a' [
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
; z7 d+ |& L4 K5 j! e$ z/ J(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")3 j( ^: h; y. F  V. }" {6 G* L2 ]
例:
; F: r7 ^+ T; B( ~. }建立文件Some.dlg% _! b" I1 O) R6 y
书写:
  Z2 e( Z5 c- d# BHexCalc DIALOG -1, -1, 102, 122: E. }% ~9 n5 J$ N0 Q
) Y/ i. T8 [9 a. _! f1 B
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
+ a$ t' ]0 D/ |3 W- k' f3 h: L$ E, M$ A2 j
CLASS "HexCalc"    //填写上自己注册的类名称
4 _; T& v  }4 }
3 E6 n2 |( _) J/ j# i5 QCAPTION "Hex Calculator"" F6 Y+ T# L4 ^/ m
1 S; [# k" n# x7 t- G. g' P: h
{
! u' ^/ c* ~5 N( l: X/ ~& ^% r
! T! t4 @7 q1 u) y5 L        PUSHBUTTON "D",       68,  8,  24, 14, 14
# o5 g. }9 C+ b1 G9 g
$ N! |' T' X# Y$ j/ n  W, n: Q2 x        PUSHBUTTON "A",       65,  8,  40, 14, 14) y* J1 J  `& |6 M
" s' n( O1 x: H  ]  c% e4 L
        //各种控件
  I) p) [4 E& X- R7 s2 c# P) D3 V# p8 i9 @* {3 Z
}
/ h/ t; c& K* u! G' h+ P& D( u! @7 ~" j6 N2 g' ]  x) h
五、使用非模式对话框方式建立主窗口:" J- L3 i! \, N5 B9 l* ?
建立主窗口的时候,使用CreateDialog。: b; c" e& F( N9 u3 z( y
hwnd = CreateDialog (
+ V3 s- j: I! f' S                     hInstance,
) W3 ^8 w5 x/ ~9 F                     szAppName,        //对话框模板
+ @5 K2 i7 B5 m; J) y0 [                     0,
" ^9 O( g$ a: o- f0 E# Y. e                     NULL) ;& P' F2 d4 H  z4 f7 Z. Z/ a$ u$ z2 q- B8 E
ShowWindow (hwnd, iCmdShow) ;' Y. E6 f0 B# U- h8 N/ |' d
0 H  T' T7 a1 i# H& r: J3 q
其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
3 e) Y$ B) v+ g! Q2 ^/ r$ v
Ⅱ.在对话框中建立自定义子窗口
/ s0 r$ X5 l4 k# r% w% n2 r: D' i
可以自己定义控件,然后在对话框模板中使用, A2 r6 C% r$ ^3 y8 n
* |! k  ?8 R+ |7 I- u0 ]6 O  L
一、定义"窗口类"与消息处理函数:
% N# U- A( k+ X8 T; N; Q: u在WinMain中
8 j5 k' L: B" r1 e除了注册主窗口类外,
2 W: ^; l- M3 [# c另外注册用于对话框的类,指明类对应的消息处理函数5 j$ l9 E& w$ g- [9 V/ h
wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
7 K5 n3 Q, b+ g5 |wndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数% v( B! q, ?. M
wndclass.cbClsExtra    = 0 ;$ Y; j% q) `- J! P. M- J
wndclass.cbWndExtra    = 0 ;
( v+ m4 v' h' x  Y4 }. Qwndclass.hInstance     = hInstance ;3 b. e; h0 r* x9 l* r) T
wndclass.hIcon         = NULL ;5 n3 C( G% [. L& q
wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
% ?4 J+ J. u3 Wwndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
: I+ _' `7 Y# [' W! ?" N+ ~wndclass.lpszMenuName  = NULL ;
; ~( p; A7 e' g9 L; S  kwndclass.lpszClassName = TEXT ("SomeControl") ;
% |8 m! Y- u' o) x, E7 m& [3 E4 y2 {RegisterClass (&wndclass) ;! D2 G; S; a& L" k" P7 Z3 ~
/ Q4 I8 T2 s( w' ~7 F/ l
同时,还要书写好消息处理函数SomeWndProc。 & H* H1 R- ^& w
二、在对话框模板中添加自定义控件窗口:3 J- Y7 p8 G  c) o7 e* {  M
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
* h9 E- |8 ^' y
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-19 07:47 , Processed in 0.014748 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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