ラベル MFC の投稿を表示しています。 すべての投稿を表示
ラベル MFC の投稿を表示しています。 すべての投稿を表示

日曜日, 4月 27, 2008

MFCで拡大印刷する

チベットの旗を(印刷紙)4倍にして印刷するにはどうするか。

MFCで書いたので、そのコツをまとめておくと...

ページ数を規定する。印刷する画像のサイズを計算してSetMaxPage(int)で指定する。OnBeginPrinting()などで行う。

CDCのオフセットを指定する。ページ数を取得して、位置を指定する。OnPrepareDC()で行う。

OnDraw()で、CDC::IsPrinting()のときに、印刷用に画像を描画する。

MFCで拡大印刷する Morph-1.0.0.zip Free Download

日曜日, 11月 04, 2007

MFC:プリンタ印刷をカスタマイズ

先日、MFCライブラリを使ってプリンタ印刷をカスタマイズする機会があったので、気づいたことを書いておこうと思う。

MFCでは、CScrollViewなどCView派生クラスを使えば、印刷はCView::OnFilePrint()をメニューに登録し、呼び出すだけで印刷ができる。この際には、OnPreparePrinting()を再定義してDoPreparePrinting()の一行を記述する必要がある。CView::OnFilePrintPreview()を使えば何を変更することもなくプレビューができる。

縦横(Portrait/Landscape)など印刷する紙の向きなどカスタマイズする際には、CWinApp派生クラスで定義されている、m_hDevModeを変更する必要がある。m_hDevModeは外部からアクセスできないため、CWinApp派生クラスで値を変更せねばならない。つまり、このようなコードを書かねばならない。

void CMyApp::SetOrientation(short orientation)
{
CPrintDialog printDlg(FALSE);

BOOL bRet=GetPrinterDeviceDefaults(&prinDlg.m_pd);
if(bRet)
{
DEVMODE FAR *pDevMode=(DEVMODE FAR *)::GlobalLock(m_hDevMode);
pDevMode->dmOrientation=orientation;
::GlobalUnlock(m_hDevMode);
}
}

CView派生クラスでは、DoPreparePrinting()を呼び出す前にCWinApp派生クラスで定義された上記のSetOrientation()を呼ぶと、紙の向きがカスタマイズできる。

BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo)
{
int imageWidth=m_pImage->GetWidth();
int imageHeight=m_pImage->GetHeight();

CPhotoAlbumApp* pApp=(CMyApp*)AfxGetApp();

short orientation=DMORIENT_PORTRAIT;
if(imageHeight<imageWidth)
orientation=DMORIENT_LANDSCAPE;

pApp->SetOrientation(orientation);
return DoPreparePrinting(pInfo);
}

上記のコードでは、m_pImageで指定されているCImageの縦横の長さに応じて、デフォルトでの紙の向きが指定される。

流れとしては、OnFilePrint()では、OnPreparePrinting()が呼び出され、OnPreparePrinting()を再定義してDoPreparePrinting()を呼び出すと、そこではDoPrintDialog()が呼ばれ、その際にはCWinApp派生クラスのm_hDevModeが指定されるので、OnPreparePrinting()においてDoPreparePrinting()の前にm_hDevModeを指定することになる。

木曜日, 8月 23, 2007

MFCで、ファンクションキーの入力を検出する

MFCでフレームが分割されていると、ファンクションキーなどの入力が、フォーカスのあるウィンドウにいかない。ファンクションキーは、アクセレレーターキーとして、リソースでIDを指定する。フォーカスのあるウィンドウを判別するには、以下のような手段がとれる。

CWnd *pWnd=this->GetFocus();
if(pWnd->IsKindOf(RUNTIME_CLASS(CJukeBoxView)))
...
else
...

Flask の Blueprint のテンプレート問題

  Flask の Blueprint は、ルート、静的ファイル、テンプレートをまとめて管理できます。しかし、テンプレートが指定できません。 ここでは、Blueprint の template_folder の問題点と回避策を説明します。 Blueprint のテンプレート問題...