WINAPI32での印刷
Posted: 2010年8月21日(土) 12:17
こんにちは。
現在、猫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;
}
現在、猫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;
}