喫茶XRAYトップページ


[1276] 自作リッチテキストエディタで背景を黒にしているときの印刷が・・・返信 削除
2007/7/3 (火) 23:56:58
皆さん、こんばんは。
plPrev、TplSetPrinterを使わせて頂いております。

先ほどプリンタについて書いていたので質問したいと思っていたことですが・・・

私はすべてのエディタは背景色を黒(0)にして、文字を白(16777215)
で使用しています(私の好みです)。
印刷すると、背景は白(でいいのですが)
文字もたぶん白なので見た目には見えません(印刷してるか判らない)。
ただし、タイトルは黒で印刷します。
ふつうに、背景を白、文字色を黒にすると、問題なく印刷できます。

背景の黒は自動的に白に反転していいのですが、文字も反転してほしいのですが
設定の方法が解りません。
サンプルコードは
http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/index.htm
のを使わせて頂いています。
できましたら、よろしくお願いします。



[1277] Re:自作リッチテキストエディタで背景を黒にしているときの印刷が・・・返信 削除
2007/7/4 (水) 00:10:46 Mr.XRAY
▼ 宮さん

> 背景の黒は自動的に白に反転していいのですが、文字も反転してほしいのですが
> 設定の方法が解りません。


背景自動的に半纏じゃない、反転するんですか。へえ〜。
今日は(もう昨日か)遅いので、明日戻ってから試してみます。
スミマセン。お休みなさい。

Linuxの情報ほしいですね。宮さんの記事を読んで、ちょっと私も興味がわいて
きました。
Vistaを導入可能なマシンを考えています。
(あっ、スレッド違いでしたね)

[1279] Re:自作リッチテキストエディタで背景を黒にしているときの印刷が・・・返信 削除
2007/7/4 (水) 12:13:09 ANDY
▼ 宮さん

参考までに私の場合、次のようにしています。

b:=(HantenChk) and (not PV.Printing);
   if b then begin                              //反転時のみ黒くする
    PV.Canvas.Brush.Color:=clBlack;
    PV.Rectangle(0,PV.PaperWidth,0,PV.PaperHeight);
   end;
   if b then PV.FontColor(clWhite) else PV.FontColor(clBlack);
   if b then PV.LineColor(clWhite) else PV.LineColor(clBlack);

> 背景の黒は自動的に白に反転していいのですが、文字も反転してほしいのですが
> 設定の方法が解りません。



[1280] Re2:自作リッチテキストエディタで背景を黒にしているときの印刷が・・・返信 削除
2007/7/4 (水) 13:48:51
▼ ANDYさん
> ▼ 宮さん
>
> 参考までに私の場合、次のようにしています。
>

ANDYさんありがとうございます。私のレベルは初級クラスですがらすぐには
どこに入れたらいいのか理解できませんが、
参考にしていろいろ挑戦してみます。できれば自動判別したいですね。

ちなみに私のコードはMR.XRAYさんの
http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/index.htm
そのままです。それに四苦八苦して付け足したりして、
自分で何をやっているのか判らないで使っています。(plPrevを理解していない)
ベテランからみれば「なんじゃ?こりゃ!」だと思いますが。

参考までにコードは下記の通りです。
procedure TForm1.actTextPrintExecute(Sender: TObject);
begin
    plPrev1.Title:=ExtractFileName(formMDI.ComboBox1.Text); //ページのタイトルとして印刷する

        //マージンセット
    plPrev1.TopMargin    :=StrToInt(EditUp.Text)   *10;
    plPrev1.BottomMargin :=StrToInt(EditBottom.Text) *10;
    plPrev1.LeftMargin   :=StrToInt(EditLeft.Text) *10;
    plPrev1.RightMargin  :=StrToInt(EditRight.Text)*10;


    RichEditPrint( plPrev1.LeftMargin ,
                    Ceil(plSetPrinter1.PaperWidth*254.0/plSetPrinter1.XResolution)-plPrev1.RightMargin,
                    plPrev1.TopMargin,
                    Ceil(plSetPrinter1.PaperHeight*254.0/plSetPrinter1.YResolution)-plPrev1.BottomMargin,
                    RichEdit1);

    plPrev1.ShowModal;
end;
//--------------------------------------------------------------描画ルーチン

procedure TForm1.RichEditPrint(X1,X2,Y1,Y2: Integer; Rich: TRichEdit);
function MiliToTwips(V: Integer): Integer;
begin
    Result:=Trunc(V*1440.0/254.0);
end;
var
    Range     : TFormatRange;
    LastChar  : Integer;
    MaxLen    : Integer;
    OldMap    : Integer;
begin
    LastChar := 0;
    MaxLen   := Rich.GetTextLen;
    Range.chrg.cpMin:=0; //テキストの最初から

    plPrev1.BeginDoc;
    try
        repeat    //毎回Rangeにセット
            //--------------------------------------------------------------ヘッ・#95;ー印刷
            plPrev1.FontHeight(MiliToTwips(5));//60);
            plPrev1.TextOut((Ceil(plSetPrinter1.PaperWidth*254.0/plSetPrinter1.XResolution) div 3)
                                 ,MiliToTwips(10)
                                 ,ExtractFileName(formMDI.ComboBox1.Text));
            //--------------------------------------------------------------本文印刷

            FillChar(Range, SizeOf(TFormatRange), 0);  //Rangeを0(null)で埋める
            Range.hdc       := plPrev1.Canvas.Handle;  //出力先デバイスのハンドル
            Range.hdcTarget := Range.hdc;              //書式設定するデバイスのハンドル
            Range.rc.Left   :=MiliToTwips(X1); //描画領域の指定(Twips単位)
            Range.rc.Right  :=MiliToTwips(X2); //最初の頁だけ印刷位置などを変更する場合は分岐処理する
            Range.rc.Top    :=MiliToTwips(Y1); //ミリ単位をピクセルに変換する
            Range.rc.Bottom :=MiliToTwips(Y2);
            Range.rcPage := Range.rc; //用紙1頁のサイズ//本当は用紙サイズをTwipsで指定すべき?
            Range.chrg.cpMax:= -1;    //最後まで(-1で自動計算)
            OldMap := SetMapMode(Range.hdc,MM_TEXT); //マップモードMM_TEXTにして前のマップモードをSaveMapに保存
            SendMessage(Rich.Handle, EM_FORMATRANGE, 0, 0); //バッファのフラッシュ
            try
                Range.chrg.cpMin:=LastChar;    //この頁の開始は前の最後の文字から

                LastChar:=SendMessage(Rich.Handle,EM_FORMATRANGE,1,Longint(@Range)); //実際の印刷
                if (LastChar<MaxLen) and (LastChar<>-1) then //まだ印刷すべきデータがある場合は改頁
                begin
                    plPrev1.NewPage;
                end;
            finally
                SendMessage(Rich.Handle, EM_FORMATRANGE,0,0); //バッファのフラッシュ
                SetMapMode(Range.hdc,OldMap);                 //マップモードを元に戻す
                TPrev(plPrev1).ScaleInitialize(plPrev1.Canvas,False); //TplPrevでは0.1mmm単位に戻すということ
            end;
        until (LastChar >= MaxLen) or (LastChar = -1);
    finally
        plPrev1.EndDoc;
    end;
end;

//--------------------------------------------------------------フッター印刷
procedure TForm1.plPrev1BeforeView(Sender: TObject; Page: Integer);
var
    PageStr: String;
begin
    //文字のサイズ
    plPrev1.FontSize(10);
    //頁番号の文字列を作成
    PageStr:=IntToStr(Page)+'/'+IntToStr(plPrev1.PageCount);
    plPrev1.TextOut(Trunc((Ceil(plSetPrinter1.PaperWidth*254.0/plSetPrinter1.XResolution) div 2))
                          ,Ceil(plSetPrinter1.PaperHeight*254.0/plSetPrinter1.YResolution)-80
                          ,PageStr);
end;



[1282] Re3:自作リッチテキストエディタで背景を黒にしているときの印刷が・・・返信 削除
2007/7/4 (水) 20:11:56 Mr.XRAY
▼ 宮さん

RichEditなんですが、背景色と文字の色はどのように設定しているのでしょうか。
また、文字の色は全て同色なのでしょうか。

[1283] Re4:自作リッチテキストエディタで背景を黒にしているときの印刷が・・・返信 削除
2007/7/4 (水) 21:20:50 Mr.XRAY
> RichEditなんですが、背景色と文字の色はどのように設定しているのでしょうか。
> また、文字の色は全て同色なのでしょうか。


文字の背景色ではなく、RichEdit全体の背景色だから関係ないようです。
問題は、文字の色をどのように設定してるかが関係しますが、
画面(Form)に表示している時と、印刷(プレビュー)の時で文字の色を変更
しないと・#95;メみたいですね。

RichEditの文字の色の変更は以下に参考コードがあります。
http://www2.big.or.jp/~osamu/Delphi/tips.cgi?index=0216.txt

以下は、文字の色を
(1) Formに表示した時に変更
(2) プレビューの時に黒に変更
(1) プレビューで閉じたらまた変更
という仕様になっています。関数にするなり、適当にいじって下さい。
ANDYさん、スンマセン。ちょっと残念でした。(^_^;)

// http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/T_RichEdit1.htm
// のコード参照
procedure TForm1.FormShow(Sender: TObject);
var
     AFilePath: String;
     CharFmt  : TCharFormat2;
begin
     AFilePath:=ExtractFilePath(Application.ExeName)+'\RichText.RTF';
     if FileExists(AFilePath) then begin
       RichEdit1.Lines.LoadFromFile(AFilePath);
     end;

     with CharFmt do begin
       cbSize:=SizeOf(CharFmt);
       dwMask :=CFM_COLOR; //文字の色だけ変更のフラグ
       crTextColor:=clWhite;
     end;
     RichEdit1.Perform(EM_SETCHARFORMAT,SCF_ALL,lParam(@CharFmt));
end;

// プレビューのメソッド(プレビューボタンクリックイベント内でも可)
procedure TForm1.TestPrint;
var
     CharFmt  : TCharFormat2;
begin
     with CharFmt do begin
       cbSize:=SizeOf(CharFmt);
       dwMask :=CFM_COLOR;
       crTextColor:=clBlack;
     end;
     RichEdit1.Perform(EM_SETCHARFORMAT,SCF_ALL,lParam(@CharFmt));

     plPrev1.FontHeight(60);
     plPrev1.TextOut(200,200,'リッチエディトの印刷例');
     RichEditPrint(300,1900,450,1800,RichEdit1);

     with CharFmt do begin
       cbSize:=SizeOf(CharFmt);
       dwMask :=CFM_COLOR;
       crTextColor:=clWhite;
     end;
     RichEdit1.Perform(EM_SETCHARFORMAT,SCF_ALL,lParam(@CharFmt));
end;



[1286] Re5:自作リッチテキストエディタで背景を黒にしているときの印刷が・・・返信 削除
2007/7/5 (木) 10:59:28
ANDYさん、Mr.XRAYさんありがとうございました。

▼ Mr.XRAYさん
> > RichEditなんですが、背景色と文字の色はどのように設定しているのでしょうか。
> > また、文字の色は全て同色なのでしょうか。
>

すみません。
RichEditの背景と文字色でした。
設定はRichEditを開くとき
RichEdit1.Color := iniFIle.ReadInteger('Rich','COLOR', 0);
RichEdit1.Font.Color := iniFIle.ReadInteger('Rich','FontColor', 16777215);
のようにしています。

Mr.XRAYさんのコンポーネントを使いこなせず、
コードを見せたら思わず吹き出されるだろうと恥ずかしがったのですが。
また教えてください。


INCM/CMT
Cyclamen v3.82