精华内容
下载资源
问答
  • 计算机图形学立方体三维变换
    2022-01-18 10:33:05
    
    // 02View.h: CMy02View 类的接口
    //
    
    #pragma once
    #include"CFace.h"
    #include"cp3.h"
    #include"CTransform.h"
    class CMy02View : public CView
    {
    protected: // 仅从序列化创建
    	CMy02View() noexcept;
    	DECLARE_DYNCREATE(CMy02View)
    
    // 特性
    public:
    	CMy02Doc* GetDocument() const;
    
    // 操作
    public:
    	CRect rect;
    	cp3 V[8];
    	CFace F[6];
    	CTransform T;
    	void SetPoint();
    	void SetFace();
    	void DrawObject(CDC* pDC);
    	cp2 Project(cp3);
    // 重写
    public:
    	virtual void OnDraw(CDC* pDC);  // 重写以绘制该视图
    	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    protected:
    	virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
    	virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
    	virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
    
    // 实现
    public:
    	virtual ~CMy02View();
    #ifdef _DEBUG
    	virtual void AssertValid() const;
    	virtual void Dump(CDumpContext& dc) const;
    #endif
    
    protected:
    
    // 生成的消息映射函数
    protected:
    	afx_msg void OnFilePrintPreview();
    	afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
    	afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
    	DECLARE_MESSAGE_MAP()
    public:
    	afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
    };
    
    #ifndef _DEBUG  // 02View.cpp 中的调试版本
    inline CMy02Doc* CMy02View::GetDocument() const
       { return reinterpret_cast<CMy02Doc*>(m_pDocument); }
    #endif
    
    
    
    // 02View.cpp: CMy02View 类的实现
    //
    
    #include "pch.h"
    #include "framework.h"
    // SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的
    // ATL 项目中进行定义,并允许与该项目共享文档代码。
    #ifndef SHARED_HANDLERS
    #include "02.h"
    #endif
    
    #include "02Doc.h"
    #include "02View.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    
    // CMy02View
    
    IMPLEMENT_DYNCREATE(CMy02View, CView)
    
    BEGIN_MESSAGE_MAP(CMy02View, CView)
    	// 标准打印命令
    	ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
    	ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
    	ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CMy02View::OnFilePrintPreview)
    	ON_WM_CONTEXTMENU()
    	ON_WM_RBUTTONUP()
    	ON_WM_KEYDOWN()
    END_MESSAGE_MAP()
    
    // CMy02View 构造/析构
    
    CMy02View::CMy02View() noexcept
    {
    	// TODO: 在此处添加构造代码
    	SetPoint();
    	SetFace();
        T.SetMat(V, 8);
    }
    
    CMy02View::~CMy562291102View()
    {
    }
    
    BOOL CMy02View::PreCreateWindow(CREATESTRUCT& cs)
    {
    	// TODO: 在此处通过修改
    	//  CREATESTRUCT cs 来修改窗口类或样式
    
    	return CView::PreCreateWindow(cs);
    }
    
    // CMy562291102View 绘图
    
    void CMy02View::OnDraw(CDC* pDC)
    {
    	CMy02Doc* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
    	if (!pDoc)
    		return;
    	
    	GetClientRect(&rect);//获得客户区矩形
    	pDC->SetMapMode(MM_ANISOTROPIC);//设置映射模式
    	pDC->SetWindowExt(rect.Width(), rect.Height());//设置窗口
    	pDC->SetViewportExt(rect.Width(), -rect.Height());//设置视区;
    	pDC->SetViewportOrg(rect.Width() / 2, rect.Height() / 2);//
    	rect.OffsetRect(-rect.Width() / 2, -rect.Height() / 2);//客户区矩形矫正
    	DrawObject(pDC);
    	// TODO: 在此处为本机数据添加绘制代码
    }
    
    
    // CMy02View 打印
    
    
    void CMy02View::OnFilePrintPreview()
    {
    #ifndef SHARED_HANDLERS
    	AFXPrintPreview(this);
    #endif
    }
    
    BOOL CMy02View::OnPreparePrinting(CPrintInfo* pInfo)
    {
    	// 默认准备
    	return DoPreparePrinting(pInfo);
    }
    
    void CMy02View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
    	// TODO: 添加额外的打印前进行的初始化过程
    }
    
    void CMy02View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
    	// TODO: 添加打印后进行的清理过程
    }
    
    void CMy02View::OnRButtonUp(UINT /* nFlags */, CPoint point)
    {
    	ClientToScreen(&point);
    	OnContextMenu(this, point);
    }
    
    void CMy02View::OnContextMenu(CWnd* /* pWnd */, CPoint point)
    {
    #ifndef SHARED_HANDLERS
    	theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE);
    #endif
    }
    
    
    // CMy02View 诊断
    
    #ifdef _DEBUG
    void CMy02View::AssertValid() const
    {
    	CView::AssertValid();
    }
    
    void CMy02View::Dump(CDumpContext& dc) const
    {
    	CView::Dump(dc);
    }
    
    CMy02Doc* CMy02View::GetDocument() const // 非调试版本是内联的
    {
    	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMy02Doc)));
    	return (CMy02Doc*)m_pDocument;
    }
    #endif //_DEBUG
    
    
    // CMy02View 消息处理程序
    void CMy02View::SetPoint()
    {
    	int a = 100;
    	V[0].x = 0, V[0].y = 0, V[0].z = 0;
    	V[1].x = a, V[1].y = 0, V[1].z = 0;
    	V[2].x = a, V[2].y = a, V[2].z = 0;
    	V[3].x = 0, V[3].y = a, V[3].z = 0;
    	V[4].x = 0, V[4].y = 0, V[4].z = a;
    	V[5].x = a, V[5].y = 0, V[5].z = a;
    	V[6].x = a, V[6].y = a, V[6].z = a;
    	V[7].x = 0, V[7].y = a, V[7].z = a;
    }
    void CMy02View::SetFace()
    {
    	F[0].SetNum(4); F[0].VI[0] = 4; F[0].VI[1] = 5; F[0].VI[2] = 6; F[0].VI[3] = 7;//前面点的序号
    	F[1].SetNum(4); F[1].VI[0] = 0; F[1].VI[1] = 3; F[1].VI[2] = 2; F[1].VI[3] = 1;//后
    	F[2].SetNum(4); F[2].VI[0] = 0; F[2].VI[1] = 4; F[2].VI[2] = 7; F[2].VI[3] = 3;//左
    	F[3].SetNum(4); F[3].VI[0] = 1; F[3].VI[1] = 2; F[3].VI[2] = 6; F[3].VI[3] = 5;//右
    	F[4].SetNum(4); F[4].VI[0] = 0; F[4].VI[1] = 1; F[4].VI[2] = 5; F[4].VI[3] = 4;//下
    	F[5].SetNum(4); F[5].VI[0] = 2; F[5].VI[1] = 3; F[5].VI[2] = 7; F[5].VI[3] = 6;//上
    }
    void CMy02View::DrawObject(CDC* pDC)
    {
    	pDC->MoveTo(0, 0);
    	pDC->LineTo(rect.Width() / 2, 0);
    	pDC->MoveTo(0, 0);
    	pDC->LineTo(0, rect.Height() / 2);
    	cp3 Z;
    	cp2 X;
    	Z.x = 0;
    	Z.y = 0;
    	Z.z = rect.Width() / 2;
    	X = Project(Z);
    	pDC->MoveTo(0, 0);
    	pDC->LineTo(X.x, X.y);
    	int i, j;
    	cp2 SP,pt;
    	for(i=0;i<6;i++)//面循环
    		for (j = 0;j < 4;j++)
    		{
    			SP=Project(V[F[i].VI[j]]);
    			if (j == 0)
    			{	//移动到起到
    				pDC->MoveTo(SP.x, SP.y);//当前点
    				pt = SP;
    			}
    			else
    				//画到下一个点
    				pDC->LineTo(SP.x, SP.y);
    		}
    	pDC->LineTo(pt.x, pt.y);
    }
    cp2 CMy02View::Project(cp3 P)
    {
    	//正交投影
    	cp2 ScreenP;
    	/*ScreenP.x = P.x;
    	ScreenP.y = P.y;*/
    	//斜投影
    	/*ScreenP.x = P.x-P.z*0.707;
    	ScreenP.y = P.y - P.z * 0.707;*/
    	//斜二测投影
    	//ScreenP.x = P.x - P.z * 0.3536;
    	//ScreenP.y = P.y - P.z * 0.3536;
    	ScreenP.x = P.x - P.z * sqrt(2);
    	ScreenP.y = P.y - P.z * sqrt(2);
    	//透视投影
    	return ScreenP;
    }
    
    
    void CMy02View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
    	// TODO: 在此添加消息处理程序代码和/或调用默认值
    	switch (nChar)
    	{
    	case'W'://向上平移
    	case VK_UP:
    		T.Translate(0,10,0);break;
    	case'S'://向下平移
    	case VK_DOWN:
    
    		T.Translate(0, -10,0);break;
    	case'N'://向左平移
    	case VK_LEFT:
    		T.Translate(-10, 0,0);break;
    	case'D'://向右平移
    	case VK_RIGHT:
    
    		T.Translate(10, 0,0);break;
    	case'H'://向前平移
    		T.Translate(0, 0, 10);break;
    	case'V'://向后平移
    		T.Translate(0, 0, -10);break;
    	case'A'://等比例放大
    	case VK_F1:
    		T.Scale(1.5, 1.5,1.5);break;
    	case'B'://等比例缩小
    	case VK_F2:
    		T.Scale(0.5, 0.5,0.5);break;
    	case'E'://X复合旋转
    	case VK_F3:
    
    		T.RotateX(30);break;
    	case'F'://Y复合旋转
    	case VK_F4:
    
    		T.RotateY(-30);break;
    	case'1':
    		T.RotateZ(30);break;
    	case'G'://关于xoy轴反射变换
    	case VK_F5:
    
    		T.ReflectXOY();break;
    	case'T'://关于yoz轴反射变换
    	case VK_F6:
    
    		T.ReflectYOZ();break;
    	case'I'://关于zox反射变换
    	case VK_F7:
    
    		T.ReflectZOX();break;
    	case'J'://X轴正向错切变换
    	case VK_F8:
    
    		T.ShearX(1, 1);break;
    	case'K'://Y轴正向错切变换
    	case VK_F9:
    
    		T.ShearY(1, 1);break;
    	case'M'://Z轴正向错切变换
    	case VK_F10:
    
    		T.ShearZ(1, 1);break;
    	case'Q'://Y轴负向错切变换
    	case VK_F11:
    
    		SetPoint();
    	}
    	Invalidate();
    	CView::OnKeyDown(nChar, nRepCnt, nFlags);
    }
    
    #pragma once
    class CFace
    {
    public:
        CFace(void);
        ~CFace(void);
        void SetNum(int vn);
    public:
        //顶点数量
        int VNum;
        //保存若干个整形序号,动态数组
        int *VI;
     
    };
    
    #include "pch.h"
    #include "CFace.h"
    CFace::CFace()
    {
    	//VI = new int(VNum);//定义整型变量,变量的值
    	VI = NULL;
    }
    CFace::~CFace()
    {
    	
    }
    void CFace::SetNum(int vn)
    {
    	VI = new int[vn];//定义整形数组,括号里数组的元素个数
    	VNum = vn;
    }
    #pragma once
    class cp2
    {
    public:
    	cp2(void);
    	~cp2(void);
    	cp2(double x, double y);//带参构造
    public:
    	double x;
    	double y;
    	double w;
    
    };
    
    #include "pch.h"
    #include "cp2.h"
    cp2::cp2()
    {
    	w = 1;
    }
    cp2::~cp2()
    {
    
    }
    cp2::cp2(double x, double y)
    {
    	this->x = x;
    	this->y=y;
    	w = 1;
    }
    
    #pragma once
    #include"cp2.h"
    class cp3:
    	public cp2
    {
    public:
    	cp3(void);
    	~cp3(void);
    	cp3(double x, double y,double z);//带参构造
    public:
    	/*double x;
    	double y;*/
    	double z;
    };
    
    #include "pch.h"
    #include "cp3.h"
    cp3::cp3()
    {
    
    }
    cp3::~cp3()
    {
    
    }
    cp3::cp3(double x, double y, double z) :cp2(x, y)
    {
    	this->z = z;
    }
    #pragma once
    #include"cp3.h"
    class CTransform
    {
    public:
    	CTransform();
    	~CTransform();
    	void SetMat(cp3*, int n);
    	void Identity();//初始化二维数组
    	void Translate(double dx, double dy, double dz);//平移变换矩阵
    	void Scale(double, double, double);//比例变换矩阵
    	void RotateX(double);//x轴旋转变换
    	void RotateY(double);//y轴旋转变换
    	void RotateZ(double);
    	void ReflectX();//x轴反射变换矩阵
    	void ReflectY();
    	void ReflectZ();
    	void ReflectXOY();//XOY面反射变换矩阵
    	void ReflectYOZ();
    	void ReflectZOX();
    	void ShearX(double,double);//x方向错切变换矩阵
    	void ShearY(double, double);
    	void ShearZ(double, double);
    	void MulMat();//矩阵相乘
    public:
    	double T[4][4];
    	cp3 * pOld;
    	int PNum;
    };
    
    #include "pch.h"
    #include "CTransform.h"
    #include"cp3.h"
    #define PI 3.1415926
    CTransform::CTransform(void) {
    
    }
    CTransform::~CTransform(void) {
    
    }
    void CTransform::SetMat(cp3* p, int n)
    {
    	pOld = p;
    	PNum = n;
    
    }
    void CTransform::Identity()
    {
    	/*T[0][0] = 1.0;T[0][1] = 0.0;T[0][2] = 0.0;T[0][3] = 0.0;
    	T[1][0] = 0.0;T[1][1] = 1.0;T[1][2] = 0.0;T[1][3] = 0.0;
    	T[2][0] = 0.0;T[2][1] = 0.0;T[2][2] = 1.0;T[2][3] = 0.0;
    	T[3][0] = 0.0;T[3][1] = 0.0;T[3][2] = 0.0;T[2][3] = 1.0;*/
    	T[0][0] = 1; T[0][1] = 0; T[0][2] = 0; T[0][3] = 0;
    	T[1][0] = 0; T[1][1] = 1; T[1][2] = 0; T[1][3] = 0;
    	T[2][0] = 0; T[2][1] = 0; T[2][2] = 1; T[2][3] = 0;
    	T[3][0] = 0; T[3][1] = 0; T[3][2] = 0; T[3][3] = 1;
    }
    void CTransform::MulMat()
    {
    	int i;
    	cp3* pNew = new cp3[PNum];
    	for (i = 0;i < PNum;i++)
    	{
    		pNew[i].x = pOld[i].x;
    		pNew[i].y = pOld[i].y;
    		pNew[i].z = pOld[i].z;
    		pNew[i].w = pOld[i].w;
    	}
    	for (i = 0;i < PNum;i++)
    	{
    		/*pOld[i].x = pNew[i].x * T[0][0]
    			+ pNew[i].y * T[1][0]
    			+ pNew[i].z * T[2][0]
    			+ pNew[i].w * T[3][0];
    		pOld[i].y = pNew[i].x * T[0][1]
    			+ pNew[i].y * T[1][1]
    			+ pNew[i].z * T[2][1]
    			+ pNew[i].w * T[3][1];
    		pOld[i].z = pNew[i].x * T[0][2]
    			+ pNew[i].y * T[1][2]
    			+ pNew[i].z * T[2][2]
    			+ pNew[i].w * T[3][2];
    		pOld[i].w = pNew[i].x * T[0][3]
    			+ pNew[i].y * T[1][3]
    			+ pNew[i].z * T[2][3]
    			+ pNew[i].w * T[3][3];*/
    		pOld[i].x = pNew[i].x * T[0][0] + pNew[i].y * T[1][0] + pNew[i].z * T[2][0] + pNew[i].w * T[3][0];
    		pOld[i].y = pNew[i].x * T[0][1] + pNew[i].y * T[1][1] + pNew[i].z * T[2][1] + pNew[i].w * T[3][1];
    		pOld[i].z = pNew[i].x * T[0][2] + pNew[i].y * T[1][2] + pNew[i].z * T[2][2] + pNew[i].w * T[3][2];
    		pOld[i].w = pNew[i].x * T[0][3] + pNew[i].y * T[1][3] + pNew[i].z * T[2][3] + pNew[i].w * T[3][3];
    	}
    	delete[]pNew;
    }
    void CTransform::Translate(double dx, double dy, double dz)//平移
    {
    	Identity();
    	T[3][0] = dx; T[3][1] = dy; T[3][2] = dz;
    	MulMat();
    }
    void CTransform::Scale(double sx, double sy,double sz)
    {
    	Identity();
    	T[0][0] = sx;T[1][1] = sy;T[2][2] = sz;
    	MulMat();
    }
    
    void CTransform::RotateX(double beta)
    {
    	Identity();
    	double rad = beta * PI / 180;
    
    	T[1][1] = cos(rad);T[1][2] = sin(rad);
    	T[2][1] = -sin(rad);T[2][2] = cos(rad);
    	MulMat();
    
    }
    void CTransform::RotateY(double beta)
    {
    	Identity();
    	double rad = beta * PI / 180;
    
    	T[0][0] = cos(rad);T[0][2] = -sin(rad);
    	T[2][0] = sin(rad);T[2][2] = cos(rad);
    	MulMat();
    }
    void CTransform::RotateZ(double beta)
    {
    	Identity();
    	double rad = beta * PI / 180;
    
    	T[0][0] = cos(rad);T[0][1] = sin(rad);
    	T[1][0] = -sin(rad);T[1][1] = cos(rad);
    	MulMat();
    }
    void  CTransform::ReflectX()
    {
    	Identity();
    	T[1][1] = -1;T[2][2] = -1;
    	MulMat();
    }
    void CTransform::ReflectY()
    {
    	Identity();
    	T[0][0] = -1;T[2][2] = -1;
    	MulMat();
    }
    
    void CTransform::ReflectZ()
    {
    	Identity();
    	T[0][0] = -1;T[1][1] = -1;
    	MulMat();
    }
    void CTransform::ReflectXOY()
    {
    	Identity();
    	T[2][2] = -1;
    	MulMat();
    }
    void CTransform::ReflectYOZ()
    {
    	Identity();
    	T[0][0] = -1;
    	MulMat();
    }
    void CTransform::ReflectZOX()
    {
    	Identity();
    	T[1][1] = -1;
    	MulMat();
    }
    void  CTransform::ShearX(double d, double g)
    {
    	Identity();
    	T[1][0] = d;T[2][0] = g;
    	MulMat();
    }
    void  CTransform::ShearY(double b, double h)
    {
    	Identity();
    	T[0][1] = b;T[2][1] = h;
    	MulMat();
    }
    void  CTransform::ShearZ(double c, double f)
    {
    	Identity();
    	T[0][1] = c;T[1][0] = f;
    	MulMat();
    }

    更多相关内容
  • 张明奇(卡哥)注释:成功版本  MFC文档/视图的应用程序,向导给了打印及打印预览的标准支持。使这类应用程序打印及打印预览工作得以简化。另一类对话框程序却没有相应支持,从MFC打印及打印预览的标准支持入手,...

    张明奇(卡哥)注释:成功版本

            MFC文档/视图的应用程序,向导给了打印及打印预览的标准支持。使这类应用程序打印及打印预览工作得以简化。另一类对话框程序却没有相应支持,从MFC打印及打印预览的标准支持入手,可以在对话框程序中,增加三个类以支持打印及打印预览,本文介绍了这三个类的实现。

            打印及打印预览是编写应用程序经常要解决的问题,为了理解VC++对话框程序的打印及打印预览实现,要先掌握基于文档/视图的应用程序打印及打印预览的基本原理。所以分为两部分介绍。

    一、基于文档/视图的应用程序的打印及打印预览原理

            VC++基于文档/视图的应用程序中用MFC应用程序向导在步骤4对话框中选中Print and Print Preview选项,可以包含基本打印及打印预览的支持,应用程序文件菜单中会生成两个菜单项分别是打印(标识符ID_FILE_PRINT)和打印预览(标识符:ID_FILE_PRINT_PREVIEW),展开程序源代码,可以发现,是Cview类提供标准打印和打印预览菜单命令的消息处理函数:

            设应用程序视图类为CMyView,展开MyView.cpp,其消息映象部分有如下两行:

    ON_COMMAND(ID_FILE_PRINT,CView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView::OnFilePrintPreview)

    CView::OnFilePrint 和CView::OnFilePrintPreview函数都进行打印操作,但View::OnFilePrint将实际发送到打印机,而CView::OnFilePrintPreview则将输出发送到程序窗口上方显示的预览窗口显示一个或两个打印页面的复制外观。利用上面加入的缺省打印支持,只能打印或预览图形的一个打印页面,一个页中放不下的部分则放弃,为了加强程序,使它打印整个图形,一页中放不下的部分放在另一页,可以通过覆盖几个打印期间调用的虚拟函数来完成。下图说明了整个打印和打印预览的过程,显示了每个虚拟函数在程序中哪个部分调用。注意每打印一个页面就要经历图中的一个循环。

     

    下表列出了虚拟函数并介绍了各自完成的任务,由于MFC打印或打印预览文档时都调用虚拟函数,所以定义的覆盖函数既影响打印也影响打印预览。

    二、对话框程序打印及打印预览的实现

            以上是基于文档/视图的应用程序的打印原理,可以根据需要从CView类派生出视图类覆盖打印及打印预览过程中的CView类的虚拟函数来定制文档/视图应用程序的打印及打印预览。在实际中,有很多基于对话框的应用程序,也需要提供打印及打印预览。但向导没有给基于对话框应用程序的基本支持。有了以上知识,可以构造出无文档的视图类,具体的实现时,增加三个类,用以支持打印及打印预览。以下用一具体实例说明。
     

    函数名()覆盖函数可能完成的任务
    CView::OnPreparePrinting()调用CprintInfo成员函数(如CprintInfo::SetMaxPage设置文档长度)或设置CprintInfo数据成员以影响Print对话框或打印预览操作,然后调用DoPreparePrinting生成用于打印或打印预览的设备描述表(注意必须覆盖OnPreparePrinting并调用DoPreparePrinting)
    --------------------- 
    作者:卡哥 
    来源:CSDN 
    原文:https://blog.csdn.net/L_Andy/article/details/8071768 
    版权声明:本文为博主原创文章,转载请附上博文链接!
    CView::OnBeginPrinting()分配专门用于打印的字体,画笔、画刷和其它对象,根据设备描述表计算并设置文档长,在设备描述表上存放所需的消息(这是第一个访问设备描述表的的虚拟函数)
    CView::OnPrepareDC()设置打印当前页面的文本或图形属性,修改视图原点,以打印当前页面,如果没有设置文档长度,在文档末尾终止打印循环(CprintInfo::m_bContinuePrinting赋值FALSE)
    CView::OnPrint()调用OnDraw进行输出;调用OnDraw前选择OnBeginPrinting分配的字体,调用OnDraw后取消对象,打印只出现在文档打印版中的页头和页脚,如果打印输出与屏幕输出的外观不同, 在这里打印,而不是调用OnDraw
    CView::OnEndPrinting()调用Cgdi::DeleteObject删除OnBeginPrinting分配的对象

     1.用MFC应用向导创建对话框应用程序,设主对话框类为CPrintPreviewDlg,在主对话框上放一按钮,(标题:打印预览,ID:IDC_PRINTPREVIEW_BUTTON),用类向导增加其BN_CLICKED的消息响应函数OnPrintPreviewButton生成打印预览界面
     

    void CPrintPreviewDlg::OnPrintPreviewButton()
    {
        CPrintFrame* pf = new CPrintFrame(this);
    }

          2、增加新类:

    用ClassWizard新建CPrintFrame类(基类CFrameWnd),功能上相当于文档/视图的应用程序的框架窗口类。
    用ClassWizard新建CPrintView类(基类CScrollView),功能上相当于文档/视图的应用程序的视图类。
    增加CPrintPreviewView类(基类CPreviewView,注意在头其定义头文件中加入包含afxpriv.h),用于打印预览界面的视图类。

            3、对新生成的各类修改如下:

    CPrintFrame类:

    ①增加公有数据成员

    CPrintPreviewDlg*    m_pOldWnd;        // 用于保存主对话框对象;
    CPrintView*              m_pView;              // 用于保存视图类对象;

    ②重载构造函数,保存对主对话框对象指针,创建窗口

    CPrintFrame::CPrintFrame(CPrintPreviewDlg* pOld)
    {
        m_pOldWnd = pOld;
        if ( !Create(NULL, "打印预览", WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, CRect(200, 200, 500, 500)))
            TRACE0("Failed to create view window! \n");
    }
    

    ③修改析构函数,让主对话框显示'

    CPrintFrame::~CPrintFrame()
    {
        m_pOldWnd->ShowWindow(SW_SHOW);
    }

    ④添加打印模式函数,设置A4纸纵向打印或横向打印(可以选择使用)

    #define   DMORIENT_PORTRAIT                           1       //纵向  
    #define   DMORIENT_LANDSCAPE                        2       //横向
    
    void SetLandscapeMode(int   PrintMode)  
    {   
        PRINTDLG   pd;   
        pd.lStructSize=(DWORD)sizeof(PRINTDLG);   
        BOOL   bRet=AfxGetApp()->GetPrinterDeviceDefaults(&pd);   
        if(bRet)   
        {   
            //   protect   memory   handle   with   ::GlobalLock   and   ::GlobalUnlock  
            DEVMODE   FAR   *pDevMode=(DEVMODE   FAR   *)::GlobalLock(pd.hDevMode);
            pDevMode->dmPaperSize=DMPAPER_A4;   //将打印纸设置为A4   
            //   set   orientation   to   landscape   
            if(PrintMode==1)     //纵向打印   
                pDevMode->dmOrientation = DMORIENT_PORTRAIT;   
            else   if(PrintMode==2)    //横向打印   
                pDevMode->dmOrientation = DMORIENT_LANDSCAPE;       
            ::GlobalUnlock(pd.hDevMode);   
        }   
    }  
    

    ⑤用ClassWizard增加WM_Create消息处理函数,关联CPrintView视图对象;调用其OnFilePrintPreview函数进行打印预览(若要直接打印,可直接向其发送消息);隐藏主对话框。

    nt CPrintFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
            return -1;
     
            // TODO: Add your specialized creation code here
            CCreateContext context;
            context.m_pNewViewClass = RUNTIME_CLASS(CPrintView);
            context.m_pCurrentFrame = this;
            context.m_pCurrentDoc = NULL;
            context.m_pLastView = NULL;
            m_pView = STATIC_DOWNCAST(CPrintView, CreateView(&context));
     
            if (m_pView != NULL)
            {
                m_pView->ShowWindow(SW_SHOW);
                SetActiveView(m_pView);
           //   SetLandscapeMode(DMORIENT_LANDSCAPE);
            }
    
            SetIcon(m_pOldWnd->GetIcon(FALSE), FALSE);
            SetIcon(m_pOldWnd->GetIcon(TRUE), TRUE);
            ShowWindow(SW_MAXIMIZE);
            CWinApp *pApp = AfxGetApp();
            pApp->m_pMainWnd = this;
            m_pView->OnFilePrintPreview();
            // m_pView->SendMessage(WM_COMMAND, ID_FILE_PRINT);  // 直接打印
            m_pOldWnd->ShowWindow(SW_HIDE);
     
            return 0;
    }
    

    ⑥添加WM_Close消息处理函数

    void CPrintFrame::OnClose()
    {
        // TODO: Add your message handler code here and/or call default
        CPrintFrame* pf=(CPrintFrame*)::AfxGetMainWnd(); 
        CWinApp *pApp=AfxGetApp();
        pApp->m_pMainWnd = pf->m_pOldWnd; 
        pf->DestroyWindow();
        // CFrameWnd::OnClose();
    }
    

    CPrintView类:

    ①修改构造函数:将坐标射模式置为缺省模式。

    CPrintView::CPrintView()
    
    {
        m_nMapMode = MM_TEXT;
    
    }

    ②增加消息映射实现打印。

    ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)

    ③重载虚函数OnPreparePrinting,调用DoPreparePrinting生成用于打印或打印预览的设备描述表。

    BOOL CPrintView::OnPreparePrinting(CPrintInfo* pInfo)
    {
        // TODO: call DoPreparePrinting to invoke the Print dialog box
        //pInfo->SetMaxPage(1);
        return DoPreparePrinting(pInfo);
        // return CLogScrollView::OnPreparePrinting(pInfo);
    }
    

     

    ④增加公有函数OnFilePrintPreview,调用DoPrintPreview实现打印预览,该函数需要传入四个参数:打印预览工具条资源ID,执行打印及打印预览的视图对象指针,打印预览界面视图类的 CRuntimeClass指针,打印预览状态类CPrintPreviewState对象指针。
     

    void CPrintView::OnFilePrintPreview()
    {
        CPrintPreviewState* pState = new CPrintPreviewState;
        pState->lpfnCloseProc = _AfxPrintPreviewCloseProc; //设置打印预览窗口关闭时的调用函数
        if (!DoPrintPreview(AFX_IDD_PREVIEW_TOOLBAR, this, RUNTIME_CLASS(CPrintPreviewView), pState))
        {
            TRACE0("Error, DoPrintPreview failed. \n");
            AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
            delete pState;
        }
    }
    

    ⑤一些其他函数的实现

    void CPrintView::OnInitialUpdate()
    {
    
     CScrollView::OnInitialUpdate();
    
     CSize sizeTotal;
     // TODO: 计算此视图的合计大小
     sizeTotal.cx = sizeTotal.cy = 100;
     SetScrollSizes(MM_TEXT, sizeTotal);
    
    }
    
    void CPrintView::OnDraw(CDC* pDC)
    {
        CDocument* pDoc = GetDocument();
        // TODO: add draw code here
    }
    
    void CPrintView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
    {
        // m_rectPrint = pInfo->m_rectDraw; 
    
        //进行打印的内容代码等;
        CLogScrollView::OnPrint(pDC, pInfo);
    }
    

    ⑥在PrintView.cpp文件中增加全局函数,_AfxMyPreviewCloseProc,当单击打印预览窗口关闭按钮时被调用。

    BOOL CALLBACK _AfxPrintPreviewCloseProc(CFrameWnd* pFrameWnd)
    {
        ASSERT_VALID(pFrameWnd);
        CPrintPreviewView* pView = (CPrintPreviewView*)pFrameWnd->GetDlgItem(AFX_IDW_PANE_FIRST);
        ASSERT_KINDOF(CPreviewView, pView);
        pView->OnPreviewClose();
        return FALSE;
    }
    

    CPrintPreviewView类:

    手动添加类CPrintPreviewView继承CPreviewView类,.h文件如下~

    #pragma once
    #include "afxpriv.h"
    
    #if !defined(AFX_MYPREVIEWVIEW_H__0AE8B670_B1AE_11DA_812E_00E04C39032F__INCLUDED_)
    
    #define AFX_MYPREVIEWVIEW_H__0AE8B670_B1AE_11DA_812E_00E04C39032F__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    #include <afxpriv.h>
    class CMyPreviewView : public CPreviewView 
    {
     DECLARE_DYNCREATE(CMyPreviewView)
    public:
     afx_msg void OnPreviewClose();
    protected:
     CMyPreviewView();
     virtual ~CMyPreviewView();
     void OnDraw(CDC* pDC);
     void OnEndPrintPreview(CDC* pDC, CPrintInfo* pInfo, POINT point, CPreviewView* pView);
     afx_msg void OnPreviewPrint( );
     DECLARE_MESSAGE_MAP( )
    };
    
    #endif // !defined(AFX_MYPREVIEWVIEW_H__0AE8B670_B1AE_11DA_812E_00E04C39032F__INCLUDED_)
    
    增加工具栏按钮的消息响应函数OnPreviewClose(),OnPreviewPrint() .cpp如下详尽代码
    
    #include "stdafx.h"
    #include ".\mypreviewview.h"
    #include "StatisticsCoverDlg.h"
    #include ".\statisticscoverdlg.h"
    #include  "PrintFrame.h"
    //#ifdef _DEBUG
    //#undef THIS_FILE
    //static char THIS_FILE[]=__FILE__;
    //#define new DEBUG_NEW
    //#endif
    
    //
    
    IMPLEMENT_DYNCREATE(CMyPreviewView, CPreviewView)
    
    CMyPreviewView::CMyPreviewView()
    {
    
    }
    CMyPreviewView::~CMyPreviewView()
    {
    
    }
    BEGIN_MESSAGE_MAP(CMyPreviewView, CPreviewView)
    
     ON_COMMAND(AFX_ID_PREVIEW_CLOSE, OnPreviewClose)
     ON_COMMAND(AFX_ID_PREVIEW_PRINT, OnPreviewPrint)
    
    END_MESSAGE_MAP()
    
    void CMyPreviewView::OnDraw(CDC *pDC)
    {
     CPreviewView::OnDraw(pDC);
    
     m_pToolBar->PostMessage(WM_IDLEUPDATECMDUI, (WPARAM)TRUE);// 控制条的命令状态更新
    }
    
    void CMyPreviewView::OnEndPrintPreview(CDC* pDC, CPrintInfo* pInfo, POINT point, CPreviewView* pView)
    {
     CPreviewView::OnEndPrintPreview(pDC, pInfo, point, pView);
    }
    
    void CMyPreviewView::OnPreviewClose()
    {
     CPrintFrame* pf=(CPrintFrame*)::AfxGetMainWnd();
     CWinApp *pApp=AfxGetApp();    
     pApp->m_pMainWnd=pf->m_pOldWnd;
     pf->DestroyWindow();
    }
    
    void CMyPreviewView::OnPreviewPrint()
    {
     m_pPrintView->SendMessage(WM_COMMAND, ID_FILE_PRINT);
    
    }
    
    

            至此,基于对话框应用程序的具有打印及打印预览的基本支持已经生成,完全由新生成的三个类来支持。正如上一部分介绍的,可以在CMyView类中定义CView类的几个在打印过程中虚拟函数(CView::OnPreparePrinting,CView::OnBeginPrinting,CView::OnPrepareDC,CView::OnPrint,CView::OnEndPrinting,具体内容可参见前一部分)来定制其打印或打印预览的内容。也可以将实现打印或打印预览新增的三个类,生成MFC扩展动态链接库,以方便加入到程序中。
            打完收功~~
     

    展开全文
  • AfxMessageBox 找不到标识符

    千次阅读 2017-06-06 09:41:37
    大家在使用网站下载的一些MFC程序时,经常会遇见一个报错问题:【error C3861: “AfxMessageBox”: 找不到标识符】,因为我是个菜鸟,所以一直被这个问题所困扰。网上搜索过各种各样的解决方法,发现这类问题的解决...
    大家在使用网站下载的一些MFC程序时,经常会遇见一个报错问题:【error C3861: “AfxMessageBox”: 找不到标识符】,因为我是个菜鸟,所以一直被这个问题所困扰。网上搜索过各种各样的解决方法,发现这类问题的解决方法比较混乱,也没人能说出个具体的原因。

    一般搜索这个问题,第一项即是MSDN社区的回答:点击打开链接

    此处解决方法很简单,就是将程序中的AfxMessageBox函数全部替换成为MessageBox函数,因为前者调用的是MFC的底层函数库,后者调用的是最为基本的Win32 API。故绝对不会出现“找不到标识符”的错误。

    问题虽然可以解决,但是却十分麻烦。而且,相信很多人跟笔者的疑惑是一样的:我明明就是要运行MFC程序,为什么会不支持MFC的底层函数库?

    于是,笔者继续寻找有没有其他的解决方法,例如网上常说的在头文件里面加入#include<afxwin.h>或者#include<stdafx.h>(其实两者是一样的,因为stdafx.h也调用了afxwin.h,而afxwin.h里面标识了函数AfxMessageBox),还是没有成功。

    同样,我也想过把程序就当做是WIN32程序,再进行手工转换成MFC程序。于是又搜索了这样那样的办法……结果也都是一样的,还是不成功。

    最后,我想不行我自己编写一个AfxMessageBox函数总行了吧!不然每次都要改来改去实在太麻烦了。然后我打开了AfxMessageBox函数所在的头文件afxwin.h,使用VS平台进行搜索,于是我就看到了这个……

    不知道为啥AfxMessageBox函数竟然被注释掉了,算是彻底无语了……于是就把这四行恢复,再运行,OK,搞定!



    转载自  http://www.xuebuyuan.com/1578921.html

    展开全文
  • } // CWinsOpenGLAppView 打印 void CWinsOpenGLAppView::OnFilePrintPreview() { #ifndef SHARED_HANDLERS AFXPrintPreview(this); #endif } BOOL CWinsOpenGLAppView::OnPreparePrinting(CPrintInfo* pInfo) { //...
  • Task One

    2021-12-15 18:04:59
    第2章 创建和编辑基本图形对象 表:表是数据库的组成单位,一个数据库至少包含一个表。 记录:记录是表的组成单位,一个表可能包含多条记录,也可能不包含任何记录。 要创建一个图形对象,需要遵循下面的基本步骤: ...
    #pragma once
    #include "atltypes.h"
    #include "afxwin.h"
    enum ShapType
    {
    	knone = 0,
    	kLine,
    	kCircle,
    	kEllip,
    	kRect
    };
    
    class CSharp
    {
    public:
    	int m_nLineWidth;
    	int m_nLineType;
    	COLORREF m_color;
    	virtual void Draw(CDC* du) = 0;
    	virtual ShapType type() { return knone; }
    };
    
    class Cline : public CSharp
    {
    public:
    	Cline() 
    	{
    
    	}
    
    	Cline(CPoint& pts, CPoint& pte, int& LinWidth, int& LineType, COLORREF color)
    	{
    		m_ptS = pts;
    		m_ptE = pte;
    		m_nLineWidth = LinWidth;
    		m_nLineType = LineType;
    		m_color = color;
    	}
    public:
    	CPoint m_ptS;
    	CPoint m_ptE;
    	virtual void Draw(CDC* du);
    	virtual ShapType type() { return kLine; };
    };
    class CCircle : public CSharp
    {
    public:
    	CCircle()
    	{
    
    	}
    	CCircle(CPoint& pts, CPoint& pte, int& LinWidth, int& LineType, COLORREF color)
    	{
    		m_ptCenter.x = (pts.x + pte.x) / 2;
    		m_ptCenter.y = (pts.y + pte.y) / 2;
    		m_iRadius = 100;
    		m_nLineWidth = LinWidth;
    		m_nLineType = LineType;
    		m_color = color;
    	}
    public:
    	CPoint m_ptCenter;
    	int m_iRadius;
    	virtual void Draw(CDC* du);
    	virtual ShapType type() { return kLine; };
    };
    class CEllipse : public CSharp
    {
    public:
    	CEllipse()
    	{
    
    	}
    	CEllipse(CPoint& pts, CPoint& pte, int& LinWidth, int& LineType, COLORREF color)
    	{
    		m_ptS = pts;
    		m_ptE = pte;
    		m_nLineWidth = LinWidth;
    		m_nLineType = LineType;
    		m_color = color;
    	}
    public:
    	CPoint m_ptS;
    	CPoint m_ptE;
    	virtual void Draw(CDC* du);
    	virtual ShapType type() { return kEllip; };
    };
    class Rectangle1 : public CSharp
    {
    public:
    	Rectangle1()
    	{
    
    	}
    
    	Rectangle1(CPoint& pts, CPoint& pte, int& LinWidth, int& LineType, COLORREF color)
    	{
    		m_ptS = pts;
    		m_ptE = pte;
    		m_nLineWidth = LinWidth;
    		m_nLineType = LineType;
    		m_color = color;
    	}
    public:
    	CPoint m_ptS;
    	CPoint m_ptE;
    	virtual void Draw(CDC* du);
    	virtual ShapType type() { return kRect; };
    };
    
    CArchive& operator <<(CArchive& s, CSharp& shap);
    CArchive& operator >>(CArchive& s, CSharp& shap);
    CArchive& operator <<(CArchive& s, Cline& line);
    CArchive& operator >>(CArchive& s, Cline& line);
    
    CArchive& operator <<(CArchive& s, CCircle& circle);
    CArchive& operator >>(CArchive& s, CCircle& circle);
    
    CArchive& operator <<(CArchive& s, CEllipse& ellipse);
    CArchive& operator >>(CArchive& s, CEllipse& ellipse);
    
    CArchive& operator <<(CArchive& s, Rectangle1& rectangle);
    CArchive& operator >>(CArchive& s, Rectangle1& rectangle);
    
    
    
    #include "pch.h"
    #include "atltypes.h"
    #include "afxwin.h"
    #include "CSharp.h"
    
    
    
    void Cline::Draw(CDC* du)
    {
        CPen cPen;
        cPen.CreatePen(m_nLineType,m_nLineWidth, m_color);
        du->SelectObject(&cPen);
        du->MoveTo(m_ptS);
        du->LineTo(m_ptE);
    };
    void CCircle::Draw(CDC* du)
    {
        CPen cPen;
        cPen.CreatePen(m_nLineType, m_nLineWidth, m_color);
        du->SelectObject(&cPen);
        du->Arc(m_ptCenter.x - m_iRadius, m_ptCenter.y - m_iRadius, m_ptCenter.x + m_iRadius, m_ptCenter.y + m_iRadius, 0, 0, 0, 0);
    };
    void CEllipse::Draw(CDC* du)
    {
        CPen cPen;
        cPen.CreatePen(m_nLineType, m_nLineWidth, m_color);
        du->SelectObject(&cPen);
        du->Ellipse(m_ptS.x, m_ptS.y, m_ptE.x, m_ptE.y);
    };
    void Rectangle1::Draw(CDC* du)
    {
        CPen cPen;
        cPen.CreatePen(m_nLineType, m_nLineWidth, m_color);
        du->SelectObject(&cPen);
        du->Rectangle(CRect(m_ptS, m_ptE));
    };
    
    CArchive& operator <<(CArchive& s, CSharp& shap)
    {
    	s << shap.m_nLineType << shap.m_nLineWidth << shap.m_color;
    	return s;
    }
    CArchive& operator >>(CArchive& s, CSharp& shap)
    {
    	s >> shap.m_nLineType >> shap.m_nLineWidth >> shap.m_color;
    	return s;
    }
    
    CArchive& operator <<(CArchive& s, Cline& line)
    {
    	s << (CSharp&)line;
    	s << line.m_ptS << line.m_ptE;
    	return s;
    }
    CArchive& operator >>(CArchive& s, Cline& line)
    {
    	s >> (CSharp&)line;
    	s >> line.m_ptS >> line.m_ptE;
    	return s;
    }
    
    CArchive& operator <<(CArchive& s, CCircle& circle)
    {
    	s << (CSharp&)circle;
    	s << circle.m_ptCenter << circle.m_iRadius;
    	return s;
    }
    CArchive& operator >>(CArchive& s, CCircle& circle)
    {
    	s >> (CSharp&)circle;
    	s >> circle.m_ptCenter >> circle.m_iRadius;
    	return s;
    }
    
    CArchive& operator <<(CArchive& s, CEllipse& ellipse)
    {
    	s << (CSharp&)ellipse;
    	s << ellipse.m_ptS << ellipse.m_ptE;
    	return s;
    }
    CArchive& operator >>(CArchive& s, CEllipse& ellipse)
    {
    	s >> (CSharp&)ellipse;
    	s >> ellipse.m_ptS >> ellipse.m_ptE;
    	return s;
    }
    
    CArchive& operator <<(CArchive& s, Rectangle1& rectangle)
    {
    	s << (CSharp&)rectangle;
    	s << rectangle.m_ptS << rectangle.m_ptE;
    	return s;
    }
    CArchive& operator >>(CArchive& s, Rectangle1& rectangle)
    {
    	s >> (CSharp&)rectangle;
    	s >> rectangle.m_ptS >> rectangle.m_ptE;
    	return s;
    }
    
    #pragma once
    
    
    // GraphicAttribute 对话框
    
    class GraphicAttribute : public CDialogEx
    {
    	DECLARE_DYNAMIC(GraphicAttribute)
    
    public:
    	GraphicAttribute(CWnd* pParent = nullptr);   // 标准构造函数
    	virtual ~GraphicAttribute();
    
    // 对话框数据
    #ifdef AFX_DESIGN_TIME
    	enum { IDD = IDD_DIALOG_GraphicAttribute };
    #endif
    
    protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
    
    	DECLARE_MESSAGE_MAP()
    public:
    	COLORREF m_color;
    	int m_nLineWidth;
    	int m_nLineType;
    	afx_msg void OnBnClickedButtonColor();
    	afx_msg void OnBnClickedOk();
    };
    
    
    // GraphicAttribute.cpp: 实现文件
    //
    
    #include "pch.h"
    #include "TaskOne.h"
    #include "GraphicAttribute.h"
    #include "afxdialogex.h"
    
    
    // GraphicAttribute 对话框
    
    IMPLEMENT_DYNAMIC(GraphicAttribute, CDialogEx)
    
    GraphicAttribute::GraphicAttribute(CWnd* pParent /*=nullptr*/)
    	: CDialogEx(IDD_DIALOG_GraphicAttribute, pParent)
    	, m_color(0)
    	, m_nLineWidth(0)
    	, m_nLineType(0)
    {
    
    }
    
    GraphicAttribute::~GraphicAttribute()
    {
    }
    
    void GraphicAttribute::DoDataExchange(CDataExchange* pDX)
    {
    	CDialogEx::DoDataExchange(pDX);
    	DDX_Text(pDX, IDC_EDIT_LineWidth, m_nLineWidth);
    	DDX_Text(pDX, IDC_EDIT_LineType, m_nLineType);
    }
    
    
    BEGIN_MESSAGE_MAP(GraphicAttribute, CDialogEx)
    	ON_BN_CLICKED(IDC_BUTTON_Color, &GraphicAttribute::OnBnClickedButtonColor)
    	ON_BN_CLICKED(IDOK, &GraphicAttribute::OnBnClickedOk)
    END_MESSAGE_MAP()
    
    
    // GraphicAttribute 消息处理程序
    
    
    void GraphicAttribute::OnBnClickedButtonColor()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	CMFCColorDialog dlg;
    	if (dlg.DoModal() != IDOK)
    		return;
    	m_color = dlg.GetColor();
    }
    
    
    void GraphicAttribute::OnBnClickedOk()
    {
    	// TODO: 在此添加控件通知处理程序代码
    	CDialogEx::OnOK();
    	CString str;
    	GetDlgItem(IDC_EDIT_LineType)->GetWindowText(str);
    	m_nLineType = _ttoi(str);
    
    	GetDlgItem(IDC_EDIT_LineWidth)->GetWindowText(str);
    	m_nLineWidth = _ttoi(str);
    }
    
    
    
    // TaskOneView.h: CTaskOneView 类的接口
    //
    
    #pragma once
    #include "MainFrm.h"
    
    class CTaskOneView : public CView
    {
    protected: // 仅从序列化创建
    	CTaskOneView() noexcept;
    	DECLARE_DYNCREATE(CTaskOneView)
    
    // 特性
    public:
    	CTaskOneDoc* GetDocument() const;
    
    // 操作
    public:
    	CPoint m_point1;
    	CPoint m_point2;
    	bool m_bSaveTag ;   //判断图像是否是第一次存储
    	int m_nLineType1;   //线型
    	int m_nLineWidth1 ;  //线宽
    	COLORREF m_color1;   //颜色 
    	CString m_strSaveFilePath;
    	CPoint m_SavePoint[100];
    	int m_nDraw = 0;      //1,2,3,4分别表示画线,圆,椭圆,矩形
    	CMainFrame* mainFrm;
    	
    // 重写
    public:
    	virtual void OnDraw(CDC* pDC);  // 重写以绘制该视图
    	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    protected:
    	virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
    	virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
    	virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
    
    // 实现
    public:
    	virtual ~CTaskOneView();
    #ifdef _DEBUG
    	virtual void AssertValid() const;
    	virtual void Dump(CDumpContext& dc) const;
    #endif
    
    protected:
    
    // 生成的消息映射函数
    protected:
    	afx_msg void OnFilePrintPreview();
    	afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
    	afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
    	DECLARE_MESSAGE_MAP()
    public:
    	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    	afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
    	afx_msg void OnLine();
    	afx_msg void OnCircle();
    	afx_msg void OnEllipse();
    	afx_msg void OnRectangle();
    	
    	afx_msg void OnColor();
    	afx_msg void OnLinewidth();
    	afx_msg void OnLinetype();
    	afx_msg void OnGraphicattribute();
    };
    
    #ifndef _DEBUG  // TaskOneView.cpp 中的调试版本
    inline CTaskOneDoc* CTaskOneView::GetDocument() const
       { return reinterpret_cast<CTaskOneDoc*>(m_pDocument); }
    #endif
    
    
    
    
    // TaskOneView.cpp: CTaskOneView 类的实现
    //
    
    #include "pch.h"
    #include "framework.h"
    // SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的
    // ATL 项目中进行定义,并允许与该项目共享文档代码。
    #ifndef SHARED_HANDLERS
    #include "TaskOne.h"
    #endif
    
    #include "TaskOneDoc.h"
    #include "TaskOneView.h"
    #include "CSharp.h"
    #include "GraphicAttribute.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    
    // CTaskOneView
    
    IMPLEMENT_DYNCREATE(CTaskOneView, CView)
    
    BEGIN_MESSAGE_MAP(CTaskOneView, CView)
    	// 标准打印命令
    	ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
    	ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
    	ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CTaskOneView::OnFilePrintPreview)
    	ON_WM_CONTEXTMENU()
    	ON_WM_RBUTTONUP()
    	
    	ON_WM_LBUTTONDOWN()
    	ON_WM_LBUTTONUP()
        ON_COMMAND(ID_LINE, &CTaskOneView::OnLine)
    	ON_COMMAND(ID_Circle, &CTaskOneView::OnCircle)
    	ON_COMMAND(ID_Ellipse, &CTaskOneView::OnEllipse)
        ON_COMMAND(ID_Rectangle, &CTaskOneView::OnRectangle)
        ON_COMMAND(ID_GraphicAttribute, &CTaskOneView::OnGraphicattribute)
    END_MESSAGE_MAP()
    
    // CTaskOneView 构造/析构
    
    CTaskOneView::CTaskOneView() noexcept
    {
    	// TODO: 在此处添加构造代码
         m_bSaveTag = 0; 
         m_color1 = RGB(0, 0, 0);
         m_nLineWidth1 = 0;
         m_nDraw = -1;
         m_nLineType1 = 0;
    }
    
    CTaskOneView::~CTaskOneView()
    {
    }
    
    BOOL CTaskOneView::PreCreateWindow(CREATESTRUCT& cs)
    {
    	// TODO: 在此处通过修改
    	//  CREATESTRUCT cs 来修改窗口类或样式
    
    	return CView::PreCreateWindow(cs);
    }
    
    // CTaskOneView 绘图
    
    void CTaskOneView::OnDraw(CDC* pDC)
    {
    	CTaskOneDoc* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
    	if (!pDoc)
    		return;
    
    	// TODO: 在此处为本机数据添加绘制代码
    	auto shaps = pDoc->m_vecShap;
    	int length = pDoc->m_vecShap.size();
    	for (int i = 0; i < length; i++)
    	{
            pDoc->m_vecShap[i]->Draw(pDC);
    	}
    }
    
    
    
    
    
    
    // CTaskOneView 打印
    
    
    void CTaskOneView::OnFilePrintPreview()
    {
    #ifndef SHARED_HANDLERS
    	AFXPrintPreview(this);
    #endif
    }
    
    BOOL CTaskOneView::OnPreparePrinting(CPrintInfo* pInfo)
    {
    	// 默认准备
    	return DoPreparePrinting(pInfo);
    }
    
    void CTaskOneView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
    	// TODO: 添加额外的打印前进行的初始化过程
    }
    
    void CTaskOneView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
    	// TODO: 添加打印后进行的清理过程
    }
    
    void CTaskOneView::OnRButtonUp(UINT /* nFlags */, CPoint point)
    {
    	ClientToScreen(&point);
    
    	OnContextMenu(this, point);
    }
    
    void CTaskOneView::OnContextMenu(CWnd* /* pWnd */, CPoint point)
    {
    #ifndef SHARED_HANDLERS
    	theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE);
    #endif
    }
    
    
    // CTaskOneView 诊断
    
    #ifdef _DEBUG
    void CTaskOneView::AssertValid() const
    {
    	CView::AssertValid();
    }
    
    void CTaskOneView::Dump(CDumpContext& dc) const
    {
    	CView::Dump(dc);
    }
    
    CTaskOneDoc* CTaskOneView::GetDocument() const // 非调试版本是内联的
    {
    	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTaskOneDoc)));
    	return (CTaskOneDoc*)m_pDocument;
    }
    #endif //_DEBUG
    
    
    // CTaskOneView 消息处理程序
    
    
    void CTaskOneView::OnLine()
    {
    	// TODO: 在此添加命令处理程序代码
        m_nDraw = 1;
    }
    
    void CTaskOneView::OnCircle()
    {
    	// TODO: 在此添加命令处理程序代码
        m_nDraw = 2;
    }
    
    void CTaskOneView::OnEllipse()
    {
    	// TODO: 在此添加命令处理程序代码
        m_nDraw = 3;
    }
    
    void CTaskOneView::OnRectangle()    
    {
        // TODO: 在此添加命令处理程序代码
        m_nDraw = 4;
    }
    
    
    void CTaskOneView::OnLButtonDown(UINT nFlags, CPoint point)
    {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
        CView::OnLButtonDown(nFlags, point);
        m_point1 = point;
    }
    
    void CTaskOneView::OnLButtonUp(UINT nFlags, CPoint point)
    {
        CDC* pDc = GetDC();
        // TODO: 在此添加消息处理程序代码和/或调用默认值
        CView::OnLButtonUp(nFlags, point);
        m_point2 = point;
    
        CSharp* pShrp = NULL;
        if (m_nDraw == 1)
        {
            pShrp = new Cline(m_point1, m_point2, m_nLineWidth1, m_nLineType1, m_color1);
            pShrp->Draw(pDc);
        }
        else if (m_nDraw == 2)
        {
            pShrp = new CCircle(m_point1, m_point2, m_nLineWidth1, m_nLineType1, m_color1);
            pShrp->Draw(pDc);
        }
        else if (m_nDraw == 3)
        {
            pShrp = new CEllipse(m_point1, m_point2, m_nLineWidth1, m_nLineType1, m_color1);
            pShrp->Draw(pDc);
        }
        else if (m_nDraw == 4)
        {
            pShrp = new Rectangle1(m_point1, m_point2, m_nLineWidth1, m_nLineType1, m_color1);
            pShrp->Draw(pDc);
        }
        else
        {
            return;
        }
        CTaskOneDoc* pDoc = GetDocument();
        pDoc->AddShap(pShrp);
    
        ::ReleaseDC(m_hWnd,*pDc);
        pDc = NULL;
        m_nDraw = -1;
    }
    
    
    
    
    void CTaskOneView::OnGraphicattribute()
    {
        // TODO: 在此添加命令处理程序代码
        GraphicAttribute CSel;
        if (CSel.DoModal() != IDOK)
            return;
        m_color1 = CSel.m_color;
        m_nLineWidth1 = CSel.m_nLineWidth;
        m_nLineType1 = CSel.m_nLineType;
    }
    
    
    
    // TaskOneDoc.h: CTaskOneDoc 类的接口
    //
    
    
    #pragma once
    #include<vector>
    #include "CSharp.h"
    
    
    
    
    class CTaskOneDoc : public CDocument
    {
    protected: // 仅从序列化创建
    	CTaskOneDoc() noexcept;
    	DECLARE_DYNCREATE(CTaskOneDoc)
    
    // 特性
    public:
    
    // 操作
    public:
    
    // 重写
    public:
    	virtual BOOL OnNewDocument();
    	virtual void Serialize(CArchive& ar);
    #ifdef SHARED_HANDLERS
    	virtual void InitializeSearchContent();
    	virtual void OnDrawThumbnail(CDC& dc, LPRECT lprcBounds);
    #endif // SHARED_HANDLERS
    
    // 实现
    public:
    	virtual ~CTaskOneDoc();
    #ifdef _DEBUG
    	virtual void AssertValid() const;
    	virtual void Dump(CDumpContext& dc) const;
    #endif
    	void AddShap(CSharp* pShap);
    
    protected:
    
    // 生成的消息映射函数
    protected:
    	DECLARE_MESSAGE_MAP()
    
    public:
    	std::vector<CSharp*> m_vecShap;
    	
    
    #ifdef SHARED_HANDLERS
    	// 用于为搜索处理程序设置搜索内容的 Helper 函数
    	void SetSearchContent(const CString& value);
    #endif // SHARED_HANDLERS
    };
    
    
    
    // TaskOneDoc.cpp: CTaskOneDoc 类的实现
    //
    
    #include "pch.h"
    #include "framework.h"
    // SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的
    // ATL 项目中进行定义,并允许与该项目共享文档代码。
    #ifndef SHARED_HANDLERS
    #include "TaskOne.h"
    #endif
    
    #include "TaskOneDoc.h"
    
    #include <propkey.h>
    #include"MainFrm.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    // CTaskOneDoc
    
    IMPLEMENT_DYNCREATE(CTaskOneDoc, CDocument)
    
    BEGIN_MESSAGE_MAP(CTaskOneDoc, CDocument)
    END_MESSAGE_MAP()
    
    
    // CTaskOneDoc 构造/析构
    
    CTaskOneDoc::CTaskOneDoc() noexcept
    {
    	// TODO: 在此添加一次性构造代码
    
    }
    
    CTaskOneDoc::~CTaskOneDoc()
    {
    }
    
    BOOL CTaskOneDoc::OnNewDocument()
    {
    	if (!CDocument::OnNewDocument())
    		return FALSE;
    
    	// TODO: 在此添加重新初始化代码
    	// (SDI 文档将重用该文档)
    
    	return TRUE;
    }
    
    void CTaskOneDoc::AddShap(CSharp* pShap)
    {
    	m_vecShap.push_back(pShap);
    }
    
    
    
    
    // CTaskOneDoc 序列化
    
    void CTaskOneDoc::Serialize(CArchive& ar)
    {
    	if (ar.IsStoring())
    	{
    		// TODO: 在此添加存储代码
    		CString strTitle = _T("my test");
    		ar << strTitle;
    		ar << m_vecShap.size();
    		for (int i = 0; i < (int)m_vecShap.size(); i++)
    		{
    			ShapType Type = m_vecShap[i]->type();
    			ar << (int)Type;
    			switch (Type)
    			{
    				case knone:
    					break;
    				case kLine:
    					ar << *(Cline*)m_vecShap[i];
    					break;
    				case kCircle:
    					ar << *(CCircle*)m_vecShap[i];
    					break;
    				case kEllip:
    					ar << *(CEllipse*)m_vecShap[i];
    					break;
    				case kRect:
    					ar << *(Rectangle1*)m_vecShap[i];
    					break;
    				default:
    					break;
    			}
    		}
    	}
    	else
    	{
    		CString str;
    		ar >> str;
    		if (str != _T("my test"))
    		{
    			AfxMessageBox(_T("非保存文件!"));
    		}
    		else
    		{
    			int size;
    			ar >> size;
    			for(int i = 0; i < size; i++)
    			{
    				int tmpType ;
    				ar >> tmpType;
    				ShapType Type =(ShapType)tmpType;
    				CSharp* pShap = NULL;
    				switch (Type)
    				{
    				case knone:
    					break;
    				case kLine:
    				{
    					pShap = new Cline();
    					ar >> *(Cline*)pShap;
    					break;
    				}	
    				case kCircle:
    				{
    					pShap = new CCircle();
    					ar >> *(CCircle*)pShap;
    					break;
    				}		
    				case kEllip:
    				{
    					pShap = new CEllipse();
    					ar >> *(CEllipse*)pShap;
    					break;
    				}
    				case kRect:
    				{
    					pShap = new Rectangle1();
    					ar >> *(Rectangle1*)pShap;
    					break;
    				}
    				default:
    					break;
    				}
    				m_vecShap.push_back(pShap);
    			}
    		}
    
    
    		// TODO: 在此添加加载代码
    	}
    }
    
    #ifdef SHARED_HANDLERS
    
    // 缩略图的支持
    void CTaskOneDoc::OnDrawThumbnail(CDC& dc, LPRECT lprcBounds)
    {
    	// 修改此代码以绘制文档数据
    	dc.FillSolidRect(lprcBounds, RGB(255, 255, 255));
    
    	CString strText = _T("TODO: implement thumbnail drawing here");
    	LOGFONT lf;
    
    	CFont* pDefaultGUIFont = CFont::FromHandle((HFONT) GetStockObject(DEFAULT_GUI_FONT));
    	pDefaultGUIFont->GetLogFont(&lf);
    	lf.lfHeight = 36;
    
    	CFont fontDraw;
    	fontDraw.CreateFontIndirect(&lf);
    
    	CFont* pOldFont = dc.SelectObject(&fontDraw);
    	dc.DrawText(strText, lprcBounds, DT_CENTER | DT_WORDBREAK);
    	dc.SelectObject(pOldFont);
    }
    
    // 搜索处理程序的支持
    void CTaskOneDoc::InitializeSearchContent()
    {
    	CString strSearchContent;
    	// 从文档数据设置搜索内容。
    	// 内容部分应由“;”分隔
    
    	// 例如:     strSearchContent = _T("point;rectangle;circle;ole object;");
    	SetSearchContent(strSearchContent);
    }
    
    void CTaskOneDoc::SetSearchContent(const CString& value)
    {
    	if (value.IsEmpty())
    	{
    		RemoveChunk(PKEY_Search_Contents.fmtid, PKEY_Search_Contents.pid);
    	}
    	else
    	{
    		CMFCFilterChunkValueImpl *pChunk = nullptr;
    		ATLTRY(pChunk = new CMFCFilterChunkValueImpl);
    		if (pChunk != nullptr)
    		{
    			pChunk->SetTextValue(PKEY_Search_Contents, value, CHUNK_TEXT);
    			SetChunkValue(pChunk);
    		}
    	}
    }
    
    #endif // SHARED_HANDLERS
    
    // CTaskOneDoc 诊断
    
    #ifdef _DEBUG
    void CTaskOneDoc::AssertValid() const
    {
    	CDocument::AssertValid();
    }
    
    void CTaskOneDoc::Dump(CDumpContext& dc) const
    {
    	CDocument::Dump(dc);
    }
    #endif //_DEBUG
    
    
    // CTaskOneDoc 命令
    
    
    展开全文
  • //+++++++++++++++++++++++++++++++++++++++++ } // COpenGLView 打印 void COpenGLView::OnFilePrintPreview() { #ifndef SHARED_HANDLERS AFXPrintPreview(this); #endif } BOOL COpenGLView::...
  • C++实现多项式拟合

    千次阅读 2021-01-29 09:30:33
    C++实现多项式拟合 配置GSL库 跟着这篇文章来操作进行, win10下给VS2017配置GSL库. 如果你的电脑没有 vs 的命令行的话,生成不了lib文件,我上传了已经生成好了的,只需要 2 积分 链接: gsl_lib.zip. ...
  • MFC 连连看

    2021-01-29 23:12:07
    } // CLvXiaoleView 打印 void CLvXiaoleView::OnFilePrintPreview() { #ifndef SHARED_HANDLERS AFXPrintPreview(this); #endif } BOOL CLvXiaoleView::OnPreparePrinting(CPrintInfo* pInfo) { // 默认准备 ...
  • c++中的MFC可视化编程

    千次阅读 2020-06-14 05:47:20
    MFC可视化编程 MFC是用来编写Windows应用程序的VC++类集,该类集以层次结构组织起来,其中封装了大部分Windows API函数,它所包含的功能涉及到整个Windows操作系统。MFC类库是以层次结构的方式组织起来的,它的类...
  • VS2019, MFC 光标文字操作

    千次阅读 2020-06-22 20:18:50
    } } // CSunXinjiaocheng05View 打印 void CSunXinjiaocheng05View::OnFilePrintPreview() { #ifndef SHARED_HANDLERS AFXPrintPreview(this); #endif } BOOL CSunXinjiaocheng05View::OnPreparePrinting...
  • 刚刚学opengl的童鞋肯定有个苦恼的麻烦,只会绘制一个三角形,但是想像那些三维软件那样用鼠标控制视角还是有点困难的,所以我就封装了一个场景漫游类:RoamingScenceManager,这个类使用非常方便,跟界面没有半毛钱...
  • opengl实现曲柄连杆

    2020-04-13 11:38:16
    一、程序要求        偶然翻到自己两年前写的一个opengl实现的曲柄连杆机构程序,内容分为设计要求、主要代码及函数说明、设计方法三大块。编程环境是vs2010,窗口是MFC设计,...
  • 目录一、课程设计题目及内容二、程序中使用的数据及主要符号说明三、带有详细注释的自己编写的源程序四、程序运行时的效果图五、实验结果分析,实验收获和体会。1、实验结果分析:2、实验收获和体会: ...
  • AFXPrintPreview ( this ) ; # endif } BOOL C直线截取View :: OnPreparePrinting ( CPrintInfo * pInfo ) { // 默认准备 return DoPreparePrinting ( pInfo ) ; } void C直线截取View :: ...
  • vs2010一些设置

    千次阅读 2011-01-09 11:11:00
    1.更改默认使用环境,经常会在c#和c++之间切换,还是喜欢分开2种不同的ide布局,下面是方法记录   菜单 工具->导入和导出设置…,打开导入和导出设置向导,选择重置所有设置,然后一直下一步,最后...
  • } // CMy02exampleOpenGLMFCView 打印 void CMy02exampleOpenGLMFCView::OnFilePrintPreview() { #ifndef SHARED_HANDLERS AFXPrintPreview(this); #endif } BOOL CMy02exampleOpenGLMFCView::OnPreparePrinting...
  • CCVMFCView::OnFilePrintPreview(){ AFXPrintPreview( this );}BOOL CCVMFCView::OnPreparePrinting(CPrintInfo* pInfo){  // 默认准备   return DoPreparePrinting(pInfo);} void CCVMFCView::...
  • } } } } // CprimeView 打印 void CprimeView::OnFilePrintPreview() { #ifndef SHARED_HANDLERS AFXPrintPreview(this); #endif } BOOL CprimeView::OnPreparePrinting(CPrintInfo* pInfo) { // 默认...
  • MFC多文档中opencv处理图像打开、保存

    万次阅读 热门讨论 2012-03-02 21:19:04
    AFXPrintPreview(this); } BOOL CCVMFCView::OnPreparePrinting(CPrintInfo* pInfo) { // 默认准备 return DoPreparePrinting(pInfo); } void CCVMFCView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*...
  • AFXPrintPreview(this); #endif } BOOL CMy1111View::OnPreparePrinting(CPrintInfo* pInfo) { // 默认准备 return DoPreparePrinting(pInfo); } void CMy1111View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo*...
  • 不要照抄!不要照抄!不要照抄! 首先需要用到老师给的JpegDecoder和jpeglib(需要自己生成), 使用VS的命令行来生成jpeglib,具体步骤为 使用libjpeg源代码实现读取jpeg格式图片,生成.lib方法如下: ...
  • MFC 多视图

    千次阅读 2013-12-31 11:11:56
     今天看《深入浅出MFC》时,看到要做多视图同步画图问题,此书上刚介绍完单视图画图后,引出多视图画图的问题(多视图是指一个子视图窗口中多个视图区域,由SpliiterWnd分割生成的)。存在相互通知,并特别强调...
  • 图形学实验之二维图形变换

    千次阅读 2013-11-28 20:07:59
    1、 程序由CcgGJ2Dtrans、CcgGJ2DtransDoc、CcgGJ2DtransView、CCgtransControl、CMainFrm类构成,下图为示意图。   2、 classCcgGJ2DtransDoc : (1) 在此类中定义与CCgtransControl的按钮的变量值 ...
  • SkipOut游戏实现代码

    2016-05-11 18:36:23
    头文件: GameSet.h Lose.h NumSkipDoc.h NumSkipView.h SkipOut.h Win.h 源文件: GameSet.cpp Lose.cpp NumSkipDoc.cpp NumSkipView.cpp SkipOut.cpp Win.cpp 代码: GameSet.h ...class GameSe...
  • opencv打开图片保存图片

    千次阅读 2015-11-16 00:06:06
    需要在C**Doc和C**View中进行相应修改 图像打开: Doc.cpp中: [cpp] view plaincopy BOOL CCVMFCDoc::Load(IplImage** pp, LPCTSTR csFilename)  ... 
  • AFXPrintPreview(this); #endif } BOOL CMapView::OnPreparePrinting(CPrintInfo* pInfo) { // 默认准备 return DoPreparePrinting(pInfo); } void CMapView::OnBeginPrinting(CDC* /*pDC*/, ...
  • 一、学习参考文件 1、《学习OpenCV》参考书,用OpenCV对图像进行基本的打开,保存等处理。 2、《MFC多文档中OpenCV处理图像打开和保存》,... 二、环境搭建 1、安装VS2013和OpenCV库 ...

空空如也

空空如也

1 2 3
收藏数 51
精华内容 20
热门标签
关键字:

afxprintpreview

友情链接: dot matrix.rar