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

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
7 k8 p6 ]7 J) D% H3 z8 x/ d& k2 k7 m- L' W1 H
一、概述:4 Z1 v; C; k9 t6 V- g7 r9 [# v
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。& D- K: @- Q6 w  g+ k8 h0 D( V
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。4 E1 Y  T$ E0 i9 ?

3 R$ S9 k/ `0 p; x我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。& P1 Q( q( b9 U. n: X
但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。8 P" S" [. D: h$ u3 B$ @
7 a) A& n: D8 v: e& X
二、书写一个“真正的”窗口消息处理函数:
# W9 m, C/ i7 u3 S+ S按照普通窗口的方式书写好消息处理函数。
1 Q0 {% l7 a, ^3 @$ I(不要漏掉了DefWindowProc)2 p: ^$ `4 h3 ^) T) L" f
9 Z* q# ~0 B+ q& W/ _6 {! y: ~
三、注册窗口类
0 ]9 ~8 M' A/ {. c. t* H用书写的消息处理函数注册一个窗口类。1 Y+ j# a# C/ w( H

5 X- N6 R- x& j0 B) e  x% x7 S( P 四、建立对话框资源,指定窗口类为自定的窗口类。1 s( i6 M/ a7 B6 M0 J
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。+ a8 Q2 `& \; M: y$ m
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")  o5 F: k9 h' d6 P- C
例:: O* q/ b4 b5 A. i  ^6 {" n
建立文件Some.dlg
, D% I7 F1 F" ~书写:) x- k1 N) m, i2 |; M
HexCalc DIALOG -1, -1, 102, 1224 Q7 L. [8 V, l1 l( c% ]
7 [! C" m8 |) A1 m4 G; K7 m7 Y
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
& @. T) O' m8 ~8 r, |
6 H. Q% [- F+ U* U# q  k8 o$ i( @CLASS "HexCalc"    //填写上自己注册的类名称  E9 k8 \" {' P* T& c* k% _
+ p5 Q$ l+ |# T; T; R/ n
CAPTION "Hex Calculator": Z$ b* n6 ~: {0 t8 C
# ?" R& J+ [* O
{& I7 S; ^; R: Q6 c! r. M: U/ u. p
( T. @! _3 D) g7 O
        PUSHBUTTON "D",       68,  8,  24, 14, 145 q7 v: z, V( I/ A0 b  D+ Z3 L
1 {6 R% Q+ \; h% x& H% ?) T* O' O
        PUSHBUTTON "A",       65,  8,  40, 14, 14" D' u8 M9 s% B2 r
' |% H! T5 t2 `; S9 [4 a+ p8 L4 z
        //各种控件4 g  o' z, b, S6 V( @

9 I! ]5 Z1 e  A& b; U& F7 S}
1 k! N- C: P: |7 Q" i: M
$ L# `* D  i$ }" e" P# F+ `五、使用非模式对话框方式建立主窗口:; D' G$ K# K5 i3 b# h. v; Q% |
建立主窗口的时候,使用CreateDialog。
8 G2 ~* X. }. t* v
hwnd = CreateDialog (3 b% w# A+ [6 p8 R
                     hInstance,
5 a1 n" y2 ]4 W1 P6 Y. B( d4 N                     szAppName,        //对话框模板
6 t6 c- d+ _; S% v  c0 R+ Q3 C                     0,5 {/ r( e0 P7 Q8 L
                     NULL) ;
# m) J$ Y, w$ Y4 B; K  z; i2 xShowWindow (hwnd, iCmdShow) ;; B5 q+ A$ [8 v4 i

2 \. r1 d% Z/ m& | 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
5 V9 a9 v8 [5 {6 \
Ⅱ.在对话框中建立自定义子窗口

+ R6 p% I( m0 w2 C
可以自己定义控件,然后在对话框模板中使用4 k! D  B" R8 f% i
4 S# u& k! {/ j
一、定义"窗口类"与消息处理函数:$ ^  g6 C/ S+ s% g) {  g+ z7 q* X
在WinMain中
$ q! V# _5 O. v9 q除了注册主窗口类外,2 v5 d, s" R& `4 P. Y$ D
另外注册用于对话框的类,指明类对应的消息处理函数
' X+ L( Q0 Q7 @$ G5 C: awndclass.style         = CS_HREDRAW | CS_VREDRAW ;
/ n3 j* N+ G/ h( kwndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数2 S; H1 G% P7 k, E/ i, C$ |
wndclass.cbClsExtra    = 0 ;
% m8 j* C- ^0 |5 t/ iwndclass.cbWndExtra    = 0 ;
* U* `) m$ ]. \" S. S/ w. J! [, |wndclass.hInstance     = hInstance ;- D9 ^( W0 E" n) R- j: L
wndclass.hIcon         = NULL ;% ^, K2 T; |2 u' a2 d+ @
wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
, ]( k) j6 D5 |9 ]: F6 Ywndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;, n  Q2 ~4 \4 U" X0 X/ h
wndclass.lpszMenuName  = NULL ;
, c6 m3 _$ H9 G7 cwndclass.lpszClassName = TEXT ("SomeControl") ;) w7 q5 K/ F7 \% h
RegisterClass (&wndclass) ;+ z2 X! R/ x* H; n$ _5 K

% U7 |; n& \% I9 q 同时,还要书写好消息处理函数SomeWndProc。 ! n( b/ y  z" b* \8 W6 ?" _
二、在对话框模板中添加自定义控件窗口:
' M2 t7 r& L2 y& a* Y; N4 y
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
' L4 |0 \8 Q! j
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 10:52 , Processed in 0.018603 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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