高分求助,关于实际物理尺寸打印的问题。

fivezzx 2009-06-27 08:29:29
我要打印的内容有两项:
1、在整张纸打印出横纵向间距都是1mmm的网格线,即每个小方格尺寸为1mm*1mm,格子的尺寸固定,数量不要求固定;
2、我要在网格背景上打印曲线,曲线要求12个采样点占据1mm,

请高手指点!
...全文
44 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxxstudy 2009-06-28
  • 打赏
  • 举报
回复
关注中
fivezzx 2009-06-28
  • 打赏
  • 举报
回复
基本明白了,还有一点不太懂
nMapModeOld = pDC->SetMapMode(MM_LOMETRIC);
pDC->SetWindowOrg(-254/2, 254/2);
因为MM_LOMETRIC的坐标系是x轴向右为正,y轴向下为负,那么pDC->SetWindowOrg(-254/2, 254/2); 是不是将原点设置到原先的坐标原点左上,左边和上边都留了12.7mm的空白呢?

请指点!
softist 2009-06-27
  • 打赏
  • 举报
回复
我上传的原码是可以在打印纸上打印1mm*1mm 或0.1*0.1INCH的程序。
请你创建一个叫 Ruler 的 sdi。
把上面的两个程序拷进去。
在菜单里增加一个 IDMENU_SCALE_TYPE mm 和 INCH 就可以切换了。
softist 2009-06-27
  • 打赏
  • 举报
回复
// RulerView.h : CRulerView クラスの宣言およびインターフェイスの定義をします。
//
/////////////////////////////////////////////////////////////////////////////

#if !defined(AFX_RULERVIEW_H__ED64FB17_2E60_4FA5_B16E_346458184D99__INCLUDED_)
#define AFX_RULERVIEW_H__ED64FB17_2E60_4FA5_B16E_346458184D99__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


class CRulerView : public CView
{
protected: // シリアライズ機能のみから作成します。
CRulerView();
DECLARE_DYNCREATE(CRulerView)

// アトリビュート
public:
CRulerDoc* GetDocument();

// オペレーション
public:

// オーバーライド
// ClassWizard は仮想関数のオーバーライドを生成します。
//{{AFX_VIRTUAL(CRulerView)
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);
//}}AFX_VIRTUAL

// インプリメンテーション
public:
virtual ~CRulerView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif

protected:

// 生成されたメッセージ マップ関数
protected:
//{{AFX_MSG(CRulerView)
afx_msg void OnScaleType();
afx_msg void OnUpdateScaleType(CCmdUI* pCmdUI);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

#ifndef _DEBUG // RulerView.cpp ファイルがデバッグ環境の時使用されます。
inline CRulerDoc* CRulerView::GetDocument()
{ return (CRulerDoc*)m_pDocument; }
#endif

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ は前行の直前に追加の宣言を挿入します。

#endif // !defined(AFX_RULERVIEW_H__ED64FB17_2E60_4FA5_B16E_346458184D99__INCLUDED_)
softist 2009-06-27
  • 打赏
  • 举报
回复
// RulerView.cpp : CRulerView クラスの動作の定義を行います。
//

#include "stdafx.h"
#include "Ruler.h"

#include "RulerDoc.h"
#include "RulerView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CRulerView

IMPLEMENT_DYNCREATE(CRulerView, CView)

BEGIN_MESSAGE_MAP(CRulerView, CView)
//{{AFX_MSG_MAP(CRulerView)
ON_COMMAND(IDMENU_SCALE_TYPE, OnScaleType)
ON_UPDATE_COMMAND_UI(IDMENU_SCALE_TYPE, OnUpdateScaleType)
//}}AFX_MSG_MAP
// 標準印刷コマンド
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRulerView クラスの構築/消滅

CRulerView::CRulerView()
{
// TODO: この場所に構築用のコードを追加してください。

}

CRulerView::~CRulerView()
{
}

BOOL CRulerView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: この位置で CREATESTRUCT cs を修正して Window クラスまたはスタイルを
// 修正してください。

return CView::PreCreateWindow(cs);
}

#define RULER_WIDTH_MM 180
#define RULER_HEIHGT_MM 240
#define RULER_WIDTH_INCH_10 70
#define RULER_HEIHGT_INCH_10 90
BOOL g_bMetric = TRUE;

/////////////////////////////////////////////////////////////////////////////
// CRulerView クラスの描画

void CRulerView::OnDraw(CDC* pDC)
{
CRulerDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: この場所にネイティブ データ用の描画コードを追加します。

int i;
CPen Pen10;
CPen Pen5;
CPen Pen1;
CPen* pOldPen;

int RULER_WIDTH;
int RULER_HEIHGT;

if (g_bMetric)
{
RULER_WIDTH = RULER_WIDTH_MM;
RULER_HEIHGT = RULER_HEIHGT_MM;
}
else
{
RULER_WIDTH = RULER_WIDTH_INCH_10;
RULER_HEIHGT = RULER_HEIHGT_INCH_10;
}

Pen10.CreatePen(PS_SOLID, 3, (COLORREF)0xFF0000);
Pen5.CreatePen(PS_SOLID, 2, (COLORREF)0xFF0000);
Pen1.CreatePen(PS_SOLID, 1, (COLORREF)0xFF0000);

int nMapModeOld;

if (g_bMetric)
{
nMapModeOld = pDC->SetMapMode(MM_LOMETRIC);
pDC->SetWindowOrg(-254/2, 254/2);
}
else
{
nMapModeOld = pDC->SetMapMode(MM_LOENGLISH);
pDC->SetWindowOrg(-50, 50);
}

for (i = 0; i <= RULER_HEIHGT; i ++)
{
if (!(i % 10))
{
pOldPen = pDC->SelectObject(&Pen10);
CString str;
str.Format("%2d", i / 10);
if (g_bMetric)
pDC->TextOut(-80, -i * 10 + 5, str);
else
pDC->TextOut(-31, -i * 10 + 2, str);

}
else if (!(i % 5))
pOldPen = pDC->SelectObject(&Pen5);
else
pOldPen = pDC->SelectObject(&Pen1);

pDC->MoveTo(0, -i * 10);
pDC->LineTo(RULER_WIDTH * 10, -i * 10);
pDC->SelectObject(pOldPen);
}

for (i = 0; i <= RULER_WIDTH; i ++)
{
if (!(i % 10))
{
pOldPen = pDC->SelectObject(&Pen10);
CString str;
str.Format("%d", i / 10);
if (g_bMetric)
pDC->TextOut(i * 10 - 10, 80, str);
else
pDC->TextOut(i * 10 - 2, 31, str);

} else if (!(i % 5))
pOldPen = pDC->SelectObject(&Pen5);
else
pOldPen = pDC->SelectObject(&Pen1);

pDC->MoveTo(i * 10, 0);
pDC->LineTo(i * 10, -RULER_HEIHGT * 10);
pDC->SelectObject(pOldPen);
}
pDC->SetWindowOrg(0, 0);
pDC->SetMapMode(nMapModeOld);


}

/////////////////////////////////////////////////////////////////////////////
// CRulerView クラスの印刷

BOOL CRulerView::OnPreparePrinting(CPrintInfo* pInfo)
{
// デフォルトの印刷準備
return DoPreparePrinting(pInfo);
}

void CRulerView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 印刷前の特別な初期化処理を追加してください。
}

void CRulerView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 印刷後の後処理を追加してください。
}

/////////////////////////////////////////////////////////////////////////////
// CRulerView クラスの診断

#ifdef _DEBUG
void CRulerView::AssertValid() const
{
CView::AssertValid();
}

void CRulerView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}

CRulerDoc* CRulerView::GetDocument() // 非デバッグ バージョンはインラインです。
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CRulerDoc)));
return (CRulerDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CRulerView クラスのメッセージ ハンドラ

void CRulerView::OnScaleType()
{
// TODO: この位置にコマンド ハンドラ用のコードを追加してください
g_bMetric = !g_bMetric;
Invalidate();
}

void CRulerView::OnUpdateScaleType(CCmdUI* pCmdUI)
{
if (g_bMetric)
pCmdUI->SetCheck(TRUE);
else
pCmdUI->SetCheck(FALSE);
}

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧