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

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html& \5 r" H/ d" |* o, S

- v8 ~8 H* _2 W- t' Y一、概述:
$ C% M8 t. L6 S+ S& P在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。, l* r2 ]- q1 h( m
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。% p" k) L- l& k2 Q' `
. Q/ {! ?! ]- {3 w- a
我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。# _5 c) e& J1 w! @6 t
但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。
# A" R# k  D) J& N8 H) f
& P. Y* ^+ h* N% u- M 二、书写一个“真正的”窗口消息处理函数:
# N, `+ _' H  Y: ~4 x+ [按照普通窗口的方式书写好消息处理函数。1 `; ^3 v) A5 ^% V4 G% p8 a8 f/ y
(不要漏掉了DefWindowProc)
! d6 t( F) o, {. j) o- o& S  O% ^- n
三、注册窗口类
% ]( \0 c% d) M用书写的消息处理函数注册一个窗口类。: K; B6 U) x/ `4 |+ C) f' C" u
! b! [8 H# L! X" @* }
四、建立对话框资源,指定窗口类为自定的窗口类。
' e, f) d$ ^8 v" y. r! h, o, h# D- E
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
2 T* U9 n* l& m' \) b, |0 V(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")
8 F; ~: B* |( [# P* e1 o1 U例:
9 Y6 i5 z: z$ ~5 ]% J5 o/ u5 \建立文件Some.dlg. A" m1 T, M; B! F  v) y
书写:% c& G2 k* @$ P8 N) r6 U8 J" l& f0 K
HexCalc DIALOG -1, -1, 102, 122
# G0 k# N% o/ Q1 G2 I6 m; x
8 A8 n) C8 M- u3 _: u  Q! KSTYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
9 V- t& s  L3 x. I  G* l2 r, s& S- [/ w; O9 C  q
CLASS "HexCalc"    //填写上自己注册的类名称% c9 R+ o5 W; j( C6 M# Y$ D8 R- V

9 E1 c* f- T/ C6 s. JCAPTION "Hex Calculator"
, K1 W  H! Q5 g# v- b+ n+ O$ B  s  e4 F0 o
{& M8 t, |' A+ d
  G/ G6 c; v* h0 q2 @- H+ ^- d
        PUSHBUTTON "D",       68,  8,  24, 14, 14  y0 I1 X6 n3 |

6 k# T+ G6 F  S* ?9 Z. R: B1 e        PUSHBUTTON "A",       65,  8,  40, 14, 14# U* g# O9 J0 P) g3 Y! A

7 y: D2 i' K- q- [* N, B        //各种控件
; Q/ ]/ n  A' r6 h5 b
7 h. X/ w1 a/ p9 Y$ t' Z* ?}
% m3 @; p9 \4 a& S
7 {; Q% W2 `  F) l& M+ O/ R五、使用非模式对话框方式建立主窗口:
# y( q4 y8 Y8 j8 l- C建立主窗口的时候,使用CreateDialog。
7 m$ X/ b: v/ F! ]7 M
hwnd = CreateDialog (
5 z( a. w' ]& h3 n                     hInstance,6 f# `) A; o9 A
                     szAppName,        //对话框模板+ Y0 t) n6 c% h  c, }
                     0,/ Z3 s4 b. l* Y5 l
                     NULL) ;/ H" i+ v" p, b, s
ShowWindow (hwnd, iCmdShow) ;
. p5 ]8 d' Q9 x* U/ k* g* T1 _1 |8 u/ T3 F5 Y/ @. T
其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
! D/ A$ \1 f. C/ _$ r
Ⅱ.在对话框中建立自定义子窗口

0 F) z, t8 n9 u4 g, m
可以自己定义控件,然后在对话框模板中使用
  g/ T0 ]5 R! v7 Z' B2 q+ Q/ L
: @" ?1 j. ^+ E- U5 r 一、定义"窗口类"与消息处理函数:% W+ ~+ h) J% W% y
在WinMain中
4 F3 V1 [# P7 L% c除了注册主窗口类外,* b% q% b% k! f; H( w
另外注册用于对话框的类,指明类对应的消息处理函数
8 Q8 t  `1 V* @. A! M- u8 D7 }wndclass.style         = CS_HREDRAW | CS_VREDRAW ;' A1 X& \; r/ y/ w1 |  _: u
wndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数
& Z3 x! p; t2 }" u$ c. [5 ywndclass.cbClsExtra    = 0 ;
" Z, t+ T4 R# Q& lwndclass.cbWndExtra    = 0 ;  e* s! F2 Z% x1 g) k- B( [  `
wndclass.hInstance     = hInstance ;
5 C! X/ w1 D6 O% R; j! |) {wndclass.hIcon         = NULL ;
/ f1 y  U$ r$ |wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;" _! q, P; u# C
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;( L( F2 @0 u. R2 b
wndclass.lpszMenuName  = NULL ;8 R' j+ F3 u: }* i
wndclass.lpszClassName = TEXT ("SomeControl") ;
2 Y  C8 p$ |+ L/ v! P  V) wRegisterClass (&wndclass) ;
! ~% q( C7 I4 A6 [/ m3 \
8 X# w6 W& b/ s# w 同时,还要书写好消息处理函数SomeWndProc。 : A+ {" F6 o: J
二、在对话框模板中添加自定义控件窗口:
0 v% M0 |/ M* ~* q* z; ]
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。5 B' T$ `4 \+ D
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 09:18 , Processed in 0.016039 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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