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

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
; O/ v3 j/ P# Z  r' I9 U3 |! ^$ v- X0 ^3 @5 h& j
一、概述:
0 ~9 ~8 B1 b9 y8 Z9 w: @在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。- F2 \: \$ Y0 H9 _; [9 d/ m
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。
8 _% y( Q6 _  n0 B$ @# R) i. i$ _* ?: I! A- e8 d9 t& d" L
我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
. m* \* a. W+ N- N8 x但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。
* G5 b% M" A2 t  v2 O
  z2 V7 ?; H( F' e9 [# z5 U 二、书写一个“真正的”窗口消息处理函数:0 I' s6 U: [" e& x6 M
按照普通窗口的方式书写好消息处理函数。
. F  o+ U* f7 y/ s* C(不要漏掉了DefWindowProc): ]3 H/ }5 [; \2 A
. Y& b* ?! Z- [4 Z: @& `. k
三、注册窗口类: @( W0 H) M' Z& o, @7 y) n1 Z4 u) M
用书写的消息处理函数注册一个窗口类。8 U. l) v, E9 k1 c2 D2 g
0 a2 O9 P# I  \- t4 o: i2 D, N% f
四、建立对话框资源,指定窗口类为自定的窗口类。
! N. v; J. w5 C
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。+ S" [( p8 V" F  ?
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")! ^2 U' a# E0 N; z: w
例:  t3 G; w2 Z* C. m: e
建立文件Some.dlg& t- y* y9 w! c% J/ w& s5 D! c. C6 D
书写:0 e$ f6 X* _- k" A1 a, F; `
HexCalc DIALOG -1, -1, 102, 122
7 K. a5 b/ Q3 I/ \1 a6 G& y/ J8 W( w0 ~8 `
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
) R$ @1 f$ |, J. \7 n% l
# n4 j+ D! p& k  N( |$ C+ mCLASS "HexCalc"    //填写上自己注册的类名称' T/ W( ?! y9 t; `2 A. t2 r7 j

$ T4 i$ h) n* R$ y$ w0 O( fCAPTION "Hex Calculator"+ Y$ l2 R$ l; i3 P

' |( Z4 Z0 ?# E{9 C- @# N$ W7 e* }1 q1 N

$ f8 T6 k8 E* J" I  r% B8 g, Q        PUSHBUTTON "D",       68,  8,  24, 14, 14, {4 |* G8 M) U" C/ h0 y$ j5 D
9 \- l5 `6 X  q" y8 Y6 @% e9 J2 Q
        PUSHBUTTON "A",       65,  8,  40, 14, 14
' m$ Z4 a* g7 X; x" I/ `
% M  y( Q" s; p% \# o0 X  b+ \        //各种控件
0 q4 a9 `/ g4 p+ v" T
3 p: r+ r; ^( {! o}
+ L2 ?. }( t% V( i) g/ V* U+ |4 a+ g6 ?2 x4 l) Z$ S6 E
五、使用非模式对话框方式建立主窗口:
/ ^: E, W* K$ ^: S建立主窗口的时候,使用CreateDialog。
# O) C! v0 G4 S/ l" m( J" e- X* f8 c
hwnd = CreateDialog (
6 \% c% _. b6 `- u& k                     hInstance,$ a% |" ?' f3 c
                     szAppName,        //对话框模板) Q7 w; c0 ?2 Q7 `* V
                     0,  `$ e& b) ]# v* Q  j9 f
                     NULL) ;! X0 V) s8 G+ o
ShowWindow (hwnd, iCmdShow) ;1 f4 p; H# c9 F* w+ U
! Z, f4 x% z  T
其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
" m$ F/ [8 J$ p1 E5 G
Ⅱ.在对话框中建立自定义子窗口
4 U& |( z* t! P: n
可以自己定义控件,然后在对话框模板中使用7 G' G% N! S! e: r( Y

, o& ^$ b. w. G' Y 一、定义"窗口类"与消息处理函数:! U; U9 }  C7 @+ q
在WinMain中* P3 g1 p( I5 H6 T6 [4 @$ g9 Y3 E
除了注册主窗口类外,
8 Z: ]% m9 Y. L另外注册用于对话框的类,指明类对应的消息处理函数/ f6 X! ]& S2 M
wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
' f  y' A. D: Y' D5 G: l1 n. _wndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数/ a: I3 n. w% [2 R% H" _8 }7 \
wndclass.cbClsExtra    = 0 ;
( c2 l$ @0 @  Z2 twndclass.cbWndExtra    = 0 ;
9 f- p, B( T% G3 J9 Gwndclass.hInstance     = hInstance ;
; ^- @: o6 ?; r* E/ e" D  ^wndclass.hIcon         = NULL ;! y+ n5 Z6 p% f% ^5 _. x% O
wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
+ Q: j3 _; Z; g# v6 Gwndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;7 J' G! M) y& h- S
wndclass.lpszMenuName  = NULL ;
. ~1 x0 z9 G; q) K3 awndclass.lpszClassName = TEXT ("SomeControl") ;
+ V4 N" d- K/ f7 G' Z, _RegisterClass (&wndclass) ;" I' A% ^" I' ^
" ]" x/ ]% N; _$ J# z' Q6 F& W
同时,还要书写好消息处理函数SomeWndProc。 , Q& L) t4 h+ v) ^8 q
二、在对话框模板中添加自定义控件窗口:# P; w4 L$ J- ]
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。4 ^/ I* |1 L/ X) L
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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