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

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

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

Re[3]: 長いPATHの中略表示


(過去ログ 136 を表示中)

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

■80357 / inTopicNo.1)  長いPATHの中略表示
  
□投稿者/ 774RR (420回)-(2016/07/11(Mon) 11:41:45)

分類:[.NET 全般] 

Windows Form/WPF App で長い PATH を表示する際に中略表記する便利系関数とかプロパティとかありますか?

長い PATH 名
C:\Documents and Settings\774RR\Local Settings\Application Data\長いので中略\user.config
を、画面に表示する際 (Label1.Text に設定する際) に
C:\Documents...\1.0.1.2\user.config
のように「先頭と末尾は表示」し「中間を略する」ようにしたいです。

中略表示プロパティ等があれば元文字列の加工はしなくて良くて楽そうですが
中略加工する関数で加工する (表示幅指定ができると良し) のでもかまいません。

なんかあったような記憶があるのですが、ちょろっと検索しただけだと見つかりませんでした。

引用返信 編集キー/
■80359 / inTopicNo.2)  Re[1]: 長いPATHの中略表示
□投稿者/ とっちゃん (383回)-(2016/07/11(Mon) 11:57:35)
No80357 (774RR さん) に返信
> Windows Form/WPF App で長い PATH を表示する際に中略表記する便利系関数とかプロパティとかありますか?
> 例
> 長い PATH 名
> C:\Documents and Settings\774RR\Local Settings\Application Data\長いので中略\user.config
> を、画面に表示する際 (Label1.Text に設定する際) に
> C:\Documents...\1.0.1.2\user.config
> のように「先頭と末尾は表示」し「中間を略する」ようにしたいです。
>
> 中略表示プロパティ等があれば元文字列の加工はしなくて良くて楽そうですが
> 中略加工する関数で加工する (表示幅指定ができると良し) のでもかまいません。
>
> なんかあったような記憶があるのですが、ちょろっと検索しただけだと見つかりませんでした。
>
Forms のラベル表示などでは中間排除のパターンがないので、
PathCompactPath などの Native API(shlwapi.h)を使って処理の形かと。

わんくま東京 #85 のデモでこれをやってます。。。
ソースは。。。公開してませんw
リファレンスソースから導き出したマジックナンバーがあるコードだったから非公開にしてるんですよねw

似たやつだと、AutoEllipsis プロパティがありますが、こちらは後ろを ... で省略するだけで
中間を省略という形にはならないです。

WPF では試したことがないのでちょっとわからんです。

引用返信 編集キー/
■80360 / inTopicNo.3)  Re[1]: 長いPATHの中略表示
□投稿者/ kiku (105回)-(2016/07/11(Mon) 12:25:17)
自身では検証していませんが、
TextRenderer.DrawTextメソッドで、
TextFormatFlagsに、PathEllipsisを設定すれば
できそうです。

参考
https://msdn.microsoft.com/ja-jp/library/ms160658(v=vs.110).aspx
引用返信 編集キー/
■80361 / inTopicNo.4)  Re[2]: 長いPATHの中略表示
□投稿者/ 774RR (421回)-(2016/07/11(Mon) 12:39:41)
PathCompactPath は理想的ですね。でも HDC が必要なので WPF から使うには微妙かも。
PathCompactPathEx だとドット数でなく文字数で制約になっちゃいますが
manage から使うにはこっちのほうが圧倒的に楽。
今回の案件には PathCompactPathEx を使うことにしましょう。

なんかあったの思い出した。 native Win32 Control の SS_PATHELLIPSIS style だ。
https://msdn.microsoft.com/en-us/library/windows/desktop/bb760773.aspx
Form/WPF には無いのかな・・・っていうか無さそう・・・

引用返信 編集キー/
■80362 / inTopicNo.5)  Re[2]: 長いPATHの中略表示
□投稿者/ 774RR (422回)-(2016/07/11(Mon) 13:44:56)
2016/07/11(Mon) 13:46:15 編集(投稿者)
今使える開発環境が超古い VS2005 だけなので Form でしか試していませんが
TextRenderer.DrawText に PathEllipsis でもできました。
サンプルが必要な人のために2つを掲載しておきましょう。

----Form1.cs----
private void Form1_Paint(object sender, PaintEventArgs e)
{
    TextRenderer.DrawText(e.Graphics, @"<長いPath>", this.Font,
        new Rectangle(10, 10, 200, 20), Color.Black, Color.SteelBlue, TextFormatFlags.PathEllipsis);
}

private void Form1_Load(object sender, EventArgs e)
{
    label1.Text = PathCompactEx.Converter.EllipsisCompactor(@"<長いPath>", 32);
}

----PathCompactEx.cs----
using System.Runtime.InteropServices; // DllImport

namespace PathCompactEx 
{
    public static class Converter
    {
        [DllImport("shlwapi.dll", CallingConvention = CallingConvention.StdCall, CharSet = Charset.Unicode)]
        extern static bool PathCompactPathExW([Out] System.Text.StringBuilder ResultPath,
        System.Text SourcePath, int HowManyLetters, int Delimiter);
        public static System.String EllipsisCompactor(System.String Path, Int16 HowManyLetters)
        {
            System.Text.StringBuilder b = new System.Text.StringBuilder(HowManyLetters + 1);
            PathCompactPathExW(b, Path, HowManyLetters + 1, '\\');
            return b.ToString();
        }
    }
}

オイラ的にはかなり解決済みに近いのですが WPF でどうなるか検証し切れていないのが心残りっす。
とりあえずチェック無しにしておきます。

引用返信 編集キー/
■80365 / inTopicNo.6)  Re[3]: 長いPATHの中略表示
□投稿者/ Azulean (662回)-(2016/07/11(Mon) 19:21:28)
2016/07/11(Mon) 20:22:00 編集(投稿者)

No80362 (774RR さん) に返信
> 今使える開発環境が超古い VS2005 だけなので Form でしか試していませんが
> TextRenderer.DrawText に PathEllipsis でもできました。
> サンプルが必要な人のために2つを掲載しておきましょう。

TextRenderer は GDI 側なので、GDI+ 側にもありますよっと紹介しておきます。

https://msdn.microsoft.com/ja-jp/library/d3thd43b
https://msdn.microsoft.com/ja-jp/library/system.drawing.stringformat
https://msdn.microsoft.com/ja-jp/library/system.drawing.stringtrimming

参考:http://dobon.net/vb/dotnet/graphics/stringtrimming.html
引用返信 編集キー/
■80366 / inTopicNo.7)  Re[4]: 長いPATHの中略表示
□投稿者/ kiku (106回)-(2016/07/11(Mon) 20:10:47)
知識がなく、下記教えてください。

GDI側なのか、GDI+なのかはどこで判断するものなのでしょうか?
名前空間でしょうか?
引用返信 編集キー/
■80367 / inTopicNo.8)  Re[5]: 長いPATHの中略表示
□投稿者/ Azulean (663回)-(2016/07/11(Mon) 20:25:39)
No80366 (kiku さん) に返信
> GDI側なのか、GDI+なのかはどこで判断するものなのでしょうか?

System.Drawing の描画処理は基本的に GDI+ のラップクラスが多いと思います。
GDI 側かどうか、MSDN のクラスの説明から知ることは難しいかもしれません。
文字列の描画であれば、例として具体的に書かれていますけれども。

https://msdn.microsoft.com/ja-jp/library/ms171753

調べる必要があれば、そのクラス名と GDI や GDI+ と絡めて、英語圏含めて探せば見つかるかもしれません。
引用返信 編集キー/
■80371 / inTopicNo.9)  Re[6]: 長いPATHの中略表示
□投稿者/ kiku (107回)-(2016/07/12(Tue) 10:50:46)
No80367 (Azulean さん) に返信

回答ありがとうございます。
大変勉強になりました。
引用返信 編集キー/
■80372 / inTopicNo.10)  Re[3]: 長いPATHの中略表示
□投稿者/ とっちゃん (384回)-(2016/07/12(Tue) 11:09:52)
No80362 (774RR さん) に返信
> オイラ的にはかなり解決済みに近いのですが WPF でどうなるか検証し切れていないのが心残りっす。
> とりあえずチェック無しにしておきます。
>
"WPF Path ellipsis" という感じでちょっと検索してみました。

えーっと。。。結論からいうと、WPFではTextBlock拡張しろ!みたいですw

向こうのMSDNフォーラムではコンバーターを作ったんだけどーなんてのもありましたが
リサイズとかでうまく再成形されないから、結局コントロール自体を拡張してました。

https://social.msdn.microsoft.com/Forums/vstudio/en-US/8a00e43d-7091-49e7-b57c-86fc0951c4d0/how-to-create-a-file-path-trimming-textblock-with-ellipsis

記事そのものは 2012 年とちょっと古いので、もしかしたら最近の環境だとAPI的なものが用意されているかもしれませんがw

引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -