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

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html- ?: n; R7 t7 b8 }- M) I

% H1 m) L  a# t) J一、概述:
; f7 v( M6 j- N, h' L" {" y6 X在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。: g$ Q2 U* |4 K8 U) Q" g4 F) W# z
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。# T0 |6 p, z& c+ n1 b4 o4 b8 ~

2 R7 F. q/ `8 r# s  ^& B我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。$ @7 N8 a& Q. l8 r! w
但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。2 G) a0 k7 d9 U

. o! P8 A! \4 n4 q( }7 m1 Z 二、书写一个“真正的”窗口消息处理函数:
+ Y5 O2 o+ G+ ?7 z按照普通窗口的方式书写好消息处理函数。1 r- {) j5 }7 X) _+ i* `7 C( e
(不要漏掉了DefWindowProc)5 a# H3 l- {  O/ p
1 F, f: x5 c1 ~" |; w+ c& i* Z7 N& s
三、注册窗口类
/ K8 ~8 A% |$ G% v2 V% t' `用书写的消息处理函数注册一个窗口类。$ v7 I9 H& H3 P: ?: Z. z
  g! |! n4 I$ s5 O( W$ H4 v
四、建立对话框资源,指定窗口类为自定的窗口类。; E. ?$ K6 k$ G: K) a
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
$ p1 j+ c# |. N(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")" b" l' K9 F* `2 V8 W+ i/ t
例:; b5 E- I6 [: f1 `% U
建立文件Some.dlg
! ?9 X9 B/ ~7 {书写:
4 w# G4 \! C5 u# `. W6 j  wHexCalc DIALOG -1, -1, 102, 1224 m; l  C- X% K( Z

4 g6 t2 s5 s& k2 r( B) bSTYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
6 D  }. \3 |' n2 `) q/ k, ^. B; m& |% j$ b2 P- w8 b: ]( X
CLASS "HexCalc"    //填写上自己注册的类名称
# N6 w, E* |8 u7 C
* b$ Q3 z' V( v1 Y# dCAPTION "Hex Calculator"
  ]$ g" k0 ~2 ]! }' R0 B* X
# x6 |; [# Z4 c. s' U) c8 W{& E) y# B3 ?9 N9 \, C  p/ d
. a" T* L) @2 t  d+ k, k# t, ~8 f
        PUSHBUTTON "D",       68,  8,  24, 14, 14/ w7 L: T" R, i' D; h! ~
) n* c1 q( D; M8 `! Y. a4 E8 n/ i0 H
        PUSHBUTTON "A",       65,  8,  40, 14, 14
, u! \( o: F; v5 n* C8 g7 s- C3 `3 O9 U' E# \
        //各种控件/ {( y! S4 N( ?1 l/ }) t, s
9 _# U0 y9 o# G! i: K1 j
} 5 x9 N9 |/ ~$ O# s3 i" j; a

! U0 |, v% u3 d五、使用非模式对话框方式建立主窗口:- }4 C, U  g+ N2 b9 q
建立主窗口的时候,使用CreateDialog。
6 t, ~/ m, Y: B* n3 j( N
hwnd = CreateDialog (
8 U7 |/ Z3 f- W8 I0 C8 H  q; K                     hInstance," C) T! O+ K; k5 @* [
                     szAppName,        //对话框模板
+ D. m7 |3 w2 B3 O- [# j( S% ], D) V' Z                     0,0 m! i: e& _- S/ F- P& Z
                     NULL) ;. p# y  _/ R  v! K) |
ShowWindow (hwnd, iCmdShow) ;
% T0 V7 W+ r! M" c
1 p6 [% m3 b: {9 i3 Q 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。& c/ f% h* X' ^7 x8 ?
Ⅱ.在对话框中建立自定义子窗口
4 ]( b+ w/ Q% u! [* I! P
可以自己定义控件,然后在对话框模板中使用) {) A/ i: x$ P( j3 J* H7 c3 Q

5 x- e: W0 z0 I' O 一、定义"窗口类"与消息处理函数:
6 W: J$ x( X/ i6 a/ Z在WinMain中6 Y# l, h  H) T8 {, q
除了注册主窗口类外,% O) @0 Q$ T- `! w, p% i
另外注册用于对话框的类,指明类对应的消息处理函数
/ }# e: u0 P3 c; m9 Y- M/ jwndclass.style         = CS_HREDRAW | CS_VREDRAW ;
, o! N& V7 X( Kwndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数0 t. `* R6 O' _6 J( q1 q
wndclass.cbClsExtra    = 0 ;+ J# H5 m, N0 h% d' t
wndclass.cbWndExtra    = 0 ;! V! V! @( a0 u$ G
wndclass.hInstance     = hInstance ;* K% T8 V4 P( h: d
wndclass.hIcon         = NULL ;
! J9 n9 W7 w: l# swndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
6 i; I7 u# v" k2 C7 H, e( rwndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;5 V! d) T9 v7 D7 K( L
wndclass.lpszMenuName  = NULL ;
. v/ K. i0 D3 Zwndclass.lpszClassName = TEXT ("SomeControl") ;3 S' Q1 [) X( {
RegisterClass (&wndclass) ;6 B7 h; }8 W9 Y/ _$ e! s  b

# Q1 D, l( Y- f 同时,还要书写好消息处理函数SomeWndProc。   {! f, _/ q2 I7 S, ^! r
二、在对话框模板中添加自定义控件窗口:
. r6 M; d: O% R% [8 T: ]7 {* o
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
# y6 {6 S! w1 [: t0 i7 d
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-19 05:25 , Processed in 0.015602 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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