public void TestGetItem() { NativeTab tab = new NativeTab(testDlg.IdentifyFromDialogId(1022)); TCITEM item = new TCITEM(); item.mask = (TCIF.TEXT | TCIF.IMAGE | TCIF.PARAM | TCIF.STATE); item.dwStateMask = (TCIS.BUTTONPRESSED | TCIS.HIGHLIGHTED); tab.GetItem(0, item); Assert.AreEqual("a", item.pszText); Assert.AreEqual(0, item.iImage); Assert.AreEqual(new IntPtr(10), item.lParam); Assert.AreEqual(TCIS.BUTTONPRESSED, item.dwState); tab.GetItem(1, item); Assert.AreEqual("あ", item.pszText); Assert.AreEqual(1, item.iImage); Assert.AreEqual(new IntPtr(11), item.lParam); Assert.AreEqual((TCIS)0, item.dwState); }
/// <summary> /// アイテムを取得します。 /// </summary> /// <param name="handle">ウィンドウハンドル。</param> /// <param name="tabIndex">タブインデックス。</param> /// <param name="item">アイテム。</param> /// <returns>成否。</returns> private static bool GetItemInTarget(IntPtr handle, int tabIndex, TCITEM item) { bool isUni = NativeMethods.IsWindowUnicode(handle); int TCM_GETITEM = isUni ? TCM_GETITEMW : TCM_GETITEMA; item._core.cchTextMax = 256; while (true) { //メモリを確保。 if ((item.mask & TCIF.TEXT) != 0) { item._core.pszText = Marshal.AllocCoTaskMem((item._core.cchTextMax + 1) * 8); } try { //データ取得。 if (!NativeDataUtility.ToBool(NativeMethods.SendMessage(handle, TCM_GETITEM, new IntPtr(tabIndex), ref item._core))) { return false; } //文字列取得でなければ終了 if ((item.mask & TCIF.TEXT) == 0) { return true; } //文字列に変換 item._pszText = isUni ? Marshal.PtrToStringUni(item._core.pszText) : Marshal.PtrToStringAnsi(item._core.pszText); //文字バッファが足りなければリトライ。 if (item.pszText.Length < item._core.cchTextMax - 1) { return true; } item._core.cchTextMax *= 2; } finally { //メモリ解放。 if (item._core.pszText != IntPtr.Zero) { Marshal.FreeCoTaskMem(item._core.pszText); } } } }
/// <summary> /// Obtains tab item data. /// </summary> /// <param name="tabIndex">Tab index.</param> /// <returns>Item data.</returns> #else /// <summary> /// アイテムデータを取得します。 /// </summary> /// <param name="tabIndex">タブインデックス。</param> /// <returns>アイテムデータ。</returns> #endif public IntPtr GetItemData(int tabIndex) { TCITEM item = new TCITEM(); item.mask = TCIF.PARAM; return GetItem(tabIndex, item) ? item.lParam : IntPtr.Zero; }
/// <summary> /// Gets a certain tab item. /// </summary> /// <param name="tabIndex">Tab index.</param> /// <param name="item">Item storage buffer.</param> /// <returns>Success or failure.</returns> #else /// <summary> /// アイテムを取得します。 /// </summary> /// <param name="tabIndex">タブインデックス</param> /// <param name="item">アイテム格納バッファ</param> /// <returns>成否</returns> #endif public bool GetItem(int tabIndex, TCITEM item) { AppVar inTarget = App.Dim(item); bool ret = (bool)App[GetType(), "GetItemInTarget"](Handle, tabIndex, inTarget).Core; TCITEM getData = (TCITEM)inTarget.Core; item._core = getData._core; item.pszText = getData.pszText; return ret; }
/// <summary> /// Obtains the text for a certain tab item. /// </summary> /// <param name="tabIndex">Tab index.</param> /// <returns>Tab text.</returns> #else /// <summary> /// 文字列を取得します。 /// </summary> /// <param name="tabIndex">タブインデックス。</param> /// <returns>タブ文字列。</returns> #endif public string GetItemText(int tabIndex) { TCITEM item = new TCITEM(); item.mask = TCIF.TEXT; return GetItem(tabIndex, item) ? item.pszText : string.Empty; }