没有合适的资源?快使用搜索试试~ 我知道了~
VC++实例详解-6(不可多得的MFC教程)
需积分: 34 24 下载量 76 浏览量
2009-05-23
20:41:16
上传
评论
收藏 907KB PDF 举报
温馨提示
试读
36页
VC++实例详解(不可多得的MFC教程)这是一本不可多得的MFC教程,由于太大我只好分多次次上传
资源推荐
资源详情
资源评论
下载
第 6 章 视
S D I 和M D I应用程序的视是用户与应用程序(特别是应用程序正在编辑的文档)交互的主要
方式。本章的所有实例都涉及到视,从创建属性表的视、打印视到向视拖放文件等等。这些
实例包括:
实例15 创建标签窗体视,本例将创建具有属性表的视。
实例16 创建一个简单组合框的视,作为视的通用控件,本例中将看到如何创建控件视
(按钮、列表框和编辑框都是控件)。
实例17 打印报表,使用MFC CVi e w类的内置功能打印报表。
实例18 打印视,自动地捕获应用程序的屏幕图像然后打印。
实例19 绘制M D I客户视(MDI Client Vi e w),在本例中将看到一种为M D I应用程序的普通
背景添加颜色和模式的方法。背景是 M D I的客户视,是M D I 应用程序的视驻足的地方。
实例20 拖放文件到视,然后打开拖放到视中的文件。
6.1 实例15:创建标签窗体视
1. 目标
创建一个标签窗体视,使其包含几个对话框模板,如图 6 - 1所示。
2. 策略
从C S c r o l l Vi e w派生自己的视
类,在这个视类中简单地创建表单
控件窗口。
3. 步骤
1) 为标签窗体视创建页面
用Dialog Editor创建一个或者一
个以上的对话框模板,使之成为标
签视的页面。并将它们的风格设置
为细边框的子窗口。这些页面的窗
口标题将成为出现在其标签中的名
字。
使用Class Wi z a r d为这些页面创建类并将其从 C P r o p e r t y P a g e类派生。
2) 创建标签窗体视类
用Class Wi z a r d 创建派生于C S c r o l l Vi e w 的新类。
在该新类中嵌入属性表变量,如下所示:
// WzdTa b b e d Vi e w. h
p r i v a t e :
CPropertySheet m_sheet;
在该类中再嵌入一个按钮控件,它将成为 A p p l y 按钮:
图6-1 标签窗体视
视中的属
性页
CButton m_button;
属性表一般创建自己的 A p p l y按钮,但这仅在创建有模式对话框的情况下。因此必须动态
地为该视类增加自己的A p p l y按钮。
用Class Wi z a r d为该类添加W M _ C R E AT E 消息处理函数。在此创建该属性表和 A p p l y按钮,
并将先前创建的属性页类添加到该属性表之中:
int CWzdTa b b e d View::OnCreate( LPCREATESTRUCT lpCreateStruct )
{
if ( CScrollView::OnCreate( lpCreateStruct ) == -1 )
return -1;
// create property sheet
m_sheet.AddPage( &m_pageOne );
m_sheet.AddPage( &m_pageTwo );
m_sheet.Create( this,WS_CHILD|WS_VISIBLE );
// create apply button
CRect rect ( 0,0,10,10 );
CFont *pFont =
CFont::FromHandle( ( HFONT )::GetStockObject( ANSI_VAR_FONT ) );
m_button.Create( "&Apply", WS_VISIBLE | WS_CHILD, rect, this,
I D C _ W Z D _ A P P LY );
m_button.SetFont( pFont );
return 0;
}
注意,现在不必关心这些控件放在哪儿或者有多大,以后将移动它们。
用Class Wi z a r d重载该新Vi e w类的O n I n i t U p d a t e ( )函数。首先移动属性表和 A p p l y按钮并且
改变其大小。然后用 C S c r o l l Vi e w : : R e s i z e P a r e n t To F i t ( ) 函数缩小包围它们的视,在此首先用
S e t S c r o l l S i z e ( )函数告诉C S c o l l Vi e w 视的大小:
void CWzdTa b b e d Vi e w : : O n I n i t i a l U p d a t e ( )
{
C S c r o l l Vi e w : : O n I n i t i a l U p d a t e ( ) ;
// home the property sheet
CRect rect;
m_sheet.GetClientRect( &rect );
m _ s h e e t . M o v e Window( rect );
rect.bottom += BUTTON_HEIGTH + 10;
// move apply button into place
CRect brect( rect.right-BUTTO N _ W I D T H - 5 ,
r e c t . b o t t o m - B U T TO N _ H E I G T H - 5 ,
r e c t . r i g h t - 5 ,
rect.bottom-5 );
m _ b u t t o n . M o v e Window( brect );
// size child frame around property sheet
SIZE size = { rect.Width(), rect.Height() };
144第第第二部分第用户界面实例
下载
SetScrollSizes( MM_TEXT, size );
R e s i z e P a r e n t ToFit( FALSE );
// make sure the scroll bars are gone
SetScrollSizes( MM_TEXT, CSize( 20,20 ) );
// copy document into property pages
m_pageOne.m_bWzd1 = ( ( CWzdDoc* )GetDocument() ) -> m_bWzd1;
m _ p a g e Two.m_sEdit = ( ( CWzdDoc* )GetDocument() ) -> m_sEdit;
}
最后要完成的工作是用文档中的值初始化属性页的值,这将涉及许多其他的工作。
由于属性表和按钮控件并不覆盖所有的视,所以需要绘制视的背景。为此,用 C l a s s
Wi z a r d 为该类添加 W M _ E R A S E B K G N D 消息处理函数,并用系统按钮的表面颜色如下绘制
背景:
BOOL CWzdTa b b e d View::OnEraseBkgnd(CDC* pDC)
{
CPen pen( PS_SOLID, 0, GetSysColor( COLOR_BTNFACE ) );
CPen *pPen = pDC -> SelectObject( &pen );
CBrush brush( GetSysColor( COLOR_BTNFACE ) );
CBrush *pBrush = pDC -> SelectObject( &brush );
CRect rect;
GetClientRect( &rect );
pDC -> Rectangle( rect );
pDC -> SelectObject( pPen );
pDC -> SelectObject( pBrush );
return TRUE;
}
为A p p l y 按钮添加消息处理函数。这可以通过手工来完成,或者使用与按钮相同的命令标
识符创建A p p l y 菜单选项,然后用 C l a s s Wi z a r d 自动地为自己的视类增加消息处理函数,并通
知属性表更新其页面。即使属性表以无模式对话框的方式使用 (在这种情况下没有A p p l y按钮),
也可以通过C P r o p e r t y S h e e t的P r e s s B u t t o n ( )函数按照下述方法访问该按钮的功能:
void CWzdTa b b e d Vi e w : : O n W z d A p p l y ( )
{
m_sheet.PressButton( PSBTN_APPLYNOW );
( ( CWzdDoc* )GetDocument() ) -> m_bWzd1 = m_pageOne.m_bWzd1;
( ( CWzdDoc* )GetDocument() ) -> m_sEdit = m_pageTw o . m _ s E d i t ;
}
最后要完成的工作是从属性页中将变量值拷贝到文档,这里也有许多其他工作要做。
参考程序清单
—
标签窗体视类可查看该类的完整代码列表。
3) 实现新标签窗体视类
在应用程序类的I n i t I n s t a n c e ( )函数中替换新类,如下所示:
C M u l t i D o c Template* pDocTe m p l a t e ;
p D o c Template = new CMultiDocTe m p l a t e (
第 6 章第视第第145
下载
I D R _ W Z D T Y P E ,
RUNTIME_CLASS( CWzdDoc ),
RUNTIME_CLASS( CChildFrame ),
RUNTIME_CLASS( CWzdTa b b e d View ) ); <<<<<<<< ADD HERE
A d d D o c Template( pDocTemplate );
可以删除由App Wi z a r d所创建的任何视类。
为了避免用户重新设置视的大小,需要修改 M a i n F r a m e 或者C h i l d F r a m e类的P r e C r e a t e
Wi n d o w ( )函数:
BOOL CChildFrame::PreCreateWindow( CREATESTRUCT& cs )
{
// removes min/max boxes
cs.style &= ~( WS_MAXIMIZEBOX|WS_MINIMIZEBOX );
// makes dialog box unsizable
cs.style &= ~WS_THICKFRAME;
return CMDIChildWnd::PreCreateWindow( cs );
}
4. 注意
为什么要从 C S c r o l l Vi e w 类而不是从 C Vi e w 类派生新类呢?因为这样做可以使用
C S c r o l l View:: ResizeParentTo F i t ( )函数来缩小包围属性表和按钮的视。
5. 使用光盘时注意
执行随书附带光盘中的工程,可以注意到视实际上是包含属性页的属性表。
6. 程序清单——标签窗体视类
#if !defined(AFX_WZDTA B B E D V I E W _ H _ _ 9 A 0 B 9 5 0 4 _ E 0 4 3 _ 11 D 1 _ 9 B 7 7 _ 0 0 A A 0 0 3 D 8 6 9 5 _ _ I N C L U D E D _ )
#define AFX_WZDTA B B E D V I E W _ H _ _ 9 A 0 B 9 5 0 4 _ E 0 4 3 _ 11 D 1 _ 9 B 7 7 _ 0 0 A A 0 0 3 D 8 6 9 5 _ _ I N C L U D E D _
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
// WzdTa b b e d Vi e w.h : header file
/ /
#include "PageOne.h"
#include "PageTw o . h "
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
// CWzdTa b b e d V iew view
class CWzdTa b b e d View : public CScrollVi e w
{
p r o t e c t e d :
C W z d Ta b b e d View(); // protected constructor used by dynamic creation
D E C L A R E _ D Y N C R E ATE( CWzdTa b b e d View )
// Attributes
p u b l i c :
146第第第二部分第用户界面实例
下载
// Operations
p u b l i c :
// Overrides
// ClassWizard generated virtual function overrides
// {{AFX_VIRTUAL( CWzdTa b b e d V iew )
p r o t e c t e d :
virtual void OnDraw( CDC* pDC ); // overridden to draw this view
virtual void OnInitialUpdate(); // first time after construct
// }}AFX_VIRT U A L
// Implementation
p r o t e c t e d :
virtual ~CWzdTa b b e d Vi e w ( ) ;
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump( CDumpContext& dc ) const;
# e n d i f
// Generated message map functions
// {{AFX_MSG(CWzdTa b b e d Vi e w )
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnWzdApply();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
// }}AFX_MSG
D E C L A R E _ M E S S A G E _ M A P ( )
p r i v a t e :
CButton m_button;
CPageOne m_pageOne;
C P a g e Two m_pageTw o ;
CPropertySheet m_sheet;
} ;
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
// {{AFX_INSERT _ L O C AT I O N } }
// Microsoft Developer Studio will insert additional declarations immediately
// before the previous line.
# e n d i f
/ / ! d e f i n e d ( A F X _ W Z D TA B B E D V I E W _ H _ 9 A 0 B 9 5 0 4 _ E 0 4 3 _ 11 D 1 _ 9 B 7 7 _ 0 0 A A 0 0 3 D 8 6 9 5 _ _ I N C L U D E D _ )
// WzdTa b b e d Vi e w.cpp : implementation file
/ /
#include "stdafx.h"
#include "wzd.h"
#include "WzdDoc.h"
#include "WzdTa b b e d Vi e w. h "
#ifdef _DEBUG
第 6 章第视第第147
下载
剩余35页未读,继续阅读
资源评论
weiguo_star
- 粉丝: 15
- 资源: 30
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功