ページ 11

WINAPI32での印刷

Posted: 2010年8月21日(土) 12:17
by taketoshi
こんにちは。

現在、猫windowsを教本にしてメモ帳を作っています。
印刷を実装しようとしているのですが、
TextOut関数では改行が反映されず四苦八苦しています。

strtokで格納されているバッファをトークン化してみましたが、
改行文字が何個か続くとまとめて一つとみなされるようで、単体でしか反映されません。

そこで、rectに適当な数値を設定して、DrawTextで無理やりプリントしたところ
改行文字が反映されて、windowsのメモ帳の様な画面そのままの印刷ができたのですが。
数値が適当な為、全面印刷ができませんでした。

そこで質問なのですが、プリンタのrectの取得方法がわかりません。Getclientrectじゃ当然だめでした。
調べたところGetDevieceCaps関数で取得できる??様子ですが、引数の設定方法が不明です。
以下に動かないですが、ソースを張らせていただきます。ご指導よろしくお願いします。

int MyPrint(HWND hEdit,HWND hWnd)
{

char *buff;
HGLOBAL hMem;
int nLen;
PRINTDLG print;
DOCINFO doc;
RECT rc;

nLen = GetWindowTextLength(hEdit);
hMem = GlobalAlloc(GHND,sizeof(char *) * nLen+1);
buff = (char *)GlobalLock(hMem);
//GetWindowText(hEdit,buff,nLen+1);
SendMessage(hEdit,WM_GETTEXT,nLen+1,(LPARAM)buff);

memset(&print,0,sizeof(PRINTDLG));
print.lStructSize = sizeof(PRINTDLG);
print.hwndOwner = hWnd;
print.hDevMode = NULL;
print.hDevNames = NULL;
print.Flags = PD_USEDEVMODECOPIESANDCOLLATE | PD_RETURNDC | PD_NOPAGENUMS | PD_NOSELECTION | PD_HIDEPRINTTOFILE;
print.nMinPage = 1;
print.nMaxPage = 1;
print.nToPage = 1;
print.nCopies = 1;

rc.top = 0;
rc.left = 0;
rc.right = GetDeviceCaps(print.hDC,HORZRES);
rc.bottom = GetDeviceCaps(print.hDC,VERTRES);

memset(&doc,0,sizeof(DOCINFO));
doc.cbSize = sizeof(DOCINFO);
doc.lpszDocName = "test";

if(PrintDlg(&print)==0)
return -1;

StartDoc(print.hDC,&doc);
StartPage(print.hDC);

DrawText(print.hDC,buff,-1,&rc,DT_EXPANDTABS);

EndPage(print.hDC);
EndDoc(print.hDC);
DeleteDC(print.hDC);
GlobalUnlock(hMem);
GlobalFree(hMem);

return 0;
}

Re:WINAPI32での印刷

Posted: 2010年8月22日(日) 00:31
by ISLe
> rc.right = GetDeviceCaps(print.hDC,HORZRES);
> rc.bottom = GetDeviceCaps(print.hDC,VERTRES);

未確認ですが
rc.right = GetDeviceCaps(print.hDC, PHYSICALWIDTH);
rc.bottom = GetDeviceCaps(print.hDC, PHYSICALHEIGHT);
ではどうでしょう。

Re:WINAPI32での印刷

Posted: 2010年8月22日(日) 09:07
by taketoshi
お返事ありがとうございます。

指定してみましたが、プリンタが動きませんでした。

//debug
nDebug = GetDeviceCaps(print.hDC,PHYSICALWIDTH);
wsprintf(debug,"%d",nDebug);
MessageBox(hWnd,debug,"test",MB_OK);

上記のデバックを噛ませて見たところ、戻り値が0なのでだめみたいです。
デバックローラー作戦でちょっと数値をみてみます・・・。


ほかにこんな方法あるよって方は教えていただけると幸いです。

Re:WINAPI32での印刷

Posted: 2010年8月22日(日) 10:47
by taketoshi
自己レスです。ISLeさんのアドバイス通りで解決致しました。
戻り値が0だったのはプリンタダイアログを表示する前にデバッグかけていたので
プリンタのhdcが固定されずに0だったようです・・・。

他にも同様の現象で迷う方がいるかもしれないので汚いですがソースを晒しておきます。
どうもありがとうございました。

int MyPrint(HWND hEdit,HWND hWnd)
{

char *buff,debug[64];
HGLOBAL hMem;
int nLen,nDebug;
static PRINTDLG print;
DOCINFO doc;
RECT rc;

nLen = GetWindowTextLength(hEdit);
hMem = GlobalAlloc(GHND,sizeof(char *) * nLen+1);
buff = (char *)GlobalLock(hMem);
//GetWindowText(hEdit,buff,nLen+1);
SendMessage(hEdit,WM_GETTEXT,nLen+1,(LPARAM)buff);

memset(&print,0,sizeof(PRINTDLG));
print.lStructSize = sizeof(PRINTDLG);
print.hwndOwner = hWnd;
print.hDevMode = NULL;
print.hDevNames = NULL;
print.Flags = PD_USEDEVMODECOPIESANDCOLLATE | PD_RETURNDC | PD_NOPAGENUMS | PD_NOSELECTION | PD_HIDEPRINTTOFILE;
print.nMinPage = 1;
print.nMaxPage = 1;
print.nToPage = 1;
print.nCopies = 1;

memset(&doc,0,sizeof(DOCINFO));
doc.cbSize = sizeof(DOCINFO);
doc.lpszDocName = "test";

if(PrintDlg(&print)==0)
return -1;

////debug
//nDebug = GetDeviceCaps(print.hDC,PHYSICALWIDTH);
//wsprintf(debug,"%d",nDebug);
//MessageBox(hWnd,debug,"test",MB_OK);

rc.top = 0;
rc.left = 0;
rc.right = GetDeviceCaps(print.hDC,PHYSICALWIDTH);
rc.bottom = GetDeviceCaps(print.hDC,PHYSICALHEIGHT);

StartDoc(print.hDC,&doc);
StartPage(print.hDC);

DrawText(print.hDC,buff,-1,&rc,DT_EXPANDTABS);

EndPage(print.hDC);
EndDoc(print.hDC);
DeleteDC(print.hDC);
GlobalUnlock(hMem);
GlobalFree(hMem);

return 0;
}