印刷時に改ページ" "認識方法を処理

[戻る]
MONO 2002/04/15(月) 14:34:57
MFCで印刷をしているのですが、印刷ページを手動で切替て印刷をしたいと思っています。
その時に特殊ではあるのですが、改ページ""でページ切替をしたいと思っています。
印刷をしたいファイルはtxt形式です。エディタによって改ページが様々かと思うのですが、
何とか印刷をしたいと思っています。
何方かご存知の方がいらっしゃいましたら教えてください。
よろしくお願い致します。

wood 2002/04/16(火) 06:31:28
>>""でページ切替
テキストファイルを行単位読み出しし""をカウント
OnBeginPrintでMaXPageをセット
""が見つかるたびにOnDrawをぬければ良いのではないですか
ページスキップしたいときは、カーソルメンバいじればよいのではないですか

私も印刷に関しては「Inside Visual C++ V5.0」見ながら
最近学習始めたばかりなのでこんな程度しかいえませんけど・・・

MONO 2002/04/22(月) 12:04:55
woodさんありがとうございます。
しかし、あれからいろいろと試したのですが出来ません。
VC++を理解していないと言うのもあるのですが、印刷時にテキストファイルを行単位で
読出し""(0x0C)をカウントする方法が分かりません。
これは印刷時でなければいけないのでしょうか?
それ以外ならば初めにカウントをしページ数が分かるのですけど。
それ以後のOnDrawの抜け方、ページスキップの仕方が分かりません。
すみませんが、もう少し詳しく教えて頂けませんでしょうか。

MONO 2002/04/22(月) 12:05:00
woodさんありがとうございます。
しかし、あれからいろいろと試したのですが出来ません。
VC++を理解していないと言うのもあるのですが、印刷時にテキストファイルを行単位で
読出し""(0x0C)をカウントする方法が分かりません。
これは印刷時でなければいけないのでしょうか?
それ以外ならば初めにカウントをしページ数が分かるのですけど。
それ以後のOnDrawの抜け方、ページスキップの仕方が分かりません。
すみませんが、もう少し詳しく教えて頂けませんでしょうか。

wood 2002/04/22(月) 12:26:14
改行と改ページ勘違いしてませんか?
>それ以後のOnDrawの抜け方、ページスキップの仕方が分かりません。
Cprintinfoのcursorの値書き換えればいいんじゃないですか
(OnDrawの抜け方)なんで関数の終了のしかたわからないのですか
OnDrawってMaxPage数分繰り返されるんじゃないんですか

MONO 2002/04/22(月) 13:28:56
すみません。改ページの判断です。
初めからですみません。
すごく初歩的な事なのですが、MFCでは印刷と印刷プレビューとで改ページの認識は
しているのでしょうか?
もしその時に改ページの認識として""(0x0C・16進数で見たときの値です。あるテキストエデ
ィタだと CL Ctrl-L)を見分けるのは可能なのですか?
なんどもすみません。自分でどうしたらよいかはっきり言いましてわかりません。
面倒かと思いますが、よろしくお願い致します。

wood 2002/04/22(月) 21:39:55
void aaa(void)
{
  int   flg_i;
  int   Loop_cnt;
  char  buf[255];

  bufへデータ読み込み
  flg_i = 0;
  for(Loop_cnt = 0;Loop_cnt < 255 && flg_i == 0;Loop_cnt++)  {
     if(buf[Loop_cnt] == 0x0c) flg_i = 1;
  }
    
}

こんなかんじで見分けることできないのですか
>あるテキストエディタだと CL Ctrl-L)を見分けるのは可能なのですか?
「あるテキストエディタ」とは、何でしょうか?
それがどんなものか、わからないので答えようがありませんが

「Inside Visual C++ V5.0」 491ページ参考にしてみたら
どうですか
MSDNだと「印刷、ページ」キーワード検索でも参考になるもの出てきますよ

職業婦人 2002/04/22(月) 23:09:12
CEditViewを使う場合とCViewを使う場合
印刷の処理は異なります。
環境・基本のクラスなどはきちんと書きましょう。
マルチポストは感心できません。

MONO 2002/04/22(月) 23:24:12
すみません。
環境はVC++6.0
基本クラスはCEditViewです。

void C?????View::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
{
    // デフォルトの CEditView で印刷を開始します。
    CEditView::OnBeginPrinting(pDC, pInfo);
}

void C?????View::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)
{
    // デフォルトの CEditView の印刷後の後処理
    CEditView::OnEndPrinting(pDC, pInfo);
}

で印刷・印刷プレビューはしているのですが、
改ページの認識が出来ておらずページがずれてしまいます。

そこで、
void C?????View::OnPrint(CDC* pDC, CPrintInfo* pInfo) 
{
    // TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してくだ
    CEditView::OnPrint(pDC, pInfo);
}
までは分かったのですが、そこからの処理が分かりません。

職業婦人 2002/04/23(火) 03:14:41
初めてのCEditView・・・2時間かかった。
CEditView::OnPrint(pDC, pInfo);の中はみましたか?
VCのセットアップ方法によってはみれません。
VCを入れ直してでも見れるようにしましょう。
OnPrintの処理に5行程度書き加えればできました。
ヒントはPrintInsideRectです。

wood 2002/04/23(火) 06:57:25
職業婦人さん
@OnPreparePrinting   :印刷準備(ページ数セット)
AOnBeginPrinting     :開始準備(開始ページの変更など)
BOnPrint       :OnDrawを呼び出し
           OnDrawをクライアント描画のみにしたい時はOnDrawを呼び出
           さないようにオーバーライドする
COnDraw        :描画
DOnEndPrinting       :終了処理(1ページごと)

A〜DまでMaxPageになるまで呼び出され
印刷ページを飛ばしたいときはCPrintInfoのm_nCurPageを変更すればいい

こんな順番でデフォルト呼び出しされると思っていたのですが
Viewによって違うのですか
何見ればその違いわかりますか

ごみプロでしか学習していないのでもう少し多種(**View)にわたって
学習したいので私にも、ヒントキーワード教えてください
間違っていたらご指摘ください

便乗しました(後日具体例で別スレッド起こします) 

MONO 2002/04/23(火) 11:00:07
職業婦人さん

ヒントありがとうございます。
しかし、何度やってもできません。
OnPreparePrinting、OnBeginPrinting、OnPrint、PrintInsideRect、OnDraw
OnEndPrintingの呼ぶ組合せがわかりません。
また、PrintInsideRectの引数がhelpを見ても理解できません。
申し訳ないですが、参考例とかありませんでしょうか?

職業婦人 2002/04/23(火) 12:39:42
私が書き換えたのはOnPrintだけです。
CEditView::OnPrint(pDC, pInfo);を呼び出すのはやめて
かわりにCEditView::OnPrintのコードを丸ごとコピーしました。
その後PrintInsideRectを使っている前後を書き換えただけです。
PrintInsideRectの引数はMSDNを見るより実際の値を見たほうが
理解しやすかったです。
CEditView::OnPrintのソースコードはインストールしていれば
以下のフォルダにあるようです。
  C:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC
CEditView::OnPrintを呼び出している部分でブレークポイントで
止めてステップインしていっても表示されます。

woodさんへ
CEditViewから派生させたクラスでの印刷は初めてでした。
他のCCtrlViewやCFormViewから派生させたクラスは使ったこともありません。
実はCEditViewで文字の表示はカプセル化されているだろうとは
思っていましたがOnDraw()も呼ばれるものだと思っていたぐらいなので
多分私は適切なお返事はできないと思います。
ですが きっと先人の方々が回答くださると思いますので
スレッド起こしてみてください。


#MFCのソースはVC++のパッケージによってはないかもしれません。
#確認してみますが。

MONO 2002/04/23(火) 16:38:28
度々すみません。
コードをコピーし実行してみたのですが、
未だに上手くいきません。
PrintInsideRectに渡すものが分かりません。
また、改ページの判断の処理をどのようにしたらよいか未だに分かりません。
すみません、もう少しヒントをください。

職業婦人 2002/04/23(火) 18:37:48
CEditView::PrintInsideRect( *pDC, rectLayout, nIndexStart, nIndexStop ); は
CEditViewの持つ文字列のnIndexStart文字目からnIndexStop文字目までを1ページに出力し、
何文字目まで出力したかを返します。(この文章には少し語弊があります。)
nIndexStart:お約束ですが0から数えます。
nIndexStop:0から数えてnIndexStop-1までが出力対象です。
文字列が ABCDEFGHIJK で nIndexStart=0,nIndexStop=5の場合
ABCDEまでが出力されnIndex=5が帰ります。
nIndexをm_aPageStartに加えているので次のページの印刷では
nIndexStartが5になりFから出力されます。
nIndexStopが大きすぎる場合はnIndex<nIndexStopになります。

主な処理は以下の2つです。
・nIndexStartから後で最初の0x0CのインデックスをnIndexStopに設定する。
・nIndex == nIndexStop の場合、次のページで0x0Cから出力すると変なので
  m_aPageStartに加える値は調整する。
  (nIndex++;または改行が隣接している場合はnIndex+=3;など)

CEditViewの持つ文字列の取得方法はnIndexStartを参考にしてください。

wood 2002/04/23(火) 21:09:04
MONOさんは自分のプログラムをデバック実行したことありますか
質問の内容からするとデバックウインドウの使い方自体知らないのではないですか
関数の呼ばれる順番が分からないとか、値の渡し方分からないとか
疑問に思うのですが?

MONO 2002/04/25(木) 11:34:32
度々質問ですみません。
改ページは認識し出力することができたのですが、
1ページに収まらない場合に縮小/拡大は可能でしょか?

職業婦人 2002/04/25(木) 12:07:32
まずどのようにして0x0Cで改ページを実現できたのか
そのソースを載せてください。
掲示板上でのマナーは守ってください。
・マルチポストはしない。
・捨てハンドルは使わない。
・結果はきちんと報告する。

#拡大/縮小は可能です。

wood 2002/04/25(木) 12:13:21
改ページ認識できたんでしょ
このスレッド解決にして新しいスレッドで質問したらどうですか

MONO 2002/04/25(木) 13:11:52
[[解決]]
職業婦人さん、woodさんありがとうございました。
改ページの認識が出来るようになりました。
認識方法としては改ページ(0x0C)までのバイト数をバッファにとっておき(改行は2バイト)、
CEditView::OnPrintコード内の
PrintInsideRect( *pDC, rectLayout, nIndexStart, nIndexStop )のnIndexStart、
nIndexStop
に上記バッファにとっておいた改ページまでのバイト数をnIndexStopに格納しました。
あとは、m_aPageStart、nIndexを調整しまして表示が可能となりました。
職業婦人さんの教えて頂いた通りにやってみました。
ありがとうございました。
マナーを遵守せず度々すみませんでした。

職業婦人 2002/04/25(木) 21:34:17
>CEditViewの持つ文字列の取得方法はnIndexStartを参考にしてください。
PrintInsideRectを参考にしてください。 の間違いでした。m(__)m

古いスレッドには追加発言できません。