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

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html3 g$ x/ G: `8 o2 l& ~# E% w4 y

/ ^& B% U' R5 W3 m; a) [9 @一、概述:' m) O. g% x/ A
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。
& [& g& @% Q% o. N! N4 g3 N; I) l使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。7 i% C* z" S3 Z' P

' P5 ?6 D$ d  `8 Q; o1 R" w我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
6 p' o  t! h! M. [但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。
5 B- @& a- V& B" ~  \5 l
+ X/ s- u6 u( e3 j- t' ` 二、书写一个“真正的”窗口消息处理函数:" ?( e5 y! Z0 }" T1 l
按照普通窗口的方式书写好消息处理函数。
6 i7 Z2 f' h2 ~. G0 t4 L8 Q! n(不要漏掉了DefWindowProc)
$ Q& r; B3 C7 E. k8 F2 W3 T. _" O* W' Y$ Y6 L* H
三、注册窗口类7 l4 o& m  m3 _: K- k
用书写的消息处理函数注册一个窗口类。
" H- `" E$ D: P  @( q. ]5 k1 ~. f) `& H
四、建立对话框资源,指定窗口类为自定的窗口类。0 o+ [, W9 j6 H( E
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
- T6 c0 o0 U) g) ^1 p(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")
! [; h& [7 W8 W3 c7 R例:" H/ K7 E6 P9 N9 J; u
建立文件Some.dlg0 b$ k" Z; K. j; a- d: i% [$ ]
书写:
* @3 F5 T( C: t8 V' `1 H2 C9 xHexCalc DIALOG -1, -1, 102, 122( Q2 K0 r9 O" M

8 G! |9 f+ {# t5 i7 ^STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
3 K* b# m4 i( l
* F* F+ ?+ m1 \4 NCLASS "HexCalc"    //填写上自己注册的类名称
8 O2 |' I( U' W3 I5 g
0 r2 n5 n: k( Y! tCAPTION "Hex Calculator"
) B0 o9 \8 w. N2 O8 K# j+ r
1 T8 |8 b3 U+ r6 _. ^{! [- g5 |  l. V0 o& [/ V! F

% |4 a+ H5 Y' r6 f: p' Q        PUSHBUTTON "D",       68,  8,  24, 14, 148 K& E0 a1 P0 c8 F! U+ T

6 B/ S5 A2 H: p5 D& r' j        PUSHBUTTON "A",       65,  8,  40, 14, 14- e* S8 u" x' M% ^
& C# m) X5 T7 p& R; _5 d
        //各种控件
( e* y% B" S  @8 J  m" j8 q$ W
( F8 L' U7 f. x2 C) w} " R+ }6 m) ]  i- D2 C8 R
8 W" V! Y! y5 C
五、使用非模式对话框方式建立主窗口:
  F! b% q2 _% }8 D4 A9 C, ~建立主窗口的时候,使用CreateDialog。
7 i# n6 ]; M) d/ i6 G( g* m
hwnd = CreateDialog (: D' ]- O) Y: Y5 j, f
                     hInstance,2 E( z; e. o( ~( P8 E' }- G
                     szAppName,        //对话框模板
5 B" k1 E- x" Y6 y0 X                     0,3 i/ {' u% n; j* U
                     NULL) ;
) r, H- K6 t3 |) \8 @9 fShowWindow (hwnd, iCmdShow) ;: y+ C3 [0 N' r1 l7 V0 k) Z" n3 p' D
; ~8 }/ L; `7 q/ H, ~* O
其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。/ k% j; l2 O8 T3 w7 ]5 A( _
Ⅱ.在对话框中建立自定义子窗口
1 t2 _  V  Y8 o/ L% l
可以自己定义控件,然后在对话框模板中使用
9 |  [8 t& R5 T) @/ m# a2 K4 I/ k- T! @6 t, X" |1 {
一、定义"窗口类"与消息处理函数:9 z1 _, T4 B( U1 |8 r
在WinMain中4 v0 V& q" Q, W- ?2 m4 F& w
除了注册主窗口类外,
* D1 g( D0 x( m$ w9 v& o另外注册用于对话框的类,指明类对应的消息处理函数
5 b/ z- [+ {0 Y6 ?( }wndclass.style         = CS_HREDRAW | CS_VREDRAW ;4 d; P$ I) U* I) F
wndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数% Q6 q) I. V9 A4 ]
wndclass.cbClsExtra    = 0 ;
" S; U3 P. C1 R2 y7 y: P& ]$ Mwndclass.cbWndExtra    = 0 ;4 D, s4 U9 Y, R! h& ?
wndclass.hInstance     = hInstance ;# ]3 G$ b( Z9 a1 m. N
wndclass.hIcon         = NULL ;* I! d* _% K" W& d/ |* j9 P+ E! {0 S
wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;' J6 M% `/ p- I$ p0 f
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
2 c% S5 P& ~  s5 x2 N% [  b, @. t1 Owndclass.lpszMenuName  = NULL ;
+ c. Z0 C% S9 O" Q1 _$ mwndclass.lpszClassName = TEXT ("SomeControl") ;2 M. ?' P! A* C' W! f! j
RegisterClass (&wndclass) ;
# D  e" H- S9 ^: D
8 U  n3 C4 c: S5 q8 M6 h 同时,还要书写好消息处理函数SomeWndProc。
9 M( I* G% F9 m$ ~9 ?
二、在对话框模板中添加自定义控件窗口:- X) u. H/ P2 ~8 G9 b, k' R
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
; Q0 M* @! n) E6 i0 G' Z2 H
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 06:08 , Processed in 0.018985 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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