喫茶XRAYトップページ

[スレッド全体
]

[9808] Re:FloodFillがプリンタに対応しない返信 削除
2016/4/22 (金) 06:14:07 Mr.XRAY
▼ nyさん,どうもです.

> GetDeviceCapsのRASTERCAPSにRC_STRETCHBLTが含まれていないとコピーできません。
>
> 具体的なコードが知りたいですがご教授を・・・・


これは,GetDeviceCaps 関数の使い方ということでよろしいでしょうか ?
でしたら,例えば以下のようになりますね.

[GetDeviceCaps 関数 - MSDN]
https://msdn.microsoft.com/ja-jp/library/cc428670.aspx

procedure TForm1.Button1Click(Sender: TObject);
var
  LDeviceCap : Integer;
  LCapable   : Integer;
begin
  LCapable := RC_FLOODFILL;

  if PrinterSetupDialog1.Execute then begin
    LDeviceCap := GetDeviceCaps(Printer.Handle, RASTERCAPS);
    if (LDeviceCap and LCapable) = LCapable then begin
      MessageBox(Handle, 'サポートあり', '調査結果', MB_ICONINFORMATION);
    end;
  end;
end;

ただですね.プリンタでですね.メモリデバイスコンテキストを持っている,
というのは記憶にないですね.
つまり,プリンタには RC_FLOODFILL の機能はないと思います.
あまり自信ないですけど.
地震なら,先日,熊本で大きいのがありましたが (^^;

ディスプレイ (モニタ) でしたら使えますどね.当然ですが,

procedure TForm1.Button4Click(Sender: TObject);
var
  LDeviceCap : Integer;
  LCapable   : Integer;
  LDesktopDC : HDC;
begin
  LCapable := RC_FLOODFILL;

  LDesktopDC := CreateDC('DISPLAY', nil, nil, nil);
  try
    LDeviceCap := GetDeviceCaps(LDesktopDC, RASTERCAPS);
    if (LDeviceCap and LCapable) = LCapable then begin
      MessageBox(Handle, 'サポートあり', '調査結果', MB_ICONINFORMATION);
    end;
  finally
    DeleteDC(LDesktopDC);
  end;
end;


[9809] Re2:FloodFillがプリンタに対応しない返信 削除
2016/4/22 (金) 06:17:22 Mr.XRAY
> ただですね.プリンタでですね.メモリデバイスコンテキストを持っている,
> というのは記憶にないですね.


これがあれば,プリンタから,例えばビットマップ画像が取得できることになります.


[9810] Re3:FloodFillがプリンタに対応しない返信 削除
2016/4/23 (土) 02:20:41 ny
>GetDeviceCaps 関数の使い方ということでよろしいでしょうか ?
それもなのですが。

ベジェー曲線数本で閉じられた図形の内部を塗潰したく、
FloodFillを使ってやってます。

ディスプレイ画面上では出来たのですが、プリンタ出力時に塗潰しが出来ず、
外枠のベジェー曲線のみになってしまいます。

それで、参考サイトを見つけたのですが、私の技量では理解できず でした。

阿蘇神社の裏手に友人がいるのですが、連絡とれません。
当方も東日本の時、携帯バッテリがもったいなくて無視しました。「電話よこすな!プンプン」と。
10回くらい電話したらよかったなぁ。.

[9811] Re4:FloodFillがプリンタに対応しない返信 削除
2016/4/23 (土) 11:27:01 Mr.XRAY
> ベジェー曲線数本で閉じられた図形の内部を塗潰したく、
> FloodFillを使ってやってます。
>
>ディスプレイ画面上では出来たのですが、プリンタ出力時に塗潰しが出来ず、
>外枠のベジェー曲線のみになってしまいます。


FloodFill は TPrinter.Canvas で使用しても機能しませんから.
で,今度は慎重に,確認してから... ホホホッ.

FloodFill で塗り潰しても TPrinter.Canvas では無効になってしまう.
それは諦めるが,FloodFillを使用した結果の図形なり画像を
プリンタで印刷できさえすれば構わない.
その方法があるか ? あれば教えて頂きたい.
ということでよろしいでしょうか ?

それとも,某掲示板で,にしのさんがレスしている

>一度TCanvasオブジェクトに書いて、それをPrinterオブジェクトのCanvasに
>コピーすれば回避できると思います。

(改行変更)

の意味を教えて頂きたい,ということでしょうか ?

それによって,具体的にどんなコードを示せばいいかを考えたいと思います.
あるいは考え方だけを示せばいいのか... ですね.


[9812] Re5:FloodFillがプリンタに対応しない返信 削除
2016/4/23 (土) 14:45:46 Mr.XRAY
> それによって,具体的にどんなコードを示せばいいかを考えたいと思います.
> あるいは考え方だけを示せばいいのか... ですね.


意図することと違う場合を考えてです.
面と向かっての対話とは違いますからね.

昔,メールでの問い合わせで,
「今,コンピュータの前で Delphi を起動しているなら,そのままやりとりしませんか
今片づけてしまいませんか ?」
と返信して,時間はどのくらいかかったかは分かりませんが,
片づけたことがあります.

これを日数をまたがってやっていると,別のことに頭がいっていますから,
また,その問題を考えなければなりません.
これは効率が悪いです.
少し時間かけても,その時にやってしまえば,結局は効率的なのではないか,
と思っているんですわ.
まっ,ケースバイケースでしょうね.


それと,少し前に某掲示板ですごいレスがありました.
まさにエスパーのようなレスでした.
質問者の文章から,質問の意図がをみ取り,レスしていたのです.
私には,あのような真似はできません.
思わず質問の文章を分析してしまいました (笑)  <-- 内容は喫茶XRAYに書いています.

私の場合,具体的でないとダメですね.
理解力がないのか,読み取る能力がないのか,
それとも,理解しようと努力しないのか,面倒なのか (笑)


[9813] Re6:FloodFillがプリンタに対応しない返信 削除
2016/4/23 (土) 18:10:36 Mr.XRAY
> 私の場合,具体的でないとダメですね.
> 理解力がないのか,読み取る能力がないのか,
> それとも,理解しようと努力しないのか,面倒なのか (笑)


今回の場合は,理解できないというのが,どの部分なのかが理解できない,
ということでございますです.ハイ.


[9814] 難解と思われる文章の読み方返信 削除
2016/4/23 (土) 18:59:53 Mr.XRAY
> 今回の場合は,理解できないというのが,どの部分なのかが理解できない,
> ということでございますです.ハイ.


当サイトの記事は難解だという方がいます.
文章を眺めて,難解というのではなく,読んでみることです.
すると,どこで分からなくなるのかわかる時があります.

先の某掲示板のにしのさんの文章を例にあげてみます.
(改行位置変えています)

>TCanvasのFloodFill関数は、内部でWin32APIのExtFloodFill関数を呼んでいます。

これはいいですよね ?

>この関数は、メモリデバイスコンテキストと、ラスタオペレーションをサポート
>するデバイスだけに使えるらしいです。


これは用語が理解できない場合があるかも知れません.
そういう時は,そういう単語を無視して読みます.
「この関数は,XXX をサポートする XXX だけに使えるらしいです.」
と読みます.

これは,実は次のチェックで確認できます.

>Win32APIのGetDeviceCaps関数で、RASTERCAPSを指定したときの戻り値に
>RC_FLOODFILLが含まれていれば使えると思います。


この方法については,既に具体的なコードを提示しました.

>このときも、StretchBltを使用する場合は、やはりGetDeviceCapsの
>RASTERCAPSにRC_STRETCHBLTが含まれていないとコピーできません。


これも前に提示したコードを使えばチェックできます.

すると,残るのは以下だけです.

>一度TCanvasオブジェクトに書いて、それをPrinterオブジェクトのCanvasに
>コピーすれば回避できると思います。


こんな感じで読んでいくわけです.
そうすれば,全く理解できないから一歩前進します.
解決へ一歩近づくわけです.
ポイントは,文章を「眺める」のではなく「読む」ことです.

ところがですね.某掲示板等の質問の文章を読むと,句読点がなく,
句点までが何百字もあるのを見かけます.
そういうのは,文章を分解しなければ解読できません.
私の定義では,そういうのを「難解」といいます.ハイ.

えっ!? この文章が難解だろうって ?


[9815] Re:難解と思われる文章の読み方返信 削除
2016/4/24 (日) 01:32:37 ny
う! 難解だ。

>FloodFillを使用した結果の図形なり画像を
>プリンタで印刷できさえすれば構わない.
>その方法があるか ? あれば教えて頂きたい.
>ということでよろしいでしょうか ?


ということだったのですが・・・・・

[9816] FloodFillの描画結果をプリンタで印刷返信 削除
2016/4/24 (日) 20:29:39 Mr.XRAY
>ということだったのですが・・・・・

ホホホッ.おそらくそうだと思いました.でも,

>下記サイトをみつけましたが、理解できません。

となっていました.となると,GetDeviceCaps と

>一度TCanvasオブジェクトに書いて、それをPrinterオブジェクトのCanvasにコピーすれば

の部分しかありません.
で,自分で確認した方がいいのでは.それは GetDeviceCaps で調べることになります.
これが最初のレスです.ところが,

>私の技量では理解できず でした。

ということでした.どこが ?
ということで,ちょっと意地悪してみたくなりました.
それと,この喫茶XRAY はいろいろな方が観ていると思います.
少しは参考になることも書きたかったので.
これがメールでのやりとりとの違いですね.

また,反応が早くないですから,そんなに急いでいるわけではないと...
遠回りしても影響ないと...
具体的にテストしたとかのコードもないし...

この喫茶XRAY で質問したこと自体が間違いの元だったですね (^^;
身の不幸を嘆いてくださいませ.
同じ質問を他のコミュニティの場で見つけても,レスはしないですね.

『お前性格悪いね』と思うでしょう ?
そうです.その通りでございます.ハイ.
昔,山岳会で,新人にロッククライミングを指導している時に,
登り方が悪いと言ってやり直しさせたことがあります.
『お前,そういう陰湿なことをするんじゃねえよ !!』
と,先輩にぶん殴られたことがあります.ホホホッ,オーホホホッ.
(いちいち殴るんじゃねえよ !! <--  今だから言えるけど...)


で,本題ですが,ヒントは

>一度TCanvasオブジェクトに書いて、それをPrinterオブジェクトのCanvasにコピーすれば

にあります.TPrinter.Canvas では FloodFill が機能しないので,
例えば TBitmap.Canva や TMetafileCanvas に描画して,その描画結果の画像を
TPrinter.Canvas に描画します.

>具体的なコードが知りたいですがご教授を・・・・

と書いているので具体的なコードを.
本当は,そういう場合,質問する方が,簡単なテストコードを示すのが
いいんですけどね.
そうしないと,たとえ具体的なコードを示しても,
実際に意図する「具体的なコード」にならないことがあります.
テストコードがあれば,どのような仕様を満たせばいいのかが判断できる
ことがあります.
そういう手間は惜しまない方がいいです.ハッキリ言って.

単にコードが欲しいとなると「質問」ではなく「依頼」になって
しまうことがあります.「依頼」には通常「代価」が伴います.

# ルンペルシュティルツキンは言う,
# 《魔法には代償が伴うのだ》

下のコードは TBitmap.Canvas を使用する例です.
このコードではコピーではなく,StretchDraw しています.

動作確認は Windows 7 U64(SP1) + Delphi XE(UP1) Pro です.

procedure TForm1.Button2Click(Sender: TObject);
var
  LBitmap : TBitmap;
  LRect   : TRect;
begin
  LBitmap := TBitmap.Create;
  try
    //サイズは目的に応じて決める
    LBitmap.Width  := 200;
    LBitmap.Height := 200;

    //四角形を描画する
    LRect := Rect(30, 50, 100, 120);
    LBitmap.Canvas.Pen.Width := 5;
    LBitmap.Canvas.Pen.Color := clBlack;
    LBitmap.Canvas.Rectangle(LRect);

    //塗り潰しの色を指定して,四角形の内部を塗り潰す
    LBitmap.Canvas.Brush.Color := clLime;
    LBitmap.Canvas.FloodFill(LRect.Left + 10, LRect.Top + 10, clWhite, fsSurface);


    //ビットマップ画像をTPrinter.Canvasに描画
    Printer.PrinterIndex := -1;
    Printer.BeginDoc;
    try
      //印刷範囲の縦横比をビットマップと同じ比率にしないと歪む
      Printer.Canvas.StretchDraw(Rect(300, 500, 2100, 2300), LBitmap);
    finally
      Printer.EndDoc;
    end;
  finally
    FreeAndNil(LBitmap);
  end;
end;

↓は,上のコードの実行結果です.この図は,印刷スプールの画像です.
印刷時の DPI は 300 です.

[9817] Re:FloodFillの描画結果をプリンタで印刷返信 削除
2016/4/24 (日) 22:09:21 Mr.XRAY
> ↓は,上のコードの実行結果です.この図は,印刷スプールの画像です.

私はキングジムの回し者ではありません.


[9818] Re2:FloodFillの描画結果をプリンタで印刷返信 削除
2016/4/25 (月) 02:45:11 ny
ありがたや、ありがたや、
神様、仏様!!!

今日は回転すし食べて腹こわしてました。
明日、参考コードを組み込んでみます。

>「依頼」には通常「代価」が
何がよい考えたのですが、当方、坊主なので「生前戒名」はいかがでしょうか。
80Kから都市部では500Kくらいしますが。。。。
(坊主のくせに、すし食って、今の時間に起きてるって、つっこまないで!)

[9819] Re3:FloodFillの描画結果をプリンタで印刷返信 削除
2016/4/25 (月) 08:30:56 Mr.XRAY
> >「依頼」には通常「代価」が
> 何がよい考えたのですが、当方、坊主なので「生前戒名」はいかがでしょうか。


いりません !!
代価,代償をを要求すると,ルンペルシュティルツキンのように,
自分で自分の身を滅ぼすことになるかも知れませんので (^^;

>(坊主のくせに、すし食って、今の時間に起きてるって、つっこまないで!)

実は,夜な夜な,密会が...
捜査当局が証拠をつかむまでお待ちください.


[9820] Re4:FloodFillの描画結果をプリンタで印刷返信 削除
2016/4/25 (月) 08:35:50 Mr.XRAY
> 代価,代償をを要求すると,ルンペルシュティルツキンのように,

今,ググったら,ルンペルシュティルツヒェン(Rumpelstilzchen) ?
英語読みだと キンにはならないか ?
そうだったのか ?
どっちにしても言葉に発したら分からないからいいとしよう !


[9828] Re5:FloodFillの描画結果をプリンタで印刷返信 削除
2016/4/26 (火) 01:50:25 ny
>Printer.Canvas.StretchDraw
理解できました。
printer.Canvas.CopyRectとか、デルファイのプリンタ出力の常套手段だったのでしょか。
頂いたコードを参考に、希望どうりの結果が得られました。

>ルンペルシュティルツヒェン
怖いですねぇ〜〜。
>捜査当局
怖いですねぇ〜〜
当方も「お布施、お布施」と、言ってると身を引き裂さかれてしまいそう。
「ザーンゲ、ザンゲ」(懺悔)

ありがとうございました。

[9829] Re6:FloodFillの描画結果をプリンタで印刷返信 削除
2016/4/26 (火) 12:06:15 Mr.XRAY
▼ nyさん

> printer.Canvas.CopyRectとか、デルファイのプリンタ出力の常套手段だったのでしょか。

その他にも Windows API にも,描画に関係する関数類がありますが,
割と一般的に使用されていますね.


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82