印刷時に改ページ 認識方法を処理 – プログラミング – Home

印刷時に改ページ 認識方法を処理
 
通知
すべてクリア

[解決済] 印刷時に改ページ 認識方法を処理

固定ページ 1 / 2

MONO
 MONO
(@MONO)
ゲスト
結合: 23年前
投稿: 13
Topic starter  

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


引用未解決
トピックタグ
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

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

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


返信引用
MONO
 MONO
(@MONO)
ゲスト
結合: 23年前
投稿: 13
Topic starter  

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


返信引用
MONO
 MONO
(@MONO)
ゲスト
結合: 23年前
投稿: 13
Topic starter  

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


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

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


返信引用
MONO
 MONO
(@MONO)
ゲスト
結合: 23年前
投稿: 13
Topic starter  

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


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

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だと「印刷、ページ」キーワード検索でも参考になるもの出てきますよ


返信引用
職業婦人
 職業婦人
(@職業婦人)
ゲスト
結合: 23年前
投稿: 9
 

CEditViewを使う場合とCViewを使う場合
印刷の処理は異なります。
環境・基本のクラスなどはきちんと書きましょう。
マルチポストは感心できません。


返信引用
MONO
 MONO
(@MONO)
ゲスト
結合: 23年前
投稿: 13
Topic starter  

すみません。
環境は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);
}
までは分かったのですが、そこからの処理が分かりません。


返信引用
職業婦人
 職業婦人
(@職業婦人)
ゲスト
結合: 23年前
投稿: 9
 

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


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

職業婦人さん
①OnPreparePrinting :印刷準備(ページ数セット)
②OnBeginPrinting :開始準備(開始ページの変更など)
③OnPrint       :OnDrawを呼び出し
           OnDrawをクライアント描画のみにしたい時はOnDrawを呼び出
           さないようにオーバーライドする
④OnDraw       :描画
⑤OnEndPrinting :終了処理(1ページごと)

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

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

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

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


返信引用
MONO
 MONO
(@MONO)
ゲスト
結合: 23年前
投稿: 13
Topic starter  

職業婦人さん

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


返信引用
職業婦人
 職業婦人
(@職業婦人)
ゲスト
結合: 23年前
投稿: 9
 

私が書き換えたのは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
 MONO
(@MONO)
ゲスト
結合: 23年前
投稿: 13
Topic starter  

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


返信引用
職業婦人
 職業婦人
(@職業婦人)
ゲスト
結合: 23年前
投稿: 9
 

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を参考にしてください。


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました