3 using System.Runtime.InteropServices;
\r
4 using System.Drawing;
\r
5 using System.Drawing.Imaging;
\r
6 using System.Windows.Forms;
\r
7 using NaGet.Packages;
\r
8 using NaGet.Packages.Install;
\r
10 namespace AppliStation.Util
\r
15 public sealed class GUIUtils
\r
22 /// アイコンファイル(実行ファイル・DLL)を開いてアイコンを作る
\r
24 /// <param name="form">ハンドラ</param>
\r
25 /// <param name="lpszExeFileNameAndIndex">対象ファイルとアイコンインデックスの文字列表現</param>
\r
26 /// <returns>生成されたアイコン。</returns>
\r
27 public static Icon ExtractIcon(Form form, string lpszExeFileNameAndIndex)
\r
29 int index = lpszExeFileNameAndIndex.LastIndexOf(',');
\r
31 uint nIconIndex = uint.Parse(lpszExeFileNameAndIndex.Substring(index+1));
\r
32 return NativeMethods.ExtractIcon(form, lpszExeFileNameAndIndex.Substring(0, index), nIconIndex);
\r
34 return Icon.ExtractAssociatedIcon(lpszExeFileNameAndIndex);
\r
39 /// シェルからフォルダーアイコンを生成して返す
\r
41 /// <returns>フォルダーアイコン</returns>
\r
42 public static Icon ShellIconForFolder
\r
45 // Vista以降ならば、SHGetStockIconInfo(SIID_FOLDER, SHGSI_ICON, &sInfo); をP/Invoke呼び出しするのが王道かと
\r
46 string windir = Environment.GetEnvironmentVariable("windir");
\r
47 return NativeMethods.ExtractIcon(null, Path.Combine(windir, @"system32\shell32.dll"), 3);
\r
54 /// パッケージに対応するアイコンを返す
\r
56 /// <param name="pkg">パッケージ</param>
\r
57 /// <returns>対応するアイコン。検出できなかった場合はnull。</returns>
\r
58 public static Icon GetIconForPackage(InstalledPackage pkg)
\r
61 string iconPath = pkg.UninstallInfo.IconPath;
\r
62 if (! string.IsNullOrEmpty(iconPath)) {
\r
64 ico = ExtractIcon(null, iconPath);
\r
65 } catch (FileNotFoundException) {
\r
68 } else if ((pkg.Type == InstallerType.ARCHIVE)
\r
69 ||(pkg.Type == InstallerType.ITSELF)) {
\r
70 string progGrp = Path.Combine(NaGet.Env.ArchiveProgramGroup, pkg.Name);
\r
71 if (Directory.Exists(progGrp)) {
\r
72 string[] lnkFiles = Directory.GetFiles(progGrp, "*.lnk");
\r
74 if (lnkFiles.Length >= 1) {
\r
76 using (NaGet.InteropServices.ShellLink link = new NaGet.InteropServices.ShellLink(lnkFiles[0])) {
\r
77 if (File.Exists(link.GetPath(0))) {
\r
78 ico = Icon.ExtractAssociatedIcon(link.GetPath(0));
\r
81 } catch (System.Runtime.InteropServices.COMException) {
\r
82 // ShellLinkのオープンあるいは、リンク先解決に失敗した場合
\r
91 /// グレーアウトアイコンを作るための ImageAttributes を作って返す。
\r
93 /// <param name="alpha">透明度。(1.0が不透明、0.0が完全透明)</param>
\r
94 /// <returns>生成されたImageAttributes</returns>
\r
95 public static ImageAttributes GetImageAttributeToGrayOut(float alpha)
\r
97 // RGB比率として、YIQカラーモデルの値を採用する
\r
98 const float r = 0.298912f;
\r
99 const float g = 0.586611f;
\r
100 const float b = 0.114478f;
\r
102 ColorMatrix cm = new ColorMatrix(new float[][]{
\r
103 new float[]{r, r, r, 0, 0},
\r
104 new float[]{g, g, g, 0, 0},
\r
105 new float[]{b, b, b, 0, 0},
\r
106 new float[]{0, 0, 0, alpha, 0},
\r
107 new float[]{0, 0, 0, 0, 1},
\r
109 ImageAttributes ia = new ImageAttributes();
\r
110 ia.SetColorMatrix(cm);
\r
118 /// <param name="g">描画対象のグラフィックス</param>
\r
119 /// <param name="img">画像</param>
\r
120 /// <param name="b">指定領域</param>
\r
121 /// <param name="ia">ImageAttributes。nullでもかまわない</param>
\r
122 public static void Graphics_DrawCenterImage(Graphics g, Image img, Rectangle b, ImageAttributes ia)
\r
124 int x = b.Left + (b.Width - img.Width ) / 2;
\r
125 int y = b.Top + (b.Height - img.Height) / 2;
\r
128 new Rectangle(x, y, img.Width, img.Height),
\r
129 0, 0, img.Width, img.Height,
\r
130 GraphicsUnit.Pixel, ia);
\r
135 #region CheckedListBox関連
\r
138 /// チェックリストボックスのアイテムをスワップする
\r
140 /// <param name="checkedListBox">操作対象のCheckedListBox</param>
\r
141 /// <param name="indexA">アイテムインデックス</param>
\r
142 /// <param name="indexB">アイテムインデックス</param>
\r
143 /// <remarks>インデックス値のチェックは本メソッドでは行っていない</remarks>
\r
144 public static void CheckedListBox_SwapItems(CheckedListBox checkedListBox, int indexA, int indexB) {
\r
145 int itemCount = checkedListBox.Items.Count;
\r
146 object tempItem = checkedListBox.Items[indexA];
\r
147 CheckState tempState = checkedListBox.GetItemCheckState(indexA);
\r
149 checkedListBox.Items[indexA] = checkedListBox.Items[indexB];
\r
150 checkedListBox.SetItemCheckState(indexA, checkedListBox.GetItemCheckState(indexB));
\r
152 checkedListBox.Items[indexB] = tempItem;
\r
153 checkedListBox.SetItemCheckState(indexB, tempState);
\r