dポイントプレゼントキャンペーン実施中!

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;
}

A 回答 (5件)

作成中のアプリって 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の処理を入れて確かめて見ます。

補足日時:2010/11/14 08:31
    • good
    • 0
この回答へのお礼

いろいろとありがとうございました。
以下のようにソースコードを書いてみたところ、
見事に印刷結果に画像が写りました。
以下ソースコード(タブを全角スペースにしています)
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;
}

お礼日時:2010/11/17 19:55

デフォルトのペンは太さ1の黒が選択される場合が多いと思いますよ




// 生成
HPEN hPen = CreatePen( PS_SOLID, 1, RGB( 0, 0, 0 ) );
// 選択
HPEN hOldPen = SelectObject( pd.hDC, hPen );
// 描画処理

// 後始末
SelectObject( pd.hDC, hOldPen );
DeleteObject( hPen );
といった具合です ・・・
    • good
    • 0
この回答へのお礼

ありがとうございます。表示され、線が印刷されました。
後はビットマップの描画だけクリアできれば完了です。
以下そのときのソースコード。
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;
}

お礼日時:2010/11/17 19:28

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ではないのですよね
    • good
    • 0
この回答へのお礼

未だに、印刷は白紙のままです。
pd.hDCはNULLではなくきちんとした値でした。

話によると、デフォルトのペンの色や太さを指定する関数があるようですが、
それが原因かと探っているところです。

お礼日時:2010/11/16 22:01

C++/CLIだったらもっと高度な簡単な方法があるのでは?



たとえば立ち上げ時読み込みを例にとると

public: Form1(void)
{
    InitializeComponent();
    -------------------

-------------------
    this->bitmap = dynamic_cast<System::Drawing::Bitmap^>(gcnew System::Drawing::Bitmap("tokyo.bmp"));
}

という風に

印刷などもだいぶ楽にできたと記憶しているが
    • good
    • 0
この回答へのお礼

ありがとうございます。この方法を早速試してみたのですが、エラーが出てしまいました。
一応、エラーを消そうとしたのですが、画像が印刷されない所か、印刷さえもしませんでした。
理解が足りなくてすみません。

お礼日時:2010/11/13 18:18

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するととても小さなイメージになりますよ
    • good
    • 0
この回答へのお礼

一応、途中のコードをご指摘のとおりに直したところ、
返し値が正常に返ってきましたが、未だに画像が印刷されません。
どうしたらよいのでしょうか?

以下、修正したコードです。
//描画を実行
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);

お礼日時:2010/11/13 21:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!