C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

C#+WPF, 矩形内部への文字出力 /S.Kos (20/07/29(Wed) 14:58) #95412
Re[1]: C#+WPF, 矩形内部への文字出力 /ぶなっぷ (20/07/29(Wed) 15:29) #95413
  └ Re[2]: C#+WPF, 矩形内部への文字出力 /S.Kos (20/07/29(Wed) 16:15) #95415
    └ Re[3]: C#+WPF, 矩形内部への文字出力 /S.Kos (20/07/29(Wed) 20:16) #95416
      └ Re[4]: C#+WPF, 矩形内部への文字出力 /Hongliang (20/07/29(Wed) 20:58) #95417
        └ Re[5]: C#+WPF, 矩形内部への文字出力 /S.Kos (20/07/30(Thu) 08:46) #95418
          └ Re[6]: C#+WPF, 矩形内部への文字出力 /Hongliang (20/07/30(Thu) 08:57) #95419
            ├ Re[7]: C#+WPF, 矩形内部への文字出力 /S.Kos (20/07/30(Thu) 09:33) #95421
            │└ Re[8]: C#+WPF, 矩形内部への文字出力 /Hongliang (20/07/30(Thu) 10:24) #95422
            └ Re[7]: C#+WPF, 矩形内部への文字出力 /ぶなっぷ (20/07/30(Thu) 09:29) #95420
              └ Re[8]: C#+WPF, 矩形内部への文字出力 /S.Kos (20/07/30(Thu) 10:40) #95423
                └ Re[9]: C#+WPF, 矩形内部への文字出力 /S.Kos (20/07/30(Thu) 13:24) #95424 解決済み


親記事 / ▼[ 95413 ]
■95412 / 親階層)  C#+WPF, 矩形内部への文字出力
□投稿者/ S.Kos (8回)-(2020/07/29(Wed) 14:58:47)

分類:[.NET 全般] 

こんにちは、みなさま

Graphics.DrawStringを用いて、矩形の内部に内部に文字を書き出していました。
およそ、下記の如くです。

StringFormat sf = new StringFormat();
sf.LineAlignment = StringAlignment.Center;
sf.Alignment = StringAlignment.Center;

Rectangle rect = new Rectangle(xPos, yPos, xLen, yLen );

e.Graphics.DrawString( "なんちゃら限定",
new System.Drawing.Font("MS 明朝", fSize, FontStyle.Bold),
Brushes.Black,
rect,
sf );

Pen myPen = new Pen(Color.FromArgb(0 , 0 , 0) , 1);
e.Graphics.DrawRectangle(myPen, rect);

これをWPFで書き直そうとして躓きました。
文字の出力も、矩形の出力も、なんとかなったのですが、矩形の中に文字、で行き詰まっています。
なんとかなるモノでしょうか?
[ □ Tree ] 返信 編集キー/

▲[ 95412 ] / ▼[ 95415 ]
■95413 / 1階層)  Re[1]: C#+WPF, 矩形内部への文字出力
□投稿者/ ぶなっぷ (235回)-(2020/07/29(Wed) 15:29:10)
いまいち、やりたいことが理解できていませんが、
以下のようなやつのことでしょうか?
  http://www.wisdomsoft.jp/430.html

e.Graphics みたいな感じで、
WPF の UIElement (Window/TextBlock/...らのベースクラス) に描画できます。

[ 親 95412 / □ Tree ] 返信 編集キー/

▲[ 95413 ] / ▼[ 95416 ]
■95415 / 2階層)  Re[2]: C#+WPF, 矩形内部への文字出力
□投稿者/ S.Kos (9回)-(2020/07/29(Wed) 16:15:08)
No95413 (ぶなっぷ さん) に返信
ご教示ありがとうございます。

> いまいち、やりたいことが理解できていませんが、
>
封筒の表書きに、○○様親展、などと枠付きのスタンプが有ったりしますよね?
同じようなコトを求めています。
・矩形とその内部に記す文字を定義して、
・矩形の位置のみを指定して印字
したい、と考えています。

> 以下のようなやつのことでしょうか?
> http://www.wisdomsoft.jp/430.html
>
このサイト、コード6の"drawingContext.DrawText(text, pt);"か゜ソレかも・・・です。
じっくり眺めてみましょう。


[ 親 95412 / □ Tree ] 返信 編集キー/

▲[ 95415 ] / ▼[ 95417 ]
■95416 / 3階層)  Re[3]: C#+WPF, 矩形内部への文字出力
□投稿者/ S.Kos (10回)-(2020/07/29(Wed) 20:16:26)
No95413 (ぶなっぷ さん) に返信
ご教示ありがとうございます。
> http://www.wisdomsoft.jp/430.html
>
このサイト、コード6の"drawingContext.DrawText(text, pt);"は、詰まるところ、テキストの描画ですよね?

テキストを、矩形の中に書き込む、ことにはならないように思います。

[ 親 95412 / □ Tree ] 返信 編集キー/

▲[ 95416 ] / ▼[ 95418 ]
■95417 / 4階層)  Re[4]: C#+WPF, 矩形内部への文字出力
□投稿者/ Hongliang (1069回)-(2020/07/29(Wed) 20:58:53)
今どうやっているかというところにもよるのですが。

以前の投稿のやり取りでやっていたようにCanvasに描画要素を乗せていっているのであれば、ChildにTextBlockを入れたBorderを使えばいいかもしれません。
枠線はBorderのBorderBrushおよびBorderThicknessで設定できます。
BorderのWidth/Heightを指定しなければ、Borderはテキストが必要とするだけの大きさになります。
TextBlockのMarginでBorderとTextBlockの境界を調整できます。
[ 親 95412 / □ Tree ] 返信 編集キー/

▲[ 95417 ] / ▼[ 95419 ]
■95418 / 5階層)  Re[5]: C#+WPF, 矩形内部への文字出力
□投稿者/ S.Kos (11回)-(2020/07/30(Thu) 08:46:19)
No95417 (Hongliang さん) に返信
ご教示、ありがとうございます。
古〜〜いプログマーにとって、オブジェクト指向ってのは、どーにも・・・です。笑ってやってください。

いろいろと探りまた試してみたのですが、
>ChildにTextBlockを入れたBorder
>
が掴めていません。
いま少しの情報なりヒントなり、重ねてご教示いただければ幸いです。

[ 親 95412 / □ Tree ] 返信 編集キー/

▲[ 95418 ] / ▼[ 95421 ] ▼[ 95420 ]
■95419 / 6階層)  Re[6]: C#+WPF, 矩形内部への文字出力
□投稿者/ Hongliang (1070回)-(2020/07/30(Thu) 08:57:52)
var border = new Border();
var textBlock = new TextBlock();
border.Child = textBlock;
というだけです。
[ 親 95412 / □ Tree ] 返信 編集キー/

▲[ 95419 ] / ▼[ 95422 ]
■95421 / 7階層)  Re[7]: C#+WPF, 矩形内部への文字出力
□投稿者/ S.Kos (12回)-(2020/07/30(Thu) 09:33:28)
No95419 (Hongliang さん) に返信
重ねてのご教示、誠にありがとうございます。

確かに分ってみれば、というだけのこと、ですね!

やってみました・・・で、borderに色を付けよう・・・また躓きました。

BorderBrushに、ネットから様々な(書式?)の色を示すなんちゃらかんちゃらを付与しても、VSに怒られてばかりです。
枠線の色と太さを決定するには、どーすれば良いですか?

[ 親 95412 / □ Tree ] 返信 編集キー/

▲[ 95421 ] / 返信無し
■95422 / 8階層)  Re[8]: C#+WPF, 矩形内部への文字出力
□投稿者/ Hongliang (1071回)-(2020/07/30(Thu) 10:24:01)
> BorderBrushに、ネットから様々な(書式?)の色を示すなんちゃらかんちゃらを付与しても、VSに怒られてばかりです。
> 枠線の色と太さを決定するには、どーすれば良いですか?

https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.controls.border.borderbrush
ここのサンプルコードを見ればよいかと思いますが。

BorderBrushはSystem.Windows.Media.Brush型です。
https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.media.brush
Brush型は抽象クラスで、塗りつぶし方によってそれぞれ派生クラスが用意されており、例えば単色で塗りつぶす用にSolidColorBrush型が存在しています。
さらに、単色のBrushについてはBrushesクラスに様々な色のBrushが定義されています。
https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.media.brushes
一般的にはこのクラスの静的メンバを使用すればいいでしょう。上述のサンプルコードでもそうしています。
[ 親 95412 / □ Tree ] 返信 編集キー/

▲[ 95419 ] / ▼[ 95423 ]
■95420 / 7階層)  Re[7]: C#+WPF, 矩形内部への文字出力
□投稿者/ ぶなっぷ (236回)-(2020/07/30(Thu) 09:29:41)
Hongliangさんもおっしゃっている通り、
今どうやっているかというところにもよります。

「テキストを、矩形の中に書き込む」を言葉通りに受け取るなら、

以下の内容でも要求を満たすように思います。
 ※ パラメータが多いので...にて省略
namespace Test
{
  public class TestGrid : Grid
  {
      protected override void OnRender(DrawingContext drawingContext)
      {
          base.OnRender(drawingContext);
          drawingContext.DrawRectangle(
              Brushes.Blue, new Pen(Brushes.Black, 1.0), new Rect(...));
          drawingContext.DrawText(new FormattedText(...), new Point(...));
      }
  }
}
XAMLには以下のようにして貼り付けます(必要な部分のみ抜粋)。
  xmlns:test="clr-namespace:Test"
  <test:TestGrid  Width="150" Height="60" />

また、XAMLだけでやるなら、以下のようにしても要求を満たすように思います。
    <Grid Width="150" Height="60">
        <Rectangle Fill="Blue" Stroke="Black" />
        <Label Foreground="White"
               HorizontalContentAlignment="Center"
               VerticalContentAlignment="Center"
               Content="RectangleStr" />
    </Grid>

[ 親 95412 / □ Tree ] 返信 編集キー/

▲[ 95420 ] / ▼[ 95424 ]
■95423 / 8階層)  Re[8]: C#+WPF, 矩形内部への文字出力
□投稿者/ S.Kos (13回)-(2020/07/30(Thu) 10:40:42)
ぶなっぷさん、重ねてのご教示ありがとうございます。
>今どうやっているか
>
まさにこれが問題です。
GDI+ な Graphics.DrawString では"IPAmj明朝"の異字体に対応できないため、この箇所だけをWPFで書き換えよう、としています。
よって(?)XAMLを考えていません。(考える余地が無い・・・)

Hongliangさん、重ね々々のご教示、ありがとうございます。
>https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.controls.border.borderbrush
>
を見て、border.BorderBrush = Brushes.SlateBlue;、とやったら怒られたのでした。

>BorderBrushはSystem.Windows.Media.Brush型です。
>
がヒントになりました。

border.BorderBrush = System.Windows.Media.Brushes.Black;
border.BorderThickness = new Thickness(1, 1, 1, 1);
で、当面の壁は乗り越えられました。

[ 親 95412 / □ Tree ] 返信 編集キー/

▲[ 95423 ] / 返信無し
■95424 / 9階層)  Re[9]: C#+WPF, 矩形内部への文字出力
□投稿者/ S.Kos (14回)-(2020/07/30(Thu) 13:24:45)
みなさま、ご教示のほど、ほんとうにありがとうございました。

当面の目的は全て達成できましたので、ここで閉じます。

今後ともよろしくお願いいたします。
解決済み
[ 親 95412 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -