+// Vistaの効果を有効にするフラグ(不要の場合はコメントアウト)\r
+#define USE_VISTA_EFFECTS\r
+\r
using System;\r
using System.Runtime.InteropServices;\r
using System.Windows.Forms;\r
\r
namespace AppliStation.Util\r
{\r
+ /// <summary>\r
+ /// Win32ネイティブメソッドを叩いてGUI操作するための関数群のクラス\r
+ /// </summary>\r
public sealed class NativeMethods\r
{\r
+ /// <summary>\r
+ /// 呼び出し禁止\r
+ /// </summary>\r
private NativeMethods()\r
{\r
}\r
- \r
- \r
+\r
/// <summary>\r
- /// WindowsVista\8cü\82¯\81A\83v\83\8d\83O\83\8c\83X\83o\81[\83X\83e\81[\83^\83X(\90F)\82ð\90Ý\92è\82·\82é\r
+ /// WindowsVista向け、プログレスバーステータス(色)を設定する\r
/// </summary>\r
- /// <param name="progBar">\91Î\8fÛ\82Ì\83v\83\8d\83O\83\8c\83X\83o\81[</param>\r
- /// <param name="state">\8fó\91Ô\81B(1:Normal,2:Error,3:Paused)</param>\r
+ /// <param name="progBar">対象のプログレスバー</param>\r
+ /// <param name="state">状態。(1:Normal,2:Error,3:Paused)</param>\r
public static void ProgressBar_SetState(ProgressBar progBar, uint state)\r
{\r
+#if USE_VISTA_EFFECTS\r
try {\r
// status := (PBST_NORMAL | PBST_ERROR | PBST_PAUSED)\r
// SendMessage(progressBar.Handle, PBM_SETSTATE, state, 0);\r
SendMessage(progBar.Handle, 0x410, state, 0);\r
} catch (Exception) {\r
}\r
+#endif\r
}\r
\r
- #region \83^\83X\83N\83o\81[\82¨\82æ\82Ñ\83^\83C\83g\83\8b\83o\81[\82Ì\83t\83\89\83b\83V\83\85\r
+ #region タスクバーおよびタイトルバーのフラッシュ\r
\r
/// <summary>\r
- /// \83^\83X\83N\83o\81[\82¨\82æ\82Ñ\83^\83C\83g\83\8b\83o\81[\83{\83^\83\93\82Ì\83t\83\89\83b\83V\83\85\82Ì\90Ý\92è\83t\83\89\83O\r
+ /// タスクバーおよびタイトルバーボタンのフラッシュの設定フラグ\r
/// </summary>\r
public enum FlashFlag : uint {\r
/// <summary>\r
- /// \93_\96Å\82Ì\92â\8e~\r
+ /// 点滅の停止\r
/// </summary>\r
Stop = 0,\r
/// <summary>\r
- /// \83^\83C\83g\83\8b\83o\81[\82ð\93_\96Å\r
+ /// タイトルバーを点滅\r
/// </summary>\r
Caption = 1,\r
/// <summary>\r
- /// \83^\83X\83N\83o\81[\83{\83^\83\93\82ð\93_\96Å\r
+ /// タスクバーボタンを点滅\r
/// </summary>\r
Tray = 2,\r
/// <summary>\r
- /// \83^\83C\83g\83\8b\83o\81[\82Æ\83^\83X\83N\83o\81[\83{\83^\83\93\82ð\93_\96Å\r
+ /// タイトルバーとタスクバーボタンを点滅\r
/// </summary>\r
All = 3,\r
/// <summary>\r
- /// Stop\82ª\90Ý\92è\82³\82ê\82é\82Ü\82Å\93_\96Å\82·\82é\r
+ /// Stopが設定されるまで点滅する\r
/// </summary>\r
Timer = 4,\r
/// <summary>\r
- /// \83t\83H\83A\83O\83\89\83E\83\93\83h\82Ì\8fó\91Ô\82É\82È\82é\82Ü\82Å\93_\96Å\r
+ /// フォアグラウンドの状態になるまで点滅\r
/// </summary>\r
TimerNoFG = 12,\r
}\r
}\r
\r
/// <summary>\r
- /// \83^\83X\83N\83o\81[\82¨\82æ\82Ñ\83^\83C\83g\83\8b\83o\81[\83{\83^\83\93\82ð\93_\96Å\82³\82¹\82é\r
+ /// タスクバーおよびタイトルバーボタンを点滅させる\r
/// </summary>\r
- /// <param name="form">\91Î\8fÛ\83t\83H\81[\83\80</param>\r
- /// <param name="flag">\93_\96Å\83p\83\89\83\81\81[\83^\83t\83\89\83O</param>\r
- /// <param name="count">\93_\96Å\89ñ\90\94</param>\r
- /// <param name="timeout">\93_\96Å\82Ì\8aÔ\8au(\83~\83\8a\95b)</param>\r
+ /// <param name="form">対象フォーム</param>\r
+ /// <param name="flag">点滅パラメータフラグ</param>\r
+ /// <param name="count">点滅回数</param>\r
+ /// <param name="timeout">点滅の間隔(ミリ秒)</param>\r
/// <returns></returns>\r
public static bool Form_FlashWindow(Form form, FlashFlag flag, uint count, uint timeout)\r
{\r
\r
#endregion\r
\r
- #region ColumnHeader\82Ì\83\\81[\83g\82Ì\8eO\8ap\88ó\97p\r
+ #region ListView関連\r
+ \r
+ /// <summary>\r
+ /// リストビューにダブルバッファでの描画をするか否かを設定する\r
+ /// </summary>\r
+ /// <remarks>マウスでの選択に半透明ツールを採用するか否かもこの設定に依存</remarks>\r
+ /// <param name="listView">対象のリストビュー</param>\r
+ /// <param name="bEnable">ダブルバッファでの描画をするとき<code>true</code></param>\r
+ public static void ListView_SetDoubleBuffer(ListView listView, bool bEnable)\r
+ {\r
+ try {\r
+ // SendMessage(listView.Handle, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_DOUBLEBUFFER, bEnable? LVS_EX_DOUBLEBUFFER:0);\r
+ SendMessage(listView.Handle, 0x1036, 0x00010000, ((bEnable)? 0x00010000u:0x0u));\r
+ } catch (Exception) {\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// 選択されたアイテムの部分の背景にグラデーションがかかった感じになる、\r
+ /// Vista以降でのエクスプローラの見た目をListViewに反映させる。\r
+ /// </summary>\r
+ /// <remarks>Vista未満のバージョンでは何もしない。</remarks>\r
+ /// <param name="listView">対象のListView</param>\r
+ public static void ListView_EnableVistaExplorerTheme(ListView listView)\r
+ {\r
+#if USE_VISTA_EFFECTS\r
+ // Vista未満はなにもしない\r
+ OperatingSystem os = Environment.OSVersion;\r
+ if (os.Platform != PlatformID.Win32NT || os.Version.Major < 6) return;\r
+ \r
+ try {\r
+ SetWindowTheme(listView.Handle, "explorer", null);\r
+ } catch (Exception) {\r
+ }\r
+#endif\r
+ }\r
+ \r
+ /// <summary>\r
+ /// ヘッダに"すべて選択"に似たチェックボックスを作るか否かを指定する\r
+ /// </summary>\r
+ /// <remarks>このオプションを設定するとVistaエクスプローラでの「チェックボックスを使用して項目を選択する」と同様の動作になる</remarks>\r
+ /// <param name="listView">対象のListBox</param>\r
+ /// <param name="bAutoCheckSelect">チェックボックスを使用して項目を選択するとき<code>true</code></param>\r
+ public static void ListView_SetAutoCheckSelect(ListView listView, bool bAutoCheckSelect)\r
+ {\r
+#if USE_VISTA_EFFECTS\r
+ try {\r
+ // SendMessage(listView.Handle, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_AUTOCHECKSELECT, bAutoCheckSelect?LVS_EX_AUTOCHECKSELECT:0);\r
+ SendMessage(listView.Handle, 0x1036, 0x08000000, (bAutoCheckSelect)?0x08000000u:0x0u);\r
+ } catch (Exception) {\r
+ }\r
+#endif\r
+ }\r
+ \r
+ #region ColumnHeaderのソートの三角印用\r
\r
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]\r
- internal struct HD_ITEM\r
+ private struct HD_ITEM\r
{\r
public uint mask;\r
public int cxy;\r
}\r
\r
/// <summary>\r
- /// WinXP\88È\8d~\81A\83\\81[\83g\82Ì\96î\88ó\82ð\95\\8e¦\r
+ /// WinXP以降、ソートの矢印を表示\r
/// </summary>\r
- /// <param name="listView">\91Î\8fÛ\82ÌListView</param>\r
- /// <param name="column">\95\\8e¦\82·\82é\96î\88ó\82Ì\83w\83b\83_</param>\r
- /// <param name="order">\83\\81[\83g\82Ì\8f¸\8f\87\81E\8d~\8f\87</param>\r
+ /// <param name="listView">対象のListView</param>\r
+ /// <param name="column">表示する矢印のヘッダ</param>\r
+ /// <param name="order">ソートの昇順・降順</param>\r
public static void ColumnHeader_SetSortState(ListView listView, int column, SortOrder order)\r
{\r
try {\r
\r
if (i != column || order == SortOrder.None) {\r
hdi.fmt = hdi.fmt & ~(HDF_SORTUP | HDF_SORTDOWN);\r
- } else if (order == SortOrder.Ascending) { // \8f¸\8f\87\r
+ } else if (order == SortOrder.Ascending) { // 昇順\r
hdi.fmt = hdi.fmt & ~HDF_SORTDOWN | HDF_SORTUP;\r
- } else if (order == SortOrder.Descending) { // \8d~\8f\87\r
+ } else if (order == SortOrder.Descending) { // 降順\r
hdi.fmt = hdi.fmt & ~HDF_SORTUP | HDF_SORTDOWN;\r
}\r
\r
\r
#endregion\r
\r
+ #endregion\r
+ \r
+ #region EnableWindow(コメントアウト)\r
+// /// <summary>\r
+// /// 指定されたコントロール(ウィンドウ)への、\r
+// /// キーボード入力およびマウス入力を有効化または無効化\r
+// /// </summary>\r
+// /// <param name="control">対象のコントロールのハンドラ</param>\r
+// /// <param name="bEnable">有効にするか無効にするかを指定</param>\r
+// /// <returns>直前にウィンドウが無効状態だった場合はtrueを返す</returns>\r
+// public static bool Control_EnableWindow(Control ctrl, bool bEnable)\r
+// {\r
+// try {\r
+// return EnableWindow(ctrl.Handle, bEnable);\r
+// } catch {\r
+// ctrl.Enabled = bEnable;\r
+// return true;\r
+// }\r
+// }\r
+// \r
+// /// <summary>\r
+// /// 指定されたコントロール(ウィンドウ)への、\r
+// /// キーボード入力およびマウス入力を有効化または無効化\r
+// /// </summary>\r
+// /// <param name="control">対象のコントロールのハンドラ</param>\r
+// /// <param name="bEnable">有効にするか無効にするかを指定</param>\r
+// /// <returns>直前にウィンドウが無効状態だった場合はtrueを返す</returns>\r
+// [DllImport("user32.dll")]\r
+// public static extern bool EnableWindow(IntPtr hWnd, bool bEnable);\r
+ #endregion\r
+ \r
+ #region RichTextBox関連\r
+ \r
+ [StructLayout(LayoutKind.Sequential)]\r
+ private struct CHARFORMAT2\r
+ {\r
+ public int cbSize;\r
+ public uint dwMask;\r
+ public uint dwEffects;\r
+ public int yHeight;\r
+ public int yOffset;\r
+ public int crTextColor;\r
+ public byte bCharSet;\r
+ public byte bPitchAndFamily;\r
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst=32)]\r
+ public char[] szFaceName;\r
+ public short wWeight;\r
+ public short sSpacing;\r
+ public int crBackColor;\r
+ public int LCID;\r
+ public uint dwReserved;\r
+ public short sStyle;\r
+ public short wKerning;\r
+ public byte bUnderlineType;\r
+ public byte bAnimation;\r
+ public byte bRevAuthor;\r
+ public byte bReserved1;\r
+ }\r
+ \r
+ /// <summary>\r
+ /// リッチテキストの選択部分に文字フォーマット効果を与える\r
+ /// </summary>\r
+ /// <param name="richTextBox">対象のリッチテキストボックス</param>\r
+ /// <param name="dwMask">有効な文字フォーマット効果</param>\r
+ /// <param name="dwEffect">文字フォーマット効果のフラグ</param>\r
+ public static void RichTextBox_SetSelectionFormat(RichTextBox richTextBox, uint dwMask, uint dwEffect)\r
+ {\r
+ CHARFORMAT2 cfmt = new CHARFORMAT2();\r
+ cfmt.cbSize = Marshal.SizeOf(typeof(CHARFORMAT2));\r
+ cfmt.dwMask = dwMask;\r
+ cfmt.dwEffects = dwEffect;\r
+ \r
+ //SendMessage(richTextBox.Handle, EM_SETCHARFORMAT, SCF_SELECTION, ref cfmt);\r
+ SendMessage(richTextBox.Handle, 0x0444, 0x0001, ref cfmt);\r
+ }\r
+ /// <summary>\r
+ /// リッチテキストにテキストリンクを追加する\r
+ /// </summary>\r
+ /// <param name="richTextBox">対象のリッチテキストボックス</param>\r
+ /// <param name="text">追加するテキスト</param>\r
+ public static void RichTextBox_AddTextLink(RichTextBox richTextBox, string text)\r
+ {\r
+ int pos = richTextBox.TextLength;\r
+ richTextBox.Select(pos,0);\r
+ richTextBox.SelectedText = text;\r
+ richTextBox.Select(pos, text.Length);\r
+ \r
+ // RichTextBox_SetSelectionFormat(richTextBox, CFM_LINK, CFE_LINK);\r
+ RichTextBox_SetSelectionFormat(richTextBox, 0x00000020, 0x0020);\r
+ \r
+ richTextBox.Select(richTextBox.TextLength, 0);\r
+ }\r
+ \r
+ #endregion\r
+ \r
[DllImport("user32.dll", CharSet=CharSet.Auto)]\r
internal static extern IntPtr SendMessage( IntPtr hWnd, UInt32 Msg, UInt32 wParam, UInt32 lParam);\r
\r
[DllImport("user32.dll", CharSet=CharSet.Auto)]\r
- internal static extern IntPtr SendMessage( IntPtr hWnd, UInt32 Msg, int wParam, ref HD_ITEM lParam);\r
+ private static extern IntPtr SendMessage( IntPtr hWnd, UInt32 Msg, int wParam, ref HD_ITEM lParam);\r
+ \r
+ [DllImport("user32.dll", CharSet=CharSet.Auto)]\r
+ private static extern IntPtr SendMessage(IntPtr hWnd, Int32 Msg, int wParam, ref CHARFORMAT2 lParam);\r
+\r
+ [DllImport("uxtheme.dll", ExactSpelling=true, CharSet=CharSet.Unicode)]\r
+ internal static extern int SetWindowTheme(IntPtr hWnd, String pszSubAppName, String pszSubIdList);\r
+ \r
}\r
}\r