質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Q&A

解決済

2回答

1904閲覧

エディットボックスの内容をすべて印刷するには?

mery

総合スコア27

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

0グッド

0クリップ

投稿2018/08/05 03:17

前提・実現したいこと

エディットボックスに入力してある文字列をすべて印刷するプログラムを作りたいのですが、2ページ目以降の印刷の仕方が分かりません。
下のプログラムを実行した時に表示されるダイアログでページ範囲を「すべて」にしたときにすべてのページが印刷されるようにするにはどうすればいいのでしょうか?
私の持っている本には1ページ分の印刷方法しか書いてありませんでした。
nMaxPageの値を変更しなければいけないとは考えましたが、エディットボックスの内容が何ページ分あるかを調べる方法もわからないです。
いろいろ調べた結果、複数ページを印刷する場合はStartPageとEndPageを複数回繰り返せばいいという情報を見つけましたが、その場合DrawTextEx関数をどのように使えばいいかもわかりません(普通に複数回繰り返したら同じページだけが複数ページ印刷されました)。

該当のソースコード

C言語によるwin32プログラム(印刷する関数以外は省略します) LPTSTR moji=NULL; //文字列用保存用のグローバル変数 void myprint(HWND hWnd, HWND hedit){ static PRINTDLG pd; DOCINFO di; RECT rc; HGLOBAL hmem; int editsize; memset(&pd,0,sizeof(PRINTDLG)); pd.lStructSize=sizeof(PRINTDLG); pd.hwndOwner=hWnd; pd.Flags=PD_RETURNDC | PD_HIDEPRINTTOFILE | PD_USEDEVMODECOPIESANDCOLLATE; pd.nMinPage=1; pd.nMaxPage=1; pd.nFromPage=1; pd.nToPage=1; pd.nCopies=1; if(PrintDlg(&pd)==0){ return; } editsize=GetWindowTextLength(hedit); hmem=GlobalAlloc(GHND,sizeof(TCHAR)*editsize+sizeof(TCHAR)); moji=(LPTSTR)GlobalLock(hmem); GetWindowText(hedit,moji,editsize+1); memset(&di,0,sizeof(DOCINFO)); di.cbSize=sizeof(DOCINFO); di.lpszDocName=TEXT("test"); di.lpszOutput=NULL; StartDoc(pd.hDC,&di); StartPage(pd.hDC); rc.left = 0; rc.top = 0; rc.right = GetDeviceCaps(pd.hDC,PHYSICALWIDTH); rc.bottom = GetDeviceCaps(pd.hDC,PHYSICALHEIGHT); DrawTextEx(pd.hDC,moji,-1,&rc,DT_WORDBREAK | DT_EXPANDTABS | DT_EDITCONTROL,NULL); EndPage(pd.hDC); EndDoc(pd.hDC); DeleteDC(pd.hDC); GlobalUnlock(hmem); GlobalFree(hmem); }

補足情報(FW/ツールのバージョンなど)

Microsoft Visual C++ 2010 Express
WIN32 ユニコードビルド

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

どこかに問題があるかもしれませんがとりあえず全ページ印刷はできました。

C

1LPTSTR moji=NULL; //文字列用保存用のグローバル変数 2void myprint(HWND hWnd, HWND hedit){ 3 4 static PRINTDLG pd; 5 static DOCINFO di; 6 RECT rc; 7 HGLOBAL hmem; 8 int editsize;//エディットボックスに入力されている文字数保存用 9 int editline;//エディットボックスに入力されている行数 10 int hchar;//1行の高さ保存用 11 int linesperpage;//用紙1ページの行数 12 int totalpages;//総ページ数 13 int pagecount;//ループのカウンタ用 14 int mojicount=0;//描画した文字数保存用 15 DRAWTEXTPARAMS dtp; 16 TEXTMETRIC tm; 17 18 memset(&pd,0,sizeof(PRINTDLG)); 19 pd.lStructSize=sizeof(PRINTDLG); 20 pd.hwndOwner=hWnd; 21 22 pd.Flags=PD_RETURNDC | PD_ALLPAGES |PD_HIDEPRINTTOFILE|PD_USEDEVMODECOPIESANDCOLLATE; 23 24 pd.nMinPage=0; 25 pd.nMaxPage=0; 26 pd.nFromPage=0; 27 pd.nToPage=0; 28 pd.nCopies=1; 29 30 editline=SendMessage(hedit,EM_GETLINECOUNT,0,0); 31 32 if(PrintDlg(&pd)==0){ 33 return; 34 } 35 GetTextMetrics(pd.hDC,&tm); 36 hchar=tm.tmHeight+tm.tmInternalLeading; 37 linesperpage=GetDeviceCaps(pd.hDC,VERTRES)/hchar; 38 totalpages=(editline+linesperpage-1)/linesperpage; 39 40 editsize=GetWindowTextLength(hedit); 41 hmem=GlobalAlloc(GHND,sizeof(TCHAR)*editsize+sizeof(TCHAR)); 42 moji=(LPTSTR)GlobalLock(hmem); 43 GetWindowText(hedit,moji,editsize+1); 44 45 46memset(&di,0,sizeof(DOCINFO)); 47di.cbSize=sizeof(DOCINFO); 48di.lpszDocName=TEXT("test"); 49di.lpszOutput=NULL; 50 51StartDoc(pd.hDC,&di); 52for(pagecount=0;pagecount<totalpages;pagecount++){ 53StartPage(pd.hDC); 54 55dtp.iLeftMargin=0; 56dtp.cbSize=sizeof(DRAWTEXTPARAMS); 57dtp.iRightMargin=0; 58dtp.iTabLength=4; 59 60rc.left = 0; 61rc.top = 0; 62rc.right = GetDeviceCaps(pd.hDC,HORZRES); 63rc.bottom = GetDeviceCaps(pd.hDC,VERTRES); 64DrawTextEx(pd.hDC,moji+mojicount,-1,&rc,DT_WORDBREAK | DT_EXPANDTABS | DT_EDITCONTROL,&dtp); 65mojicount=mojicount+dtp.uiLengthDrawn; 66EndPage(pd.hDC); 67} 68EndDoc(pd.hDC); 69DeleteDC(pd.hDC); 70GlobalUnlock(hmem); 71GlobalFree(hmem); 72 73 74}

投稿2018/08/23 11:47

mery

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Win32 API でテキストデータを印刷するためには、すべて自前で行わなければいけませんので、プログラムは結構面倒なことになります。

プログラミング Windows 第五版にそのものズバリのサンプルプログラムが載っています。

概要は、フォント情報から一文字の高さを求めます。1ページの高さを求め、全体の行数からページ数を求めます。
1ページごとに StartPage() と EndPage() を繰り返し、一行ずつ TextOut() で印刷します。

投稿2018/08/06 04:12

編集2018/08/06 04:16
Bull

総合スコア986

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mery

2018/08/06 11:05

なかなか役に立ちそうな本を教えていただきありがとうございました。しばらく調べて解決しない場合は購入してみようと思います。 TextOut() を使う方法では改行やタブ文字の処理などが面倒そうなのでDrawText関数を使った方がいいと考えたのですが、DrawText関数を使って全ページ印刷はできないということなんでしょうか?
Bull

2018/08/06 12:23

DrawText関数を使って、プリンターに文字データの印字は可能です。 ただし、自動的に改ページしたりはできないと思います。 DrawText関数は、成功すると“高さ”を返しますので、それで改ページのタイミングを調整することも出来ると思います。 プログラミングWindowsの最新刊は第六版のようですが、ちょっと見た感じではストアアプリ向けの解説で、従来の Win32 API の解説はないようです。 プログラミングWindows第五版は Win32 API でプログラミングするなら、持っていても損はないと思います。
mery

2018/08/23 11:56

回答ありがとうございます。遅くなりましたがプログラミング Windows 第五版(上)の内容を参考にいろいろ試してみたらなんとかできましたのでソースコードを載せておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問