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

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
6 ]0 I$ y+ L0 g% D1 u9 Y* v8 X/ C% M* ]& E; n- w
一、概述:
, [7 n6 B% r5 H% Y+ C, t在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。2 f4 J- y. G" V2 Z/ r! v7 I
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。2 _3 e# d  G6 b: F: V
% ]# S. ^9 |4 J+ k, \7 X) F
我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
  |0 t$ I' ~' ?  Z! M5 ~但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。4 J. T8 k5 h# j' ?# U
( ?1 i) f$ y; i
二、书写一个“真正的”窗口消息处理函数:" Y5 n6 y8 q( ?) C0 h
按照普通窗口的方式书写好消息处理函数。0 E5 f) n7 J. g/ l
(不要漏掉了DefWindowProc)
  U# Y( _- C! ^) r0 i( P. i% u/ Y3 ^
三、注册窗口类; q- K( i. E% }5 {1 q) M' I# r& }
用书写的消息处理函数注册一个窗口类。, d: o& p$ `9 j. v* `% p9 C3 z
! E& H/ H" s' o0 X, e3 D
四、建立对话框资源,指定窗口类为自定的窗口类。
) j+ r' c+ q2 u& x* c8 H1 j
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
, R! Q+ p9 n- H: k% g(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")6 |0 ^( a  X7 w( F1 p* f
例:: @2 u& Y; s2 l9 r6 Q
建立文件Some.dlg0 |, u9 ^7 C; I* W% U* Y" a
书写:
, R% g; m$ Q; fHexCalc DIALOG -1, -1, 102, 122
4 G1 i) G7 E8 I" `; O
6 D2 b7 Z0 l6 X, [6 \6 LSTYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
- C: s0 @* E- Q
$ E& ]6 S# V+ D6 @* rCLASS "HexCalc"    //填写上自己注册的类名称2 C6 d, E  t+ e# o  K; x

$ J" R$ e& Y' w9 w& Y3 cCAPTION "Hex Calculator"* {8 m: g+ |; x/ ^1 E7 U
- @, V, b0 [' h! G+ t) [% T% {
{/ c0 k  J7 M) T# h

) e! G" L( O: v: R, j% K        PUSHBUTTON "D",       68,  8,  24, 14, 14
4 p: ?9 M3 y6 }6 P5 [4 a! e
4 k9 H' F0 Z% r; ]  r" |' k        PUSHBUTTON "A",       65,  8,  40, 14, 14
+ ^3 Q2 n, J, U$ E& a6 Y" ]$ z
0 H; R* \  Y5 u* u: F        //各种控件0 O& F: F4 J1 P- z, D

5 q: D% j1 ^" S. R) m1 U. |}
# o1 N7 D- _. r* W
0 ]6 g$ T8 I7 b, R. Y# ]五、使用非模式对话框方式建立主窗口:
. E' t7 O. X2 C4 e  W1 x8 H! l建立主窗口的时候,使用CreateDialog。. U0 |6 B8 W# Q6 s/ L
hwnd = CreateDialog (
8 h9 W" e2 \; |6 D8 B% t                     hInstance,
; H7 g$ d' ~3 Y# b; i& z7 w                     szAppName,        //对话框模板
6 _$ [( K: w) n* G2 d: G$ s/ P                     0,! a6 y! q  f. V/ j; v
                     NULL) ;+ F. k2 G9 |" W, S+ [9 @+ ^8 r
ShowWindow (hwnd, iCmdShow) ;% [( i( ~* w7 Q' {: g
' P3 H" z/ j2 ~- {
其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。, w: f. b) y: Q) w$ ?
Ⅱ.在对话框中建立自定义子窗口

. H6 N8 Y9 d" ^! @
可以自己定义控件,然后在对话框模板中使用2 p# m' L" |2 o
5 ~1 }& z- a9 _( ^. Z
一、定义"窗口类"与消息处理函数:
$ B5 {4 |5 R3 e  ^在WinMain中
1 q* ^  P  i3 `$ Y, T* t/ _4 T4 |除了注册主窗口类外,
$ C7 x1 f' v6 O另外注册用于对话框的类,指明类对应的消息处理函数
+ A9 ~3 [! f4 u9 s6 fwndclass.style         = CS_HREDRAW | CS_VREDRAW ;
2 m# e0 [" z% W. I' Ywndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数9 ~5 T; v6 f, H6 q3 E1 w
wndclass.cbClsExtra    = 0 ;
. o( Z, W" z, h; l* D4 U: V8 C3 Jwndclass.cbWndExtra    = 0 ;
& t; o$ y/ j2 }) M' Wwndclass.hInstance     = hInstance ;
3 h- u5 a/ I4 o6 y3 {+ y% Y4 uwndclass.hIcon         = NULL ;, a2 W/ D0 L/ Y% b2 L2 [$ n
wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;: X! O% ~  J2 Z, w7 ]3 ?
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;6 u- W  j# y$ d
wndclass.lpszMenuName  = NULL ;- w2 B" \% i1 o; \
wndclass.lpszClassName = TEXT ("SomeControl") ;8 R# m7 [9 L3 H; j# L
RegisterClass (&wndclass) ;
$ }3 i3 g. Z) _7 a$ C1 h6 R
! m7 R4 I* K& c6 t# J2 o1 k5 I 同时,还要书写好消息处理函数SomeWndProc。   v) T+ A! p% R1 p
二、在对话框模板中添加自定义控件窗口:
( e0 j7 \1 O& Z' ^
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
! r8 M1 O+ `% m4 [6 _# X# b3 c
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-9-30 06:26 , Processed in 0.034832 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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