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

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

[复制链接]
发表于 2011-5-16 20:33:18 | 显示全部楼层 |阅读模式
原文:http://www.th7.cn/Article/bc/VC/200702/10177.html" O7 e2 C& b, v* ~7 b, ^
$ W# N; N) l( M6 O$ K# b% A9 {
一、概述:" E" J% Y3 [" T0 M1 }
在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。0 Z/ ~/ v, z9 b7 h( [/ F5 @0 X* t$ x
使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。
( ?3 R' Z9 Q% j% N. q& b+ K; a. e+ D7 Q' L5 r  _
我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。) {9 M4 Z( J, P) h6 b
但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。
3 F* U# ]+ ?' d0 V3 A2 @: W* F; |* V; i
二、书写一个“真正的”窗口消息处理函数:
  [: \/ ~, t- `9 e1 c. A  @按照普通窗口的方式书写好消息处理函数。
' p. _3 n- N3 [0 v: p& m' @0 |(不要漏掉了DefWindowProc)$ h$ ]' e2 V5 K8 W
2 D, g( `# X) F* ?- [9 m& g* _% m( g
三、注册窗口类
% E4 d0 X( n8 \用书写的消息处理函数注册一个窗口类。3 ^+ f% j+ q+ U. v  A- Z

' b0 y& L* D3 j$ ` 四、建立对话框资源,指定窗口类为自定的窗口类。( V& C# R' B/ n0 S8 L- M7 `
手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
3 z3 T5 \- a4 {0 A  ?(使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")
* @+ p+ M" c0 U  V) U2 `例:
2 C& [0 a$ K  E7 j* I建立文件Some.dlg
( F- |. Q9 |: G5 b  }, Z书写:
0 g, j0 ^- q" LHexCalc DIALOG -1, -1, 102, 122. A# v3 L9 O) k3 j: Q7 I& J

, {0 D& o- ^+ W9 sSTYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX. k9 l  i3 V* o5 J4 D
& Z: {% r4 V  X$ c' C; `0 `0 \
CLASS "HexCalc"    //填写上自己注册的类名称
* R/ l+ o& m! \% V* Y! C/ i, E
; E. n! Y4 D; w/ v. M+ ?CAPTION "Hex Calculator"
* C6 F2 W4 ?  S" d- X" j! y& y! M3 W8 U1 a8 F) |  L
{
& e& L+ ]7 I" X  F. E
3 I. U5 R% r( K# V        PUSHBUTTON "D",       68,  8,  24, 14, 145 R& S' e, E8 r& V1 \
# D! A" m7 [- f& S. b
        PUSHBUTTON "A",       65,  8,  40, 14, 14
# v7 ?5 T  i/ {) X  @& w# g3 v) s4 @9 ^5 t
        //各种控件. T8 [8 _9 A# f2 ?4 B
6 y: U/ L/ q) T; f' R
} ; S- I' @, W. M# i
9 Q3 L* P# v6 O8 k+ [& J1 u
五、使用非模式对话框方式建立主窗口:. X( T0 A4 }2 C; G- i
建立主窗口的时候,使用CreateDialog。/ h. j; a# a4 b0 H
hwnd = CreateDialog (
$ y! r$ s$ K8 t4 F                     hInstance,
6 X4 `+ V. ?( b4 W7 K6 [5 \                     szAppName,        //对话框模板
7 K1 ]1 K1 j7 A2 L4 g: S                     0,! Z2 I) g3 Z" z$ d1 J- h9 ~% {
                     NULL) ;6 N, H( l' f" e$ I9 I
ShowWindow (hwnd, iCmdShow) ;
. B: F3 o5 D2 ?( r3 g
/ P3 J  K. r7 t8 T0 c' x6 Y 其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。+ e+ G; C6 ?6 P5 r# f5 H
Ⅱ.在对话框中建立自定义子窗口

8 y4 S$ [7 K) C+ }8 i) ~
可以自己定义控件,然后在对话框模板中使用/ t) a! ^% i! {, m% r

( T$ w; e8 k7 K 一、定义"窗口类"与消息处理函数:: y8 z2 e* _5 M6 N. z* w" x& P8 K
在WinMain中
$ v0 z0 B* `* o8 u除了注册主窗口类外,& @- o/ I/ T& b/ Z4 F7 I
另外注册用于对话框的类,指明类对应的消息处理函数, k6 w8 C) R, p( N5 Z
wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
1 F* s( y; F  h; U" Swndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数
# z+ q) F$ b, ]0 |/ S7 b! O  uwndclass.cbClsExtra    = 0 ;  l/ g* s- L( o0 j0 V& u- B; f
wndclass.cbWndExtra    = 0 ;1 x; @8 F4 l6 z2 o9 H9 e4 Q
wndclass.hInstance     = hInstance ;
! p& Y0 z( n# Bwndclass.hIcon         = NULL ;
$ B( f  c" D! ]& s# rwndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
8 B  j- a) A4 W( v' y9 T6 Pwndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
6 {: \& Q/ v; Hwndclass.lpszMenuName  = NULL ;8 S$ F" h0 Z4 S$ h, {0 ~: j
wndclass.lpszClassName = TEXT ("SomeControl") ;
/ o% c' s! R2 G$ V8 H0 \6 |RegisterClass (&wndclass) ;  E9 _2 O; A; L

% n& ~$ ^! k& Z( t 同时,还要书写好消息处理函数SomeWndProc。
9 j+ j& t7 }% L/ s
二、在对话框模板中添加自定义控件窗口:2 |! O0 }9 \5 h
在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。/ P& m  ]+ m2 L- A& }9 U
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-14 00:54 , Processed in 0.018378 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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