またお世話になりたいと思います。
環境は
windows 2000
VC++ 6.0
MFC ダイアログベース
です。
固定されている表がある。
可変部分で名前を印刷したい。
表には名前は10人分しか出力できない。
もし15人分の名前を印刷したいときは
1枚目には 1/2
2枚目には 2/2
と印刷したい。
1ページ分の表はすでに出力できるようになってます。
画像などはなく、表は1ページ分で固定なので
2ページ目またがっているということはありません。
ヘルプを見ながら CPrintInfo を使って
m_nCurPage でやってみたのですが
1ページで終わってしまいました。
全体のページ数が取得できていないということなのでしょうか?
よろしくお願いします。
ダイアログベースなのにCPrintInfoって役に立ちましたっけ?
ダイアログベースでCPrintInfoを使うってのは一般論では話しにくいと思う
> 全体のページ数が取得できていないということなのでしょうか?
何か特別なライブラリでも使ってない限り、これは自分で数える以外の方法はない
ダイアログベースということなので、実装方法が分からないので具体的には答えられないけど
プログラムの中に下記の流れがありませんか?
1ページを印刷するときの流れ
1.StartDoc()
2.StartPage()
3.印刷
4.EndPage()
5.EndDoc()
上記の流れなら下記のようにするのは難しくないでしょう
2ページを印刷するときの流れ
実際にはループの前で印刷総ページ数をカウントすれば何ページでも対応できる
1.StartDoc()
int nPage
int nPageMax = 2;
for (nPage = 0; nPage < nPageMax; nPage++) {
2. StartPage()
3. 印刷
4. EndPage()
}
5.EndDoc()
たぶん総ページ数は下記のようにして計算するのではないのかな?
int nManCnt = 15;
int nPageMax = ((nManCnt + 9) / 10);
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200307/03070065.txt
の続きのようですね。
> 1ページ分の表はすでに出力できるようになってます。
> 画像などはなく、表は1ページ分で固定なので
> 2ページ目またがっているということはありません。
(中略)
> 1ページで終わってしまいました。
> 全体のページ数が取得できていないということなのでしょうか?
もう少し、きちんと説明した方がいいと思うのですが・・・。
2ページ目にまたがっていないのであれば1ページで終わると思いますが?
> ダイアログベースなのにCPrintInfoって役に立ちましたっけ?
> ダイアログベースでCPrintInfoを使うってのは一般論では話しにくいと思う
まだまだ勉強不足で何をしたらいいのかよくわからなく、
CPrintInfo を使ってやってみたのですがやはり違ったようなので
質問させていただきました。
> プログラムの中に下記の流れがありませんか?
> 1ページを印刷するときの流れ
> 1.StartDoc()
> 2.StartPage()
> 3.印刷
> 4.EndPage()
> 5.EndDoc
は、あります。
> int nManCnt = 15;
というのは印刷したい人数でよいのですか?
> int nPageMax = ((nManCnt + 9) / 10);
10は1枚に印刷できる人数でよいのですか?
> > int nManCnt = 15;
> というのは印刷したい人数でよいのですか?
> > int nPageMax = ((nManCnt + 9) / 10);
> 10は1枚に印刷できる人数でよいのですか?
その通りです
nManCntに0~21くらいまでの値を仮想的に当てはめてシミュレートしてみます
そのときのnPageMaxは期待した総ページ数になったでしょうか?
> nManCntに0~21くらいまでの値を仮想的に当てはめてシミュレートしてみます
> そのときのnPageMaxは期待した総ページ数になったでしょうか?
はい。できました!!
ありがとうございます。
そしてもう1つ質問なんですが・・・
1枚目には 1/2
2枚目には 2/2
と、出力したいのですが
どのようにしたらいいのですか?
参考になるようなこと教えていただけませんか?
> 1枚目には 1/2
> 2枚目には 2/2
> と、出力したいのですが
実は前の時にも書いたんだけど(^^;
int nPage;// 現在のページ
int nPageMax;// 総ページ
for (nPage = 0; nPage < nPageMax; nPage++) {
// 1ページ分の印刷
~
// ページ番号の印刷
CString strPagePrint;
strPagePrint.Format(%d/%d, nPage, nPageMax);
pDC->TextOut(0, 0, strPagePrint); // 座標は計算してください
~
}
座標は計算してください
座標以外は上記のような書き方でOKです
前のは忘れてください
int nManCnt = 15;
int nPage;// 現在のページ
int nPageMax = ((nManCnt + 9) / 10);// 総ページ
for (nPage = 0; nPage < nPageMax; nPage++) {
// 1ページ分の印刷
~
// ページ番号の印刷
CString strPagePrint;
strPagePrint.Format(%d/%d, nPage + 1, nPageMax);
pDC->TextOut(0, 0, strPagePrint); // 座標は計算してください
~
}
レス遅れて申し訳ありません。
こんなかんじでやってみたのですが・・・
int nCnt = 12; //印刷人数 15人から12人に変更
int nPage;
int nPageMax = ((nCnt + 11) / 12);
for(nPage=0; nPage<nPageMax; nPage++){
//新しいページの開始
myDC.StartPage();
//印刷
epsonprint(myHdc); //違う .cpp で印刷
CString str_page;
str_page.Format(%d/%d, nPage + 1, nPageMax);
myDC.TextOut(3780,100,str_page);
myDC.EndPage();
}
同じページが2枚出るだけで
続きがでてくれません。
しかも途中の人から出てしまいます。
それは
epsonprint(myHdc);
がうまくいってないからでしょうか?
あと
int nPageMax = ((nCnt + 11) / 12);
で + 11 は何でするんですか?
> epsonprint(myHdc);
> がうまくいってないからでしょうか?
その後に続くページ番号の印刷が正しいなら、おそらくそれが原因でしょう。
> int nPageMax = ((nCnt + 11) / 12);
> で + 11 は何でするんですか?
たった一人であっても1ページ必要でしょう?
コードを見ていて気になったんですが、
実際のデータの印刷を行う関数は、その時点で自分が何ページ目を印刷すればいいのか
を知るすべがあるのでしょうか?
見る限りではデバイスコンテキストの(多分)ハンドルしか渡していないみたいですけれ
ど。
私なら、印刷ロジックに何ページ目を印刷しなさいと引数で渡すようにします。
もっと言うなら、一ページに印刷する人数とかそういったパラメータも外から
与えるようにします。そうすることでデータ部の印刷内容は気にしなくて良くなります。
あとは、外側でヘッダーやフッターの印刷をすれば良いわけです。
関数化して処理を分けるということは呼び出す関数に任せれば外側は気を使わないで
良いようにするのが本当でしょう。出来れば、ヘッダーやフッターの印刷処理に影響を
受けないように関数としての独立性を持たせた方がベターです。
皆様レスどうもありがとうございました。
とっても役にたちました。
とりあえず2枚に印刷できるようになり
あとは印刷部分を途中からではなく
最初の人からできるよう
自分で考えてみます。
またわからないことがありましたら
よろしくお願いします。
本当にありがとうございました。