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

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html6 F  Y. Y/ `# |0 x& V1 U1 Z

0 q+ _/ ^: v  F9 K: N一、概述:
/ L$ c+ G2 [9 N( W* }在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。
2 E% s% U1 O- x& D% C使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。$ B' U! W8 W9 C7 W8 `8 {6 y- z

! N, ?: m, j' Q' I2 r5 ]我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。& ^9 V6 k( g1 H6 j- E3 Y% l
但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。
* N; O. {% Z& a' ]3 D
! L1 T/ c7 f6 e$ C" J) M 二、书写一个“真正的”窗口消息处理函数:% D8 z  p5 c- J4 Q
按照普通窗口的方式书写好消息处理函数。7 p- @* P2 I4 |- e5 V+ H
(不要漏掉了DefWindowProc)
& f5 j5 ^% u2 w, P1 y" Z; X' W6 R# t8 r! a
三、注册窗口类& j6 _3 ~. F$ L
用书写的消息处理函数注册一个窗口类。
& d  N4 R1 l" `' t. q8 G3 k! G) C4 z, l, L+ u( ~
四、建立对话框资源,指定窗口类为自定的窗口类。* ?! b2 j2 {. W1 \/ e5 D% U
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。; [' g; z* ~% }/ V/ P4 F  N
(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")3 e8 `4 _2 c) C
例:
- z7 a0 [+ q5 Z1 t建立文件Some.dlg
) H1 A; v% [/ v  u# d书写:
3 ^: S  k/ A" G2 KHexCalc DIALOG -1, -1, 102, 122  a4 _! W, Q7 W- t4 k$ N, B

3 [/ {$ G9 }; m  U, f* y7 ZSTYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
9 ^) m( W9 P- r( u
! f  X. X9 Y. U1 ACLASS "HexCalc"    //填写上自己注册的类名称
( B. F" r6 w+ Y  P1 b4 B2 I9 c, R2 y# I" X( u7 E
CAPTION "Hex Calculator"& Q: C% v8 V0 y' U! J# l

& G9 _  }( |, ]{
9 ]: l5 e& X+ V9 e) z$ I2 ]
/ d3 h$ X. I! Q6 B8 C" a        PUSHBUTTON "D",       68,  8,  24, 14, 14+ u/ S9 }1 ~1 ]# E0 e' p5 b  T0 k& ~

" ]! Z8 q. e( r' E- c        PUSHBUTTON "A",       65,  8,  40, 14, 145 u2 E7 T( ]9 ~! _8 `: \
% x, E' X: {5 v( a$ L3 }
        //各种控件
) l4 ^  d6 q5 q6 e4 j
/ M1 b* Z: @4 @3 H, n}
) q2 b, p1 L2 u7 W- F& E* ~/ E# T
/ r7 D0 K1 \+ `' e; ?6 @五、使用非模式对话框方式建立主窗口:
& N1 v, u0 G5 i/ J9 r6 |建立主窗口的时候,使用CreateDialog。- S" Y, A: u0 y
hwnd = CreateDialog (
+ i, c: F1 M' M9 ^& e' P                     hInstance,  J- W- b0 g: F0 H( I4 O! m9 H
                     szAppName,        //对话框模板
7 v. v' B8 w9 }                     0,
' W% p# }$ C$ C0 ?) t                     NULL) ;
! e5 E- h  k) j( L. {( R# MShowWindow (hwnd, iCmdShow) ;
% ?1 _( W+ g/ e2 ]
- m% o( a0 `) K! _) S 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。2 S( O/ t+ f5 o, K
Ⅱ.在对话框中建立自定义子窗口
. \# R9 i. `$ k  x. X
可以自己定义控件,然后在对话框模板中使用
, v. S8 u8 O9 v
2 x4 k) _( c0 P5 R" ? 一、定义"窗口类"与消息处理函数:
) T$ }8 |2 |# m* E# u! \% n* T在WinMain中; n3 P! t7 J% X" N8 K) @
除了注册主窗口类外,
2 s: P/ u0 J- K0 W另外注册用于对话框的类,指明类对应的消息处理函数( g! L3 m$ M/ q5 f4 s# ~
wndclass.style         = CS_HREDRAW | CS_VREDRAW ;5 V( S! ]5 Q7 y4 u9 q0 v- d# F- C
wndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数/ d; j: n6 v& Y1 F1 n& J7 z
wndclass.cbClsExtra    = 0 ;$ o, B* O3 v. W' H8 x
wndclass.cbWndExtra    = 0 ;
8 C$ @' I" S) @2 ?2 `wndclass.hInstance     = hInstance ;2 ^  c, z9 n) L  x2 p2 }
wndclass.hIcon         = NULL ;
+ d6 }. A! G/ P* Zwndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;5 E* G2 E3 x0 R: a+ Q& f- G
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
5 l( v* i  y& K0 k1 y) d7 nwndclass.lpszMenuName  = NULL ;8 b% E8 I, }6 Y' A! }' _5 ?
wndclass.lpszClassName = TEXT ("SomeControl") ;
& ]: Q. l  \8 o7 R' Y" xRegisterClass (&wndclass) ;
- b9 A# X8 d1 |+ d; `5 [2 z
. e( C: ?0 j. h( \$ G1 \( K. C 同时,还要书写好消息处理函数SomeWndProc。
8 f, F, ], V( a4 B5 |4 o
二、在对话框模板中添加自定义控件窗口:
! [; z! [2 c7 S) b6 R0 r
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。8 e5 t* ]9 ?2 z  G, h5 m, q
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 07:59 , Processed in 0.016106 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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