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

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html7 L9 |9 Q. _2 ~/ }/ P

) h7 C. g: z2 p6 [8 R" p. W一、概述:
8 w, @4 @% P: p在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。
" u0 k" o5 v2 Q, H1 b使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。0 E6 S. _2 o5 J5 V) [
- k( X% u/ E- r9 @4 l7 S
我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。* O2 }. T' Z2 j5 K+ I3 i  R: y3 e( ^
但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。
; y1 @( Y4 z6 C0 }. b/ j
7 @/ w5 n1 X+ Z5 x 二、书写一个“真正的”窗口消息处理函数:
5 @$ u9 U3 @% G- u8 H  F按照普通窗口的方式书写好消息处理函数。  L$ T& j7 B' ~6 P4 J& D% H
(不要漏掉了DefWindowProc); S/ y- Y5 t. b5 j$ h) k
" F1 p7 D: M# T# C; G
三、注册窗口类* X9 E% C9 a3 w
用书写的消息处理函数注册一个窗口类。) d# Y! u/ D, A1 }8 ]! N
; t* Z: }0 T" _
四、建立对话框资源,指定窗口类为自定的窗口类。
  E/ Y1 x# O' k0 P& I
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。6 O+ C. x& t4 ]; Y
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")5 k( ~2 c, ?3 L1 ^1 s0 W, _
例:
: R& O0 O: M3 X建立文件Some.dlg
, [3 A$ `' v% n; L3 _, S书写:5 P3 c' T/ x7 \
HexCalc DIALOG -1, -1, 102, 122( V2 S& K/ Z( q3 m6 @! v# m3 z
' l: Y* C: c$ K+ B* w
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
2 |- C; z2 f# j* a
4 C' S. @5 `: s2 W4 wCLASS "HexCalc"    //填写上自己注册的类名称
8 R: ~- W9 @0 h% _8 m5 ^( e/ B) h/ n4 x. @% x0 e$ R: H- o( K
CAPTION "Hex Calculator"0 t9 a3 |7 e4 q7 P6 S1 Y, U
" r! B$ K' ]3 h% v
{- a6 \% L' k8 X& f; D  J' U

1 X+ O4 t7 P  _+ w4 |  i- a8 x# {        PUSHBUTTON "D",       68,  8,  24, 14, 14: \0 y, g. w- t2 z/ @1 g8 k

  q$ H1 Q# c+ j) [        PUSHBUTTON "A",       65,  8,  40, 14, 14
/ I! e3 h" U! F" w+ o
& o8 n: t& t3 V$ s        //各种控件
: Z, V3 a  a. _+ \
9 E5 n$ S4 n/ n% V} : S0 j5 W6 U9 O, F9 d
1 N8 \6 z- I3 u0 v
五、使用非模式对话框方式建立主窗口:
) [( y( ^& z2 y. ]" @: F  g建立主窗口的时候,使用CreateDialog。# v9 b' Z3 Z8 u6 p5 _9 H5 e
hwnd = CreateDialog (( E/ W/ B6 @. F6 ~0 O1 w/ v
                     hInstance,5 \) o8 D! U$ ?( \* t9 v
                     szAppName,        //对话框模板& c8 h. a, q3 @3 a# @6 ^
                     0,
  d$ e3 `9 e6 F% v: b7 b                     NULL) ;% y% p+ w. L$ G/ n, f( g+ E
ShowWindow (hwnd, iCmdShow) ;
  h/ Y* Z+ o. P; y. D. d9 U7 m
% }9 L7 [/ g" |/ d  @* ~1 d5 r3 L) A 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
  r2 K8 I0 k- @6 N. r
Ⅱ.在对话框中建立自定义子窗口
8 ]1 b, W2 E: n" z7 Q5 `) j
可以自己定义控件,然后在对话框模板中使用
% w$ _: D% {* H) A! N
! }' M# e' e0 g# e 一、定义"窗口类"与消息处理函数:+ Z7 F, Y1 k3 w( @# \* {
在WinMain中
& l/ L4 r/ R. R: ?7 K+ k+ u除了注册主窗口类外,/ d: G$ V  U( l" \) [
另外注册用于对话框的类,指明类对应的消息处理函数; Z) i  e* V# n  L/ t; r
wndclass.style         = CS_HREDRAW | CS_VREDRAW ;  J9 o  g# Q! ]! t( j
wndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数9 U0 Y8 N) n5 s
wndclass.cbClsExtra    = 0 ;6 B% ]+ c& J$ y/ i2 ]
wndclass.cbWndExtra    = 0 ;% h; C2 y$ [; C+ f1 `" f
wndclass.hInstance     = hInstance ;
# r& {! N% E4 @8 L% ?: Y+ Pwndclass.hIcon         = NULL ;
6 G: P6 \& _7 |- b7 Qwndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;( K4 d' x9 g+ w; G, @6 T6 y) O6 d
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;0 H4 j5 g2 Z% _/ S' m2 f6 I
wndclass.lpszMenuName  = NULL ;
6 u7 X! d# w7 L* F: s; Kwndclass.lpszClassName = TEXT ("SomeControl") ;
8 a( U5 d# E1 N3 d+ P  {- QRegisterClass (&wndclass) ;
2 `2 {3 ]1 ^  _, |( t; e2 g* c0 E( e! d8 l8 Q
同时,还要书写好消息处理函数SomeWndProc。
* V9 z3 I  u/ G' P7 B% Y
二、在对话框模板中添加自定义控件窗口:4 e+ I9 R5 Q& c$ o7 T1 Q
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
2 ~0 q7 g: d; W6 C) N5 [% P
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-29 17:44 , Processed in 0.020562 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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