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

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

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

SelectionFontの英字・ひらがな混合の場合について

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■94964 / inTopicNo.1)  SelectionFontの英字・ひらがな混合の場合について
  
□投稿者/ Visual C#初心者 (6回)-(2020/06/06(Sat) 20:44:42)

分類:[C#] 

既出でしたらすみません.

英字とひらがなを以下の例のように混合したまま選択し,

例.あいueo

SelectionFont.Bold,あるいはUnderlineでフォントスタイル
で判断し,太字(下線)でなければフォントを太字(下線)
にしたいです.
しかしSelection.Boldの時にnullを返してしまうので,
何かいい方法はありますでしょうか?

なお,Select(x,1)で1文字ずつ判定させる方法は
処理が遅いので使用したくないです.

ご教示お願い致します.

引用返信 編集キー/
■94967 / inTopicNo.2)  Re[1]: SelectionFontの英字・ひらがな混合の場合について
□投稿者/ 魔界の仮面弁士 (2741回)-(2020/06/07(Sun) 13:12:17)
No94964 (Visual C#初心者 さん) に返信
> SelectionFont.Bold,あるいはUnderlineでフォントスタイルで判断し,
(中略)
> しかしSelection.Boldの時にnullを返してしまうので,
> 何かいい方法はありますでしょうか?

SelectionFont.Bold および
Selection.Bold がある何か…に対するフォント操作という点は理解しました。

しかし前提条件がゴッソリ抜け落ちているので、状況を把握しにくいです。
C# に関する質問…というのは分かりますが、一体何の話でしょうか。(^_^;)



最初は Microsoft Word のオートメーション操作かと思いましたが、
Word には SelectionFont というプロパティがありません。(Selection ならある)

System.Windows.Forms.RichTextBox ではその逆で、
Selection プロパティが存在しません。(SelectionFont ならある)

System.Windows.Controls.RichTextBox だとしたら、Selection フォントが無く、
しかも Selection プロパティが返す TextSelection 型に Bold プロパティがありません。


ActiveX 版の RichTextBox が相手の場合は、フォント混在であろうと、
 axRichTextBox1.SelBold = true;
 axRichTextBox1.SelUnderline = true;
で処理できますが…こちらは Selection も SelectionFont もありません。
引用返信 編集キー/
■94968 / inTopicNo.3)  Re[2]: SelectionFontの英字・ひらがな混合の場合について
□投稿者/ Visual C#初心者 (8回)-(2020/06/07(Sun) 13:43:15)
No94967 (魔界の仮面弁士 さん) に返信
> ■No94964 (Visual C#初心者 さん) に返信
>>SelectionFont.Bold,あるいはUnderlineでフォントスタイルで判断し,
> (中略)
>>しかしSelection.Boldの時にnullを返してしまうので,
>>何かいい方法はありますでしょうか?
>
> SelectionFont.Bold および
> Selection.Bold がある何か…に対するフォント操作という点は理解しました。
>
> しかし前提条件がゴッソリ抜け落ちているので、状況を把握しにくいです。
> C# に関する質問…というのは分かりますが、一体何の話でしょうか。(^_^;)
>
>
>
> 最初は Microsoft Word のオートメーション操作かと思いましたが、
> Word には SelectionFont というプロパティがありません。(Selection ならある)
>
> System.Windows.Forms.RichTextBox ではその逆で、
> Selection プロパティが存在しません。(SelectionFont ならある)
>
> System.Windows.Controls.RichTextBox だとしたら、Selection フォントが無く、
> しかも Selection プロパティが返す TextSelection 型に Bold プロパティがありません。
>
>
> ActiveX 版の RichTextBox が相手の場合は、フォント混在であろうと、
>  axRichTextBox1.SelBold = true;
>  axRichTextBox1.SelUnderline = true;
> で処理できますが…こちらは Selection も SelectionFont もありません。

ご返信ありがとうございます。
こちらの説明不足と記載ミスがあり、失礼致しました。

まず、開発環境としてはVisual C#のwinFormです。
Richtextbox上のフォント混在文字列を選択した状態で
太字(下線)の有無をobj.SelectionFont.Bold(Underline)で
判定したいという趣旨になります。

上記で
>>しかしSelection.Boldの時にnullを返してしまうので,
と記載してしまいましたが正しくはSelectionFont.Bold
になります。

伺いたい内容としては、SelectionFont.Boldで太字判定
させたくても、フォント混在の場合はnullを返すので、
SelectionFont以外で良い方法があれば教えて頂ければ
ということになります。

以上になります。

引用返信 編集キー/
■94977 / inTopicNo.4)  Re[3]: SelectionFontの英字・ひらがな混合の場合について
□投稿者/ 魔界の仮面弁士 (2743回)-(2020/06/08(Mon) 11:39:29)
No94968 (Visual C#初心者 さん) に返信
> 伺いたい内容としては、SelectionFont.Boldで太字判定
> させたくても、フォント混在の場合はnullを返すので、

「選択項目を太字(下線)にしたい」という点さえ実施できれば、
「選択項目の太字(下線)の有無を判断したい」という点は、
必ずしも必要ない気がします。(判定せずに強制適用すれば済む話なので)

フォントが混在している範囲に対しても、選択範囲の Bold や Underline や Italic の設定を、
一括して適用できれば良いのですよね。(ActiveX 版の RichTextBox はそういう実装になっている)


> Richtextbox上のフォント混在文字列を選択した状態で
> 太字(下線)の有無をobj.SelectionFont.Bold(Underline)で
> 判定したいという趣旨になります。

API を併用しても構わないのであれば、CHARFORMAT / CHARFORMAT2 構造体に
 .dwMask  = (CFM_Bold | CFM_UNDERLINE);
 .dwEffects= (CFE_Bold | CFE_UNDERLINE);
をセットしておいた上で、
EM_SETCHARFORMAT を SendMessage すれば、選択範囲内すべてを太字かつ下線にできます。同様に .dwMask 指定にて
EM_GETCHARFORMAT を SendMessage すれば、選択範囲内すべてに太字/下線がそれぞれ適用済みなのかを取得できます。

EM_GETCHARFORMAT は、選択範囲に対して「一部の文字だけが設定された状態」と「まったく設定されていない状態」とを
区別できませんが、今回の要件では問題無いでしょう。

C# 版のサンプル書いたので、後でアップしておきます。
引用返信 編集キー/
■94978 / inTopicNo.5)  Re[4]: SelectionFontの英字・ひらがな混合の場合について
□投稿者/ 魔界の仮面弁士 (2744回)-(2020/06/08(Mon) 13:02:36)
No94977 (魔界の仮面弁士) に追記
> API を併用しても構わないのであれば、CHARFORMAT / CHARFORMAT2 構造体に
>  .dwMask  = (CFM_Bold | CFM_UNDERLINE);
>  .dwEffects= (CFE_Bold | CFE_UNDERLINE);
> をセットしておいた上で、
> EM_SETCHARFORMAT を SendMessage すれば、選択範囲内すべてを太字かつ下線にできます。同様に .dwMask 指定にて
> EM_GETCHARFORMAT を SendMessage すれば、選択範囲内すべてに太字/下線がそれぞれ適用済みなのかを取得できます。


サンプルコードを置いときます。
http://www.vb-user.net/junk/replySamples/2020.06.08.10.53/RichTextBoxWankuma.cs

動作確認環境:
 Win10 v2004(x64)
 VS2017 VS2019 v16.6.1/VS2019 v16.6.0/v15.9.23
 .NET Framework 4.8/4.6.1


RichTextBox を継承して、SelectionBold / SelectionItalic / SelectionUnderline プロパティを追加してありますが、
継承だと都合が悪い場合は、拡張メソッドの形に書き換えてみてください。


サンプル中で使用されない定数などもあえて取り込んであるので、やや冗長的なコードになっています。
邪魔なようであれば、不要な宣言を削ぎ落してください。

なお、C# 7.0 以降の構文で記述しているので、VS2015以下の場合は、プロパティ構文の手直しが必要です。
また、.NET 4 未満の場合は、Enum.HasFlag の箇所をビットフラグ判定の構文に修正してください。

※ RichTextBox のバージョン判定は省略していますので、Win98 + .NET 1.1 などの組み合わせだと、多分動かないです。
引用返信 編集キー/
■94993 / inTopicNo.6)  Re[5]: SelectionFontの英字・ひらがな混合の場合について
□投稿者/ Visual C#初心者 (9回)-(2020/06/09(Tue) 21:32:43)
No94978 (魔界の仮面弁士 さん) に返信
> ■No94977 (魔界の仮面弁士) に追記
>>API を併用しても構わないのであれば、CHARFORMAT / CHARFORMAT2 構造体に
>> .dwMask  = (CFM_Bold | CFM_UNDERLINE);
>> .dwEffects= (CFE_Bold | CFE_UNDERLINE);
>>をセットしておいた上で、
>>EM_SETCHARFORMAT を SendMessage すれば、選択範囲内すべてを太字かつ下線にできます。同様に .dwMask 指定にて
>>EM_GETCHARFORMAT を SendMessage すれば、選択範囲内すべてに太字/下線がそれぞれ適用済みなのかを取得できます。
>
>
> サンプルコードを置いときます。
> http://www.vb-user.net/junk/replySamples/2020.06.08.10.53/RichTextBoxWankuma.cs
>
> 動作確認環境:
>  Win10 v2004(x64)
>  VS2017 VS2019 v16.6.1/VS2019 v16.6.0/v15.9.23
>  .NET Framework 4.8/4.6.1
>
>
> RichTextBox を継承して、SelectionBold / SelectionItalic / SelectionUnderline プロパティを追加してありますが、
> 継承だと都合が悪い場合は、拡張メソッドの形に書き換えてみてください。
>
>
> サンプル中で使用されない定数などもあえて取り込んであるので、やや冗長的なコードになっています。
> 邪魔なようであれば、不要な宣言を削ぎ落してください。
>
> なお、C# 7.0 以降の構文で記述しているので、VS2015以下の場合は、プロパティ構文の手直しが必要です。
> また、.NET 4 未満の場合は、Enum.HasFlag の箇所をビットフラグ判定の構文に修正してください。
>
> ※ RichTextBox のバージョン判定は省略していますので、Win98 + .NET 1.1 などの組み合わせだと、多分動かないです。

ありがとうございます!
自分で勉強して実装してみます.
お手数おかけしました.

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ