public void TestEmulateExpandEvent() { NativeTree tree = new NativeTree(testDlg.IdentifyFromDialogId(1041)); //経験から発見されたTreeの性質として、一度開いた後はExpnadメッセージで後の通知が発生しない。 //そのため、別途通知を投げている。その確認。 Assert.IsTrue(EventChecker.IsSameTestEvent(testDlg, delegate { tree.EmulateExpand(tree.Nodes[1], true); }, new CodeInfo[] { new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_SELCHANGING), new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_SELCHANGED), new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMCHANGING), new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMCHANGED)}, new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMEXPANDING), new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMEXPANDED) )); Assert.IsTrue(EventChecker.IsSameTestEvent(testDlg, delegate { tree.EmulateExpand(tree.Nodes[1], false); }, new CodeInfo[] { new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_SELCHANGING), new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_SELCHANGED), new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMCHANGING), new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMCHANGED)}, new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMEXPANDING), new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMEXPANDED) )); Assert.IsTrue(EventChecker.IsSameTestEvent(testDlg, delegate { tree.EmulateExpand(tree.Nodes[1], true); }, new CodeInfo[] { new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_SELCHANGING), new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_SELCHANGED), new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMCHANGING), new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMCHANGED)}, new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMEXPANDING), new CodeInfo(1041, NativeMethods.WM_NOTIFY, TVN_ITEMEXPANDED) )); //詳細な通知内容の確認。 NMTREEVIEW[] expectation = new NMTREEVIEW[2]; expectation[0].action = expectation[1].action = 1; expectation[0].itemNew.cChildren = expectation[1].itemNew.cChildren = 0; expectation[0].itemNew.cchTextMax = expectation[1].itemNew.cchTextMax = 0; expectation[0].itemNew.hItem = expectation[1].itemNew.hItem = tree.Nodes[1]; expectation[0].itemNew.iImage = expectation[1].itemNew.iImage = 3; expectation[0].itemNew.iSelectedImage = expectation[1].itemNew.iSelectedImage = 4; expectation[0].itemNew.lParam = expectation[1].itemNew.lParam = new IntPtr(101); expectation[0].itemNew.mask = expectation[1].itemNew.mask = (int)(TVIF.IMAGE | TVIF.PARAM | TVIF.STATE | TVIF.HANDLE | TVIF.SELECTEDIMAGE); expectation[0].itemNew.pszText = expectation[1].itemNew.pszText = IntPtr.Zero; expectation[0].itemNew.state = 0x1060; expectation[1].itemNew.state = 0x1040; expectation[0].itemNew.stateMask = expectation[1].itemNew.stateMask = 0xffff; Assert.IsTrue(EventChecker.CheckNotifyDetail(testDlg, delegate { tree.EmulateExpand(tree.Nodes[1], false); }, expectation)); }
/// <summary> /// 展開通知 /// </summary> /// <param name="isBefore">展開前通知であるか。</param> /// <param name="wndHandle">ウィンドウハンドル。</param> /// <param name="hItem">アイテムハンドル。</param> /// <param name="action">動作。</param> private static void NotifyExpandInTarget(bool isBefore, IntPtr wndHandle, IntPtr hItem, int action) { bool isUni = NativeMethods.IsWindowUnicode(wndHandle); int code = 0; if (isBefore) { code = isUni ? TVN_ITEMEXPANDINGW : TVN_ITEMEXPANDINGA; } else { code = isUni ? TVN_ITEMEXPANDEDW : TVN_ITEMEXPANDEDA; } //情報取得 TVITEMEX_CORE item = new TVITEMEX_CORE(); item.hItem = hItem; item.mask = (int)(TVIF.IMAGE | TVIF.PARAM | TVIF.STATE | TVIF.HANDLE | TVIF.SELECTEDIMAGE); item.stateMask = 0xffff; NativeMethods.SendMessage(wndHandle, (isUni ? TVM_GETITEMW : TVM_GETITEMA), IntPtr.Zero, ref item); //通知 NMTREEVIEW notify = new NMTREEVIEW(); EmulateUtility.InitNotify(wndHandle, code, ref notify.hdr); notify.action = action; item.GetTVITEMEX(ref notify.itemNew); NativeMethods.SendMessage(NativeMethods.GetParent(wndHandle), NativeCommonDefine.WM_NOTIFY, notify.hdr.idFrom, ref notify); }