filenameで指定したbmpファイルを印刷させるプログラムを作っているのですが、
どうやっても指定したファイル名のアドレスの画像が表示されなくて困っています。
どうやったら良いのでしょうか??
bool printFile(char *filename)
{
PRINTDLG pd;
DOCINFO di;
HWND hWnd;
HDC hBuffer;
static HBITMAP hBitmap;
//プリンタの設定
memset(&pd, 0, sizeof(PRINTDLG));
pd.lStructSize = sizeof(PRINTDLG);
pd.hwndOwner = NULL;
pd.hDevMode = NULL;
pd.hDevNames = NULL;
pd.Flags = PD_USEDEVMODECOPIESANDCOLLATE | PD_RETURNDC |
PD_NOPAGENUMS | PD_NOSELECTION | PD_HIDEPRINTTOFILE|
PD_RETURNDEFAULT;
pd.nCopies = 1;
pd.nFromPage = 1;
pd.nToPage = 1;
pd.nMinPage = 1;
pd.nMaxPage = 1;
memset(&di, 0, sizeof(DOCINFO));
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = filename;
//印刷を実行
if (PrintDlg(&pd)==TRUE)
{
StartDoc(pd.hDC, &di);
StartPage(pd.hDC);
//描画を実行
int lnWidth = 2000;
int lnHeight = 5000;
HDC hMemDC = CreateCompatibleDC(pd.hDC);
HBITMAP hBitmap = CreateCompatibleBitmap(pd.hDC,lnWidth,lnHeight);
HBITMAP Obj = (HBITMAP)SelectObject(hMemDC,hBitmap);
int iRet = GetDeviceCaps(hMemDC,RASTERCAPS);
// コピー
iRet = BitBlt(hMemDC,0,0,lnWidth,lnHeight,pd.hDC,0,0,SRCCOPY);
EndPage(pd.hDC);
EndDoc(pd.hDC);
DeleteDC(pd.hDC);
return true;
}
return false;
}
No.3ベストアンサー
- 回答日時:
作成中のアプリって WindowsForm/Console どのようなタイプですか?
C++/CLIですと PrintDocumentのイベントで印刷の制御をしますが ・・・
PrintDocumentのBeginPrint/PrintPage/EndPaintなどを使います
BeginPrintが印刷の初期設定
EndPrintが印刷の後始末 … 不要な場合もあります
PrintPageが印刷処理の本体です
単純な線引きの MoveToEx/LineTo などを実行しても何も描画されませんか?
MoveToEx( pd.hDC, 100, 100 );
LineTo( pd.hDC, 500, 800 );
といった具合で ・・・
この回答への補足
たぶん、WindowsFormです。
Form1.hには以下のコード文が載っていましたので・・・。
public ref class Form1 : public System::Windows::Forms::Form
あと単純な線引きのMoveToEx/LineTo を行っても何も描画できませんでした。
以下そのときのコード。
MoveToEx( pd.hDC, 100, 100 , NULL);
LineTo( pd.hDC, 500, 800 );
あきらめて、PrintDocumentの処理を入れて確かめて見ます。
いろいろとありがとうございました。
以下のようにソースコードを書いてみたところ、
見事に印刷結果に画像が写りました。
以下ソースコード(タブを全角スペースにしています)
bool printFile(char *filename)
{
PRINTDLG pd;
DOCINFO di;
HWND hWnd;
HDC hBuffer;
//プリンタの設定
memset(&pd, 0, sizeof(PRINTDLG));
pd.lStructSize = sizeof(PRINTDLG);
pd.hwndOwner = NULL;
pd.hDevMode = NULL;
pd.hDevNames = NULL;
pd.Flags = PD_USEDEVMODECOPIESANDCOLLATE | PD_RETURNDC |
PD_NOPAGENUMS | PD_NOSELECTION | PD_HIDEPRINTTOFILE|
PD_RETURNDEFAULT;
pd.nCopies = 1;
pd.nFromPage = 1;
pd.nToPage = 1;
pd.nMinPage = 1;
pd.nMaxPage = 1;
memset(&di, 0, sizeof(DOCINFO));
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = filename;
//印刷を実行
if (PrintDlg(&pd)==TRUE)
{
StartDoc(pd.hDC, &di);
StartPage(pd.hDC);
//描画を実行
long int lnWidth = 500000;
long int lnHeight = 700000;
HDC hMemDC = CreateCompatibleDC(pd.hDC);
HANDLE hBitmap = LoadImage( NULL, filename, IMAGE_BITMAP,
0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE );
HGDIOBJ Obj = SelectObject(hMemDC,hBitmap);
int iRet = GetDeviceCaps(hMemDC,RASTERCAPS);
// コピー
iRet = BitBlt(pd.hDC,0,0,lnWidth,lnHeight,hMemDC,0,0,SRCCOPY);
EndPage(pd.hDC);
EndDoc(pd.hDC);
DeleteDC(pd.hDC);
return true;
}
return false;
}
No.5
- 回答日時:
デフォルトのペンは太さ1の黒が選択される場合が多いと思いますよ
// 生成
HPEN hPen = CreatePen( PS_SOLID, 1, RGB( 0, 0, 0 ) );
// 選択
HPEN hOldPen = SelectObject( pd.hDC, hPen );
// 描画処理
// 後始末
SelectObject( pd.hDC, hOldPen );
DeleteObject( hPen );
といった具合です ・・・
ありがとうございます。表示され、線が印刷されました。
後はビットマップの描画だけクリアできれば完了です。
以下そのときのソースコード。
bool printFile(char *filename)
{
PRINTDLG pd;
DOCINFO di;
HWND hWnd;
HDC hBuffer;
//プリンタの設定
memset(&pd, 0, sizeof(PRINTDLG));
pd.lStructSize = sizeof(PRINTDLG);
pd.hwndOwner = NULL;
pd.hDevMode = NULL;
pd.hDevNames = NULL;
pd.Flags = PD_USEDEVMODECOPIESANDCOLLATE | PD_RETURNDC |
PD_NOPAGENUMS | PD_NOSELECTION | PD_HIDEPRINTTOFILE|
PD_RETURNDEFAULT;
pd.nCopies = 1;
pd.nFromPage = 1;
pd.nToPage = 1;
pd.nMinPage = 1;
pd.nMaxPage = 1;
memset(&di, 0, sizeof(DOCINFO));
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = filename;
//印刷を実行
if (PrintDlg(&pd)==TRUE)
{
StartDoc(pd.hDC, &di);
StartPage(pd.hDC);
//描画を実行
//ペンの生成
HGDIOBJ hPen = CreatePen( PS_SOLID, 1, RGB( 0, 0, 0 ) );
// ペンの選択
HGDIOBJ hOldPen = SelectObject( pd.hDC, hPen );
// 描画処理
int lnWidth = 20000;
int lnHeight = 50000;
for ( int x = 0; x < 2000; x+= 100 ) {
::MoveToEx( pd.hDC, 100, 100 , NULL);
::LineTo( pd.hDC, x, 1000 );
}
// 後始末
SelectObject( pd.hDC, hOldPen );
DeleteObject( hPen );
EndPage(pd.hDC);
EndDoc(pd.hDC);
DeleteDC(pd.hDC);
return true;
}
return false;
}
No.4
- 回答日時:
OfficeXPや2003などが入っているなら
『Office Document Image Writer』や『XPS Document Writer』といったプリンターが追加されていると思います
これを デフォルトのプリンターにして実行してみてはいかがでしょう
線1本では出力されたどうかがわからないのであれば
for ( int x = 0; x < 2000; x+= 100 ) {
::MoveToEx( 100, 100, NULL );
::LineTo( x, 1000 );
}
といった具合で出力してみるとか ・・・
pd.hDCは NULLではないのですよね
未だに、印刷は白紙のままです。
pd.hDCはNULLではなくきちんとした値でした。
話によると、デフォルトのペンの色や太さを指定する関数があるようですが、
それが原因かと探っているところです。
No.2
- 回答日時:
C++/CLIだったらもっと高度な簡単な方法があるのでは?
たとえば立ち上げ時読み込みを例にとると
public: Form1(void)
{
InitializeComponent();
-------------------
-------------------
this->bitmap = dynamic_cast<System::Drawing::Bitmap^>(gcnew System::Drawing::Bitmap("tokyo.bmp"));
}
という風に
印刷などもだいぶ楽にできたと記憶しているが
ありがとうございます。この方法を早速試してみたのですが、エラーが出てしまいました。
一応、エラーを消そうとしたのですが、画像が印刷されない所か、印刷さえもしませんでした。
理解が足りなくてすみません。
No.1
- 回答日時:
BitBltの方向が逆ですよ
pd.hDCが転送先(ディストネーション側) hMemDCに表示したいBitmapを選択しておいて
転送という方向になるかと ・・・
ご質問の状態では プリンター側のHDCから hMemDCへ転送になります
また DOCINFOの lpszDocNameは 印刷ドキュメントの名前であって
印刷したい画像ファイルなどの名前を登録するものではないと思います
LoadImageでファイルを読み込むか
CLI側でBitmapオブジェクトにイメージを取り込んでprintFileに対して ハンドルを渡してやるか
でしょう
LoadImageならば
HBITMAP hBitmap = LoadImage( NULL, filename, IMAGE_BITMAP,
0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE );
// LR_CREATEDIBSECTIONが無いとうまくいかない場合がありました
といった具合
ハンドルを渡すのであれば
void printFile( IntPtr hImage )
としておいて
HBITMAP hBitmap = (HBITMAP)hImage.ToPointer();
呼び出し側では
Bitmap^ oBmp = gcnew Bitmap( "ファイルパス" );
printFile( oBmp->GetHbitmap() );
といった具合です ・・・
画面とプリンターでは解像度が違うので そのままBitBltするととても小さなイメージになりますよ
一応、途中のコードをご指摘のとおりに直したところ、
返し値が正常に返ってきましたが、未だに画像が印刷されません。
どうしたらよいのでしょうか?
以下、修正したコードです。
//描画を実行
int lnWidth = 20000;
int lnHeight = 50000;
HDC hMemDC = CreateCompatibleDC(pd.hDC);
HBITMAP hBitmap = (HBITMAP)LoadImage( NULL, filename, IMAGE_BITMAP,
0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE );
HBITMAP Obj = (HBITMAP)SelectObject(hMemDC,hBitmap);
int iRet = GetDeviceCaps(hMemDC,RASTERCAPS);
// コピー
iRet = BitBlt(pd.hDC,0,0,lnWidth,lnHeight,hMemDC,0,0,SRCCOPY);
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 電気工事士 【電気受電キューピクルのPD】受電キューピクルの引き込み線が入って来た断路部の先の2 2 2022/10/30 06:53
- バッテリー・充電器・電池 モバイルチャージャー( QC3.0/PD対応)のメーカー2種類でどちらが良いか? 4 2022/06/03 10:29
- バッテリー・充電器・電池 パソコンの充電器について,65wか45wか悩んでます。 4 2023/01/13 12:41
- その他(コンピューター・テクノロジー) 専用のACアダプタはUSB PDに取って代わられ今後なくなりますよね? 専用のACアダプタはデータを 1 2023/08/25 11:57
- デスクトップパソコン https://www.stormst.com/products/detail/1735 このPCっ 2 2022/12/24 16:10
- その他(パソコン・スマホ・電化製品) USB充電の規格の正式名称は何でしょうか? 3 2023/08/26 09:19
- 電気工事士 【一般受電設備】のキューピクルのPD、PTの配置場所を教えてください。 1 2023/02/14 11:36
- 高校 物理の熱力学の問題です。 (4)のア,ウがわかりません。 ・なぜPd=1/2(P1+P2)、Vd=1 3 2022/11/24 22:48
- その他(パソコン・周辺機器) PCI-Express の USB Type-C PD 対応拡張カードはありますか? 5 2022/10/08 08:54
- 宗教学 「浄土真宗」は、共産主義のイデオロギーを持ってたのですか? 2 2022/07/25 16:39
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
印刷ダイアログを表示させない方法
-
VBで帳票するサンプル
-
印刷要求順番と印刷出力順番が...
-
プリンターを指定して印刷するには
-
VBAで印刷スプール終了の判定を...
-
VBAで不特定枚数印刷をしたいで...
-
イベントプロシージャ 印刷が...
-
印刷ダイアログを表示させたくない
-
クリレポのプリンタ設定について
-
VB6上から印刷ダイアログを表示...
-
VB.NET+ActiveReports で印刷...
-
vbaでPDFファイルが印刷されない
-
PHPからVBで作った文書印刷処理...
-
~の文字化けについて
-
エクセルの入力履歴を知りたい
-
テキストファイル印刷 .net VB...
-
プログラムからプリンタジョブ...
-
ファイルのパス指定での印刷方法
-
VBからのプリンタ制御について
-
[Visual Studio] ソースの印刷...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
印刷要求順番と印刷出力順番が...
-
印刷ダイアログを表示させない方法
-
ActiveReportsを使って[印刷ダ...
-
印刷ダイアログを表示させたくない
-
プリンターを指定して印刷するには
-
PDFファイルを印刷し終了するには
-
vbaでPDFファイルが印刷されない
-
VBscriptでPDFファイルを直接印...
-
VBからのプリンタ制御について
-
ACCESSで設定した帳票の用紙サ...
-
イベントプロシージャ 印刷が...
-
VBSでExcelファイル印刷時のプ...
-
phpでの自動印刷
-
VBAにて指定したセルをプルダウ...
-
EXCELファイルの複数ダウンロー...
-
VBAで印刷スプール終了の判定を...
-
プリンタの印刷ジョブを削除し...
-
PHPでPDFファイルの直接印刷
-
A4の2枚をA3の1枚にする編集方法?
-
VBでExcel印刷する時のプリンタ...
おすすめ情報