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

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html9 _+ L1 e6 h6 ^% C4 T0 ~

3 E$ o% E9 k$ u& t$ W- B: D一、概述:
" P' A8 j. [2 S- w5 |在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。, O8 p( `' V; s, l5 N6 Z$ E/ O0 A3 @& v
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。
! u0 I: c& X  `5 R
& P+ H5 z7 g$ {我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。7 D" v" @# u1 P2 O: `6 `
但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。
/ Q* w1 k& B7 D# i3 z; G8 f6 L: g5 n' d9 \
二、书写一个“真正的”窗口消息处理函数:
. L5 R6 k4 ?7 Z2 U) T按照普通窗口的方式书写好消息处理函数。/ @) C% K0 ?& {3 r
(不要漏掉了DefWindowProc)9 ]- D" p1 G: P7 o
3 ?7 A5 U6 N! @0 A+ b
三、注册窗口类) i# s9 E1 ^( d% x& K  G1 g/ Y: s
用书写的消息处理函数注册一个窗口类。, T/ o0 P. J3 S
, B5 w( Y! H0 j/ z
四、建立对话框资源,指定窗口类为自定的窗口类。
: r  Q' v' h+ v* R* b# w" R
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。3 \, C" |; d' V
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")' C9 Z0 [2 w3 Z* j
例:. c' G. P2 P/ o
建立文件Some.dlg/ ^/ G# s1 V9 C0 {( w9 v
书写:
/ p9 Y% B) C& L7 e+ M8 THexCalc DIALOG -1, -1, 102, 122
$ k3 n" w. v0 Q" X, y  Y+ `$ |
6 D  L$ m2 j+ USTYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
: b9 x- u0 }2 ]' c) S" p6 z
( t0 G; C' m! ^# B) {CLASS "HexCalc"    //填写上自己注册的类名称4 M- r* H6 q; o2 W9 e" b1 c9 a* [% C
, p1 k9 b! V/ v* r, |3 x& T) b
CAPTION "Hex Calculator"( `, j" X) k8 _

9 x) |- b& @5 ^8 z- J5 j5 p{
! W- s; l6 x" h# t% Q9 H. c  C3 Q
/ V! d* n" p  r) `% Q        PUSHBUTTON "D",       68,  8,  24, 14, 14
1 S( n0 S8 [, H: u: h- o
! G( F3 o& m3 T# N8 y3 X        PUSHBUTTON "A",       65,  8,  40, 14, 14
: e# v5 p% C% Z' \/ A; h
! P7 G: s' K7 }" x/ m        //各种控件
- ^- ?: L5 l7 j# M& i% o6 Y5 L
  A" I0 A. c& o! {}
* E" V$ N  T, A5 s" ]" G
1 p) F- o5 ?" U- F' x五、使用非模式对话框方式建立主窗口:$ m+ \' m  r: G' V
建立主窗口的时候,使用CreateDialog。( s0 @/ G9 h- F. Q' m1 [7 V# f6 {2 O
hwnd = CreateDialog (
$ O/ y& k0 r: K; w2 U$ A, e                     hInstance,7 b+ q' o  b& D& l% V
                     szAppName,        //对话框模板
& w9 a/ _. a3 n" Z: Y                     0,
! \5 _- A2 ~- A7 `                     NULL) ;
' T$ L: F6 s. [) j# I4 fShowWindow (hwnd, iCmdShow) ;
1 w& m! p  S* R' F& F& a) L& t+ w# r5 ]
/ X. T" W2 t/ G5 T 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
- w; G. Y1 n4 m6 G4 p
Ⅱ.在对话框中建立自定义子窗口

; Z# P4 X0 K5 k
可以自己定义控件,然后在对话框模板中使用6 x" H/ `/ d0 F  a3 g  T

& O- ]: M0 c: r& _2 A 一、定义"窗口类"与消息处理函数:3 T& F- x* ?; e5 ~! D
在WinMain中. T; v. Z6 G" X# s1 d9 T5 u
除了注册主窗口类外,
- B& `% d3 e; j/ ^另外注册用于对话框的类,指明类对应的消息处理函数0 E: D) w$ b! ]7 o
wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
3 `( s) b  Q7 ~: `wndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数9 R$ S" O( u% e! B/ n/ {
wndclass.cbClsExtra    = 0 ;+ o5 g4 v) s6 m
wndclass.cbWndExtra    = 0 ;
' u7 u% O! w8 G1 A1 D, t. f" nwndclass.hInstance     = hInstance ;
  e7 D0 e* y- A+ g5 z' iwndclass.hIcon         = NULL ;
) k; z1 {) C9 h) B7 n3 X$ b/ N5 A/ Qwndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;1 ^2 B, ]5 c/ d2 g3 F" X  d1 `
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;' p2 l. D: s" U3 ]: k
wndclass.lpszMenuName  = NULL ;
* ~1 U1 X5 M) H9 d+ }, v# |: v: swndclass.lpszClassName = TEXT ("SomeControl") ;
) S2 G5 L! ^" k: p1 D) _) iRegisterClass (&wndclass) ;
- |" B: t4 t: A5 C- d9 y/ ^; G! g1 c: A: [  }; ?
同时,还要书写好消息处理函数SomeWndProc。 6 K( V8 |' o5 t) f
二、在对话框模板中添加自定义控件窗口:; q  q: d# N2 l/ w
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
" w& [* a4 a5 ^0 d4 Y
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-9-30 10:41 , Processed in 0.034081 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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