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

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
9 x. c- {* K* h2 {
5 O$ y# F$ ^0 Q  A) g* |" x一、概述:) u- H7 P; s, u$ }3 b
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。
  y- k8 J! H! ~2 g; g使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。
# y5 N2 q* @* O
1 \; w/ Q% w% l6 p: \  f我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。" L# d4 O) G8 d- Y
但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。
, O! v2 f& Z9 U! K# ], _( D! R6 \; o: s0 Z
二、书写一个“真正的”窗口消息处理函数:
! q8 O: [, s( ~$ s# Q0 l; o  p按照普通窗口的方式书写好消息处理函数。
3 r+ d' g, S7 n(不要漏掉了DefWindowProc)
8 I( r. A+ q( R2 S
" {( p& ]! p; B1 _) A 三、注册窗口类% s% }6 M" z" G, B
用书写的消息处理函数注册一个窗口类。
( A2 @4 A6 y4 T$ v; r' _, |2 z6 @! P, m) u+ }2 O5 I9 D4 A
四、建立对话框资源,指定窗口类为自定的窗口类。% K1 G1 d4 r/ z8 q
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
7 x  J1 f9 S: y# R' k(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" "). W; b  |! R- Z3 `( e
例:
$ j; z1 O: ?3 c. p建立文件Some.dlg
7 A1 y% Q9 q2 x  I5 i! F- S书写:7 T, T9 L0 O+ B9 o8 V
HexCalc DIALOG -1, -1, 102, 122
5 S9 L, k3 m5 o. p& q
/ H( s: A# b8 W( ZSTYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
" T2 S( p- E5 S4 \
( F; B' s+ o' ~$ _% U# fCLASS "HexCalc"    //填写上自己注册的类名称# k5 K4 Y% L7 Q5 W; D3 u: I: ]

" i8 b3 j5 a; S  N9 [) g" C2 B% s3 `, RCAPTION "Hex Calculator", l* l6 b2 r8 ?* R

2 b4 F( Y* \$ l7 d; f3 H{  `7 h" a2 B* W" E
+ @# o# d: Y* T
        PUSHBUTTON "D",       68,  8,  24, 14, 14
  Q2 Q2 F) y9 [6 @3 S1 i
: o1 m5 T9 q7 a; L8 a7 \' e        PUSHBUTTON "A",       65,  8,  40, 14, 14
# Z( K, C( a$ X& [- K8 T- K
' {6 x# y0 ?9 R) v( m        //各种控件# c" K$ [% [* k9 [
0 F. }$ \2 d  m
}
# t+ \  D4 @0 m, W0 ^# p
6 k1 f  g- d7 L/ C* B( ^5 C五、使用非模式对话框方式建立主窗口:
7 y5 J$ f3 t- p' c: e) ]( k建立主窗口的时候,使用CreateDialog。# K9 c$ l! u. V6 T3 ?7 [% h# ^
hwnd = CreateDialog (
% z& T9 u7 {$ q: J2 ^                     hInstance,
( ~- g( h+ D2 k, n4 Y) c                     szAppName,        //对话框模板3 C; h+ m5 P4 B& E9 s' v
                     0,
! v' N3 s. D9 {3 |! W                     NULL) ;7 {$ E, y8 i, ~5 K; ~0 x. R, \
ShowWindow (hwnd, iCmdShow) ;" v0 z% W+ P9 h8 j
5 b- C& F. ]7 b2 s' {
其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。3 M& [& F. p' b5 P
Ⅱ.在对话框中建立自定义子窗口
+ K! o0 F! ?: ?8 q; ^* |% k/ p7 G! G0 a
可以自己定义控件,然后在对话框模板中使用, l! z6 j5 S3 P; b) R- X/ d, |6 y, B
/ u$ c& A" J" M9 l) s; R
一、定义"窗口类"与消息处理函数:- |" E8 @* D, r9 G
在WinMain中
/ z& C- \# s) e3 c除了注册主窗口类外,1 `8 M1 B  t' _" h. p
另外注册用于对话框的类,指明类对应的消息处理函数
/ d$ v6 V9 R* L- s* lwndclass.style         = CS_HREDRAW | CS_VREDRAW ;
% A  L5 c$ n" K0 D, @+ M% uwndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数# ^9 R2 `7 W: y8 c8 H) f9 `
wndclass.cbClsExtra    = 0 ;- Y- a& S) N" d+ V& Y0 J
wndclass.cbWndExtra    = 0 ;& K- F  d3 m* ~/ `* }9 U) A3 a$ L% @
wndclass.hInstance     = hInstance ;1 e$ Y7 S. I- F
wndclass.hIcon         = NULL ;
2 X8 k7 o- q8 d9 \. E. `wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;7 I: d: p  H$ E( D; g# }  {  C
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;9 c0 U% ]9 s: U: B. e
wndclass.lpszMenuName  = NULL ;
3 E& {8 k- ~( J1 {' h: h( owndclass.lpszClassName = TEXT ("SomeControl") ;
* q* `) s0 p! X" R- @% URegisterClass (&wndclass) ;
: J% Q+ B* p2 E% y& R0 {  ^: A7 a, h$ h, k4 b
同时,还要书写好消息处理函数SomeWndProc。 5 [: Z! V( r2 c# l* `' h, ?9 F
二、在对话框模板中添加自定义控件窗口:
' e/ z& F: _1 k+ P1 D, _" ?3 e
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。& }$ N4 u* d0 b6 ^( x: b
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-29 19:59 , Processed in 0.020829 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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