2016-04-22 17 views
1

私は、デバイスコンテキストの作成に関するMicrosoftのチュートリアルに従いました。インターネットを見渡すようにしてみましたが、まあまあです(MFCは神秘的なものです)。以下は正常に "Hello、World!"を表示します。非常に小さいことを除いて。MFCを使用したプリンタDCへの印刷

テキストではなく、プリンタにCImageを送信するにはどうすればよいですか? テキストのサイズを数ミリメートル以上にするにはどうすればいいですか? 私はMSDNを精査しましたが、すべてが古くなっています(使用しているサンプルコードのようなものです)。ここで

// get the default printer 
    CPrintDialog dlg(FALSE); 
    dlg.GetDefaults(); 

    // is a default printer set up? 
    HDC hdcPrinter = dlg.GetPrinterDC(); 
    if (hdcPrinter == NULL) 
    { 
    //MessageBox(_T("Buy a printer!")); 
    } 
    else 
    { 
    // create a CDC and attach it to the default printer 
    CDC dcPrinter; 
    dcPrinter.Attach(hdcPrinter); 

    // call StartDoc() to begin printing 
    DOCINFO docinfo; 
    memset(&docinfo, 0, sizeof(docinfo)); 
    docinfo.cbSize = sizeof(docinfo); 
    docinfo.lpszDocName = _T("CDC::StartDoc() Code Fragment"); 

    // if it fails, complain and exit gracefully 
    if (dcPrinter.StartDoc(&docinfo) < 0) 
    { 
     //MessageBox(_T("Printer wouldn't initalize")); 
    } 
    else 
    { 
     // start a page 
     if (dcPrinter.StartPage() < 0) 
     { 
     //MessageBox(_T("Could not start page")); 
     dcPrinter.AbortDoc(); 
     } 
     else 
     { 
     // actually do some printing 
     //CGdiObject* pOldFont = dcPrinter.SelectStockObject(SYSTEM_FONT); 

     dcPrinter.SetMapMode(MM_HIENGLISH); 
     auto font = CreateFont(
     3'000,      // nHeight 
     1'500,       // nWidth 
     0,       // nEscapement 
     0,       // nOrientation 
     FW_NORMAL,     // nWeight 
     FALSE,      // bItalic 
     FALSE,      // bUnderline 
     0,       // cStrikeOut 
     ANSI_CHARSET,    // nCharSet 
     OUT_DEFAULT_PRECIS,  // nOutPrecision 
     CLIP_DEFAULT_PRECIS,  // nClipPrecision 
     DEFAULT_QUALITY,   // nQuality 
     DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily 
     _T("Arial"));     // lpszFacename 
     dcPrinter.SelectObject(&font); 
     dcPrinter.TextOut(450, 450, _T("Hello World!"), 12); 
     dcPrinter.EndPage(); 
     dcPrinter.EndDoc(); 
     //dcPrinter.SelectObject(pOldFont); 
     } 
    } 
    } 
+1

これは一般的なwin32印刷の最初の問題です。印刷サポートを追加するのに数時間以上を費やしているのであれば、Petzoldの関連する章を1時間ほど読むことをお勧めします。それは手によってあなたを連れてきて、そこにあるすべてを非常にはっきりと説明します。後で行う必要があるのは、それをMFCの概念にマップすることです。これは簡単です。使用済みのコピーを数ドルで購入したり、ダウンロードしたりすることができます。私はまだハードコピーを取得することをお勧めします - それはあなたがそれらの小さな細部のために頻繁に戻っていく少数の本の1つです。 – Roel

+0

金曜日の朝に2冊の本を注文しましたが、別の本を追加することは何もありません! 私は「Petzold MFC」と[これは何が来たのですか?](http://www.microsoft.com/mspress/books/1431.aspx)を検索しました。これは "ペッツォールド"ですか? – Acorn

+1

いいえ、実際はこれです:http://www.charlespetzold.com/pw5/これはMFC用ではなく、win32ですが、あなたの質問は本質的にwin32の概念に関するものです。 MFCの印刷サポートは、その上にある薄いOOレイヤーです。この本は印刷に関する全章(第13章、厳密に言えば)です:印刷装置のコンテキスト、DEVCAPS、印刷ダイアログなどは何ですか?Adrianはこの問題を説明しました。 – Roel

答えて

2

小さなテキスト問題問題は、デフォルトで、フォントのサイズがデバイス依存のユニットやプリンタに指定されている、ということである

は、一般的にはるかに高い解像度の画面です。そのため、プリンタでそのフォントを使用しようとすると、スクリーン上の高さが20ピクセル(1インチあたり96ピクセル)のフォントを作成した場合、フォントは300または600ドット/インチのサイズになります小さい。

もう1つの答えが示すように、1つのアイデアは、プリンタが画面上のものに近い単位を使用するようにマッピングモードを変更することです。

代替方法は、GetDeviceCaps関数で決定できるプリンタのDPIに基づいて、適切なサイズ(LOGFONT構造のlfHeightフィールド)を持つ新しいフォントを作成することです。これは14ポイントのテキストのような特定のフォントサイズが必要な場合に便利です。

LOGFONT lf = {0}; 
lf.lfHeight = -MulDiv(point_size, ::GetDeviceCaps(dcPrinter, LOGPIXELSY), 72); 
// init other field of lf as you like 
HFONT hfontPrinter = ::CreateFontIndirect(&lf); 
HFONT hfontOld = ::SelectObject(hdcPrinter, hfontPrinter); 

// now draw to the hdcPrinter 

::SelectObject(hdcPrinter, hfontOld); 
::DeleteObject(hfontPrinter); 
のCImage

私はMFCを使用していない送信

、しかし、あなただけのプリンターDCでCImage::StretchBltを呼び出すことができるように見えます。もう一度、ターゲット座標を選択するときには、おそらくプリンタのはるかに高い解像度を考慮する必要があります。

+0

恐ろしく、これはまさに私が探していたものです。 コードサンプルでちょうど1つの質問 - 'hfont'とは何ですか?あなたはコード例のいくつかの場所でそれを使用しますが、決して定義しません( 'hfont'は' hfontPrinter'でなければなりませんか?) – Acorn

+0

はい。私は今コードサンプルを修正しました。混乱については申し訳ありません。私はかなり素早くそれを掘り起こしました。 –

1

は問題です:

dcPrinter.SetMapMode(MM_TEXT); 

MM_TEXTは、一つのデバイスポイントに一つの論理ポイントをマップします。プリンタで600 DPIの典型的な解像度を考慮すると、あなたのものは画面上のものより数倍小さくなります。

MM_HIENGLISHまたは他のデバイスに依存しないモードを使用してください。ここはMSDN linkです。

+0

テキストのサイズをどのように拡大するのですか?私はあなたが提案していることがうまくいくとは確信していますが、 'MM_HIENGLISH'に切り替えると、テキストは表示されません。 私はこの行をコメントアウトすると、 'CGdiObject * pOldFont = dcPrinter.SelectStockObject(SYSTEM_FONT);'、フォントサイズが判読可能なサイズで出てきますが、なぜそれが何であるかについての情報は見当たりませんし、pOldFontサイズを大きくする。 – Acorn

+0

'pOldFont'は、そのDCに前もって選択されたフォントを指します。あなたは、あなたの機能から復帰する前に、復元する(DCに再選択する)以外に何もしないでください。フォントを制御するには、必要なパラメータ、特にサイズを指定してフォントを作成する必要があります。 'MM_HIENGLISH'モードでは、自分のリンクが説明しているように、各論理ユニットは0.001インチにマッピングされています。したがって、高さ1インチのフォントでは、その高さを1,000に設定します。 –

+0

私は参照してください。まあ、それ以上の読書のためのまともなソースがありますか?私はプリンタのDCに与えられた新しいフォントを作成し、マッピングモードを 'MM_HIENGLISH'に設定しましたが、それでも間違ったサイズが出ています。 コードを更新しました。マッピングモードがMM_HIENGLISHに設定されていると、実際に印刷するページに何も表示されません。 私はMFCプログラミングについて何も知らないので、私がオンラインで利用できる場所はいいですね。 – Acorn

0

妥当なフォントを作成するには、CFont :: CreatePointFont()またはCFont :: CreatePointFontIndirect()を使用します。ほとんどのプリンタは600 DPIです。ほとんどの画面は96 DPIです。画面上の12ポイントのフォントは、基本的に2ポイントのフォントであり、プリンタでは判読できません。

フォントを作成し、DCに選択します。 DCを使用した後、DC(CDCクラス)を破壊する前に、DCから選択することを忘れないでください。 (CDCデストラクタは自動的にHDCを削除します)。

関連する問題