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

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html
7 u( H4 `* v+ B! _% I& J
0 m. e( e$ h  f一、概述:
/ j, x& _- a9 v4 L' G. Y( z在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。; y. T1 {& U& ^3 x" o" H' p
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。
9 k  e; W* }" @; p% p! y4 H# e6 `% E8 n  F: O2 d6 C
我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
! R. z8 N: }# C6 q- y但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。
' {' V, t; R  l5 m
, w# t/ t* O7 l- m 二、书写一个“真正的”窗口消息处理函数:
; Q, e) [7 s2 w- U按照普通窗口的方式书写好消息处理函数。
+ b( g: @7 d! F: m/ l; {1 c(不要漏掉了DefWindowProc)
6 ?: w5 y- `& T/ o/ k% a$ d% G% R; D7 T' \8 J" m
三、注册窗口类3 E, ~1 z  D/ F5 o! l
用书写的消息处理函数注册一个窗口类。) I: j6 A* k, R/ n* `

/ W* w7 L8 A* V+ c 四、建立对话框资源,指定窗口类为自定的窗口类。7 h  h" `" J5 S& S( Q
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
( p8 v. M$ |" G- p5 F(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")4 b. F; h% W$ q& p6 }$ q# K( o
例:  g8 y1 j8 i3 O& @& o$ C
建立文件Some.dlg
' f; |3 }' P' W' U9 @- d书写:
, @4 j* ]0 W( `; X; T' t( iHexCalc DIALOG -1, -1, 102, 122# ~" o5 X  q- @) y1 C1 b

1 V  Q' ?0 u+ O; [# ESTYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
* d( D. x* P1 c4 Q
4 a; j& z# f+ @+ K; w& LCLASS "HexCalc"    //填写上自己注册的类名称
% t3 T$ I6 |- G! w; @/ k' R: _0 I
6 @0 \& O% W8 }- J# @5 l% PCAPTION "Hex Calculator"1 t# P8 p- g! Y" _  d7 a

$ m8 r+ V' t- n# a/ j7 j) Z" `{; _  v( O0 g2 |/ _

* O5 @  w3 J) O  [" g        PUSHBUTTON "D",       68,  8,  24, 14, 14
" q( H. L4 i6 i7 _3 N
. h5 @- l) K" Q2 i        PUSHBUTTON "A",       65,  8,  40, 14, 14& {  l8 N' f7 m+ h
6 k: Y5 E- W, z9 w- k
        //各种控件6 y/ `+ _  g3 K1 l# i$ A! l
/ z3 O' q, ~% U
} 9 s! e. L* W2 M2 t& N
0 |: D2 M8 d3 e; p/ o/ S
五、使用非模式对话框方式建立主窗口:! P  T; k* y2 d2 G% k) ?
建立主窗口的时候,使用CreateDialog。8 h2 ]/ }9 O* ?' x' R
hwnd = CreateDialog (
0 R4 }- A# v! }0 u                     hInstance,
' h( T; E, o. p, x( d. j9 m; m' h2 ^                     szAppName,        //对话框模板
' Y- [7 R/ {- F- p                     0,8 h5 S$ D" _) c! b, z
                     NULL) ;& M8 [- Q$ ?' u' }# e: G
ShowWindow (hwnd, iCmdShow) ;, H3 E. q! J$ u& b2 |. J& s6 L

" W5 ]' D1 F" O 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
# v/ Z( e( k( }7 {$ Y  Y
Ⅱ.在对话框中建立自定义子窗口

( w( n1 e- z5 F8 j' l
可以自己定义控件,然后在对话框模板中使用: ?" a* Z0 e1 W$ Y" I: J
& l: n2 f; A) l7 K- g
一、定义"窗口类"与消息处理函数:: |; V" M  |. I' V* ?; X. \+ I: q
在WinMain中
  u6 P' g- W% F% x& O- |. n  s1 M除了注册主窗口类外,$ E. h  K8 B% o" G: r
另外注册用于对话框的类,指明类对应的消息处理函数
' |* k2 W1 n1 J* R  s, c* fwndclass.style         = CS_HREDRAW | CS_VREDRAW ;/ x+ c, l& Q" d% j' t
wndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数
! L) ?; _$ q* N5 O7 Cwndclass.cbClsExtra    = 0 ;* H7 a, }( v& ?! r. R
wndclass.cbWndExtra    = 0 ;
7 }8 q# y7 _& I4 \6 t8 J0 |wndclass.hInstance     = hInstance ;6 N* L* I' _; `0 s& E" E  g9 n
wndclass.hIcon         = NULL ;2 k0 N$ h8 j0 h
wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  P% p% G$ Y; f6 zwndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
7 Z) y1 s. g) ~  A# |  _" ?1 ywndclass.lpszMenuName  = NULL ;
6 E3 ?4 _! I# @" F1 @2 twndclass.lpszClassName = TEXT ("SomeControl") ;! y' o  L7 X6 \! P# O
RegisterClass (&wndclass) ;
5 t  e, S# o( Q0 Q8 e3 Y' |  ^1 K/ H8 ^) u/ }7 [: k
同时,还要书写好消息处理函数SomeWndProc。 8 _8 l- l; W3 R  a5 A+ m
二、在对话框模板中添加自定义控件窗口:8 U4 l5 H: f; `* w8 v$ ^
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
! H% w( U# l5 }. c) y& O! i
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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