チベットの旗を(印刷紙)4倍にして印刷するにはどうするか。
MFCで書いたので、そのコツをまとめておくと...
ページ数を規定する。印刷する画像のサイズを計算してSetMaxPage(int)で指定する。OnBeginPrinting()などで行う。
CDCのオフセットを指定する。ページ数を取得して、位置を指定する。OnPrepareDC()で行う。
OnDraw()で、CDC::IsPrinting()のときに、印刷用に画像を描画する。
→ MFCで拡大印刷する Morph-1.0.0.zip Free Download
日曜日, 4月 27, 2008
日曜日, 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を指定することになる。
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
...
CWnd *pWnd=this->GetFocus();
if(pWnd->IsKindOf(RUNTIME_CLASS(CJukeBoxView)))
...
else
...
登録:
投稿 (Atom)
Flask の Blueprint のテンプレート問題
Flask の Blueprint は、ルート、静的ファイル、テンプレートをまとめて管理できます。しかし、テンプレートが指定できません。 ここでは、Blueprint の template_folder の問題点と回避策を説明します。 Blueprint のテンプレート問題...
-
コンデンサマイク 極性があります コンデンサマイクがようやく届きました。モジュールではないのでそのままでは信号が弱いので使えません。信号を増幅する必要があります。 ちょっとした手間ですが、首尾よく動いてくれました。この回路の応用で、使えるマイクが出来ます。 ...
-
Qt はまってます。Mac でも書いたアプリがコンパイルできて、しっかり動くのを確認しました。このあいだ Chitubox が Qt 使ってるのを知ってうれしかったです。 Mac でもそのまま動くんですが、アプリのアイコンの設定はプラットフォーム依存です。 公式マニュアルでも設定...
-
今日ホール素子が届きました。 ホール素子ってのは ホール効果 を利用して磁場を感知するセンサーです。 iPad のケースとか、閉じると電源が切れてくれますよね。ケースのカバーの磁石の磁場をホール素子が感知してるわけです。 さっそくホール素子を使ってみよう!電圧...