找回密码
 注册
查看: 3807|回复: 0

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html) Y/ k2 I  o8 i. C* @+ T; r

' p. Y" R  B3 V7 z4 |一、概述:) m% g! t/ e0 y$ q
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。
/ `8 R# A# F" f1 O使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。6 K0 b2 e: F, p! `

/ B3 F& \. v9 _3 f+ Q( r我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
7 x: s6 v4 [0 o3 X1 S' f但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。$ ?+ h' Z! p! y8 `2 l! d; T* Y

  [. {+ \6 _6 n7 t& ?6 Z: K" c 二、书写一个“真正的”窗口消息处理函数:, V" X6 \& }# @
按照普通窗口的方式书写好消息处理函数。3 ^& u% O# l5 x# G" ?6 y
(不要漏掉了DefWindowProc)
$ l, I# i9 J0 P0 Y( r) p1 Z$ v+ J" O
三、注册窗口类
2 ?# W  P9 _( O6 [3 ~3 _8 y5 C$ ?用书写的消息处理函数注册一个窗口类。
: @1 F" U, a! q6 s5 |" W
5 F2 `: H3 U; ?4 D 四、建立对话框资源,指定窗口类为自定的窗口类。2 v0 g- @* X) j( e: l
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
! X8 [1 A9 d  ?' h, R) F/ ](使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")
. f* U  q' Q& Y! x" |4 h- K例:1 m) \, \# b! H( ^; z4 V( U: d
建立文件Some.dlg
, O3 X; o: Z% q, M5 k; V1 Z书写:# c0 Q4 w* |$ q
HexCalc DIALOG -1, -1, 102, 122) @' X( W( ?# L6 R% t# D
: n" Y/ J; i: j3 ]% z2 b  f/ t6 r
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX6 c1 x) `4 {2 b2 c, k; M/ d  A

8 t' ~3 c' c! CCLASS "HexCalc"    //填写上自己注册的类名称
4 G1 x! V. E% P3 A2 {
. i$ m0 _1 l7 p% xCAPTION "Hex Calculator": `+ {8 r0 d4 X1 U% W

2 Q4 q# p! d! V0 w/ m& u+ e4 N{3 w! r/ d! {6 ~
; l, Z9 }4 A3 S* a
        PUSHBUTTON "D",       68,  8,  24, 14, 14' ]5 u7 o9 ?- W& T+ }0 @

: F" _2 x  L+ m; J4 K% u        PUSHBUTTON "A",       65,  8,  40, 14, 14
* Y3 q/ Q* q& _. t7 ^% F, w+ f# k. W% I
        //各种控件
, X1 I; V* z% |4 U& i" p. s- ?% n* M, `4 J" o
}
  Q- P5 f$ A5 f; u( y& c! l$ P! Q* |! g/ v3 S) D7 t2 h
五、使用非模式对话框方式建立主窗口:
0 G0 X! I! I7 H, W) b建立主窗口的时候,使用CreateDialog。* O) h/ B; D9 f. t7 b6 J
hwnd = CreateDialog (# V6 i' q: ]& `3 k: I( v" d1 Z$ N% ~5 w
                     hInstance,' ^/ i0 h$ B+ P# v
                     szAppName,        //对话框模板( g. u9 O% r) H
                     0,
, V) n+ [( n* m9 a& D" M: F' R                     NULL) ;
/ G3 Q* \; s4 d" XShowWindow (hwnd, iCmdShow) ;
' K8 U/ z+ l, C& l5 E2 z  s+ ~8 B/ e+ K* i
其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。8 S3 H# v! ^2 b( q
Ⅱ.在对话框中建立自定义子窗口
1 @, @6 f2 S/ f8 u. e( Y8 M9 d
可以自己定义控件,然后在对话框模板中使用
* ?3 l# o0 `3 t: d' ]: M9 P# U% O
一、定义"窗口类"与消息处理函数:
" e9 h3 h" l1 r3 r1 t8 y在WinMain中
/ O; D* K$ u( |  L除了注册主窗口类外,0 I; V# E& t: L3 i" F
另外注册用于对话框的类,指明类对应的消息处理函数
6 i; G$ g, ?- ^% d: V$ {# Vwndclass.style         = CS_HREDRAW | CS_VREDRAW ;
* M/ }, Q7 b$ x2 \wndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数
# G; i+ e% y7 _3 p% R9 F! lwndclass.cbClsExtra    = 0 ;) _5 T9 c7 I9 v  y$ C! A* [& g9 I1 Q
wndclass.cbWndExtra    = 0 ;
9 v9 R9 @1 h' j% @  I7 zwndclass.hInstance     = hInstance ;4 s* e4 y: ^. _  B- `/ n. w( `
wndclass.hIcon         = NULL ;
; m; H$ g& z4 E4 ^wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;7 N' P' Q7 f) E+ f+ N& M. M
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;9 `$ z6 A* d* S0 Q% H# u
wndclass.lpszMenuName  = NULL ;/ Z, H' q" R$ O. w* g( D. z
wndclass.lpszClassName = TEXT ("SomeControl") ;1 A: K& X4 }: _/ W# h5 q3 C* X
RegisterClass (&wndclass) ;
+ o# |' G4 S2 |+ j+ U
1 r  w0 J' r3 W 同时,还要书写好消息处理函数SomeWndProc。 1 K# Y. z) i3 t9 V# _
二、在对话框模板中添加自定义控件窗口:
$ w2 J6 G  k4 U- L; L. j, M
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
/ z5 z: D$ A4 r2 D- _! B' J
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-1 22:53 , Processed in 0.017186 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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