Piotr Caban : oleacc: Add Client_accHitTest implementation.

Alexandre Julliard julliard at winehq.org
Fri May 9 13:32:36 CDT 2014


Module: wine
Branch: master
Commit: e99dc1acede2cbeb222f4b6458a07c14b64ab2e3
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=e99dc1acede2cbeb222f4b6458a07c14b64ab2e3

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Fri May  9 13:59:51 2014 +0200

oleacc: Add Client_accHitTest implementation.

---

 dlls/oleacc/client.c     |   22 ++++++++++++++++++--
 dlls/oleacc/tests/main.c |   50 +++++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 67 insertions(+), 5 deletions(-)

diff --git a/dlls/oleacc/client.c b/dlls/oleacc/client.c
index e768657..d557de9 100644
--- a/dlls/oleacc/client.c
+++ b/dlls/oleacc/client.c
@@ -340,8 +340,26 @@ static HRESULT WINAPI Client_accHitTest(IAccessible *iface,
         LONG xLeft, LONG yTop, VARIANT *pvarID)
 {
     Client *This = impl_from_Client(iface);
-    FIXME("(%p)->(%d %d %p)\n", This, xLeft, yTop, pvarID);
-    return E_NOTIMPL;
+    HWND child;
+    POINT pt;
+
+    TRACE("(%p)->(%d %d %p)\n", This, xLeft, yTop, pvarID);
+
+    V_VT(pvarID) = VT_I4;
+    V_I4(pvarID) = 0;
+
+    pt.x = xLeft;
+    pt.y = yTop;
+    if(!IsWindowVisible(This->hwnd) || !ScreenToClient(This->hwnd, &pt))
+        return S_OK;
+
+    child = ChildWindowFromPointEx(This->hwnd, pt, CWP_SKIPINVISIBLE);
+    if(!child || child==This->hwnd)
+        return S_OK;
+
+    V_VT(pvarID) = VT_DISPATCH;
+    return AccessibleObjectFromWindow(child, OBJID_WINDOW,
+            &IID_IDispatch, (void**)&V_DISPATCH(pvarID));
 }
 
 static HRESULT WINAPI Client_accDoDefaultAction(IAccessible *iface, VARIANT varID)
diff --git a/dlls/oleacc/tests/main.c b/dlls/oleacc/tests/main.c
index 186a71b..62fe3f8 100644
--- a/dlls/oleacc/tests/main.c
+++ b/dlls/oleacc/tests/main.c
@@ -315,13 +315,14 @@ static void test_default_client_accessible_object(void)
     HRESULT hr;
     VARIANT vid, v;
     BSTR str;
+    POINT pt;
     LONG l;
 
     hwnd = CreateWindowA("oleacc_test", "test &t &junk", WS_OVERLAPPEDWINDOW,
-            0, 0, 0, 0, NULL, NULL, NULL, NULL);
+            0, 0, 100, 100, NULL, NULL, NULL, NULL);
     ok(hwnd != NULL, "CreateWindow failed\n");
-    chld = CreateWindowA("static", "message", WS_CHILD,
-            0, 0, 0, 0, hwnd, NULL, NULL, NULL);
+    chld = CreateWindowA("static", "message", WS_CHILD | WS_VISIBLE,
+            0, 0, 50, 50, hwnd, NULL, NULL, NULL);
     ok(chld != NULL, "CreateWindow failed\n");
 
     hr = CreateStdAccessibleObject(NULL, OBJID_CLIENT, &IID_IAccessible, (void**)&acc);
@@ -388,6 +389,44 @@ static void test_default_client_accessible_object(void)
     ok(hr == S_FALSE, "got %x\n", hr);
     ok(!str, "str != NULL\n");
 
+    pt.x = pt.y = 60;
+    ok(ClientToScreen(hwnd, &pt), "ClientToScreen failed\n");
+    hr = IAccessible_accHitTest(acc, pt.x, pt.y, &v);
+    ok(hr == S_OK, "got %x\n", hr);
+    ok(V_VT(&v) == VT_I4, "V_VT(&v) = %d\n", V_VT(&v));
+    ok(V_I4(&v) == 0, "V_I4(&v) = %d\n", V_I4(&v));
+
+    pt.x = pt.y = 25;
+    ok(ClientToScreen(hwnd, &pt), "ClientToScreen failed\n");
+    hr = IAccessible_accHitTest(acc, pt.x, pt.y, &v);
+    ok(hr == S_OK, "got %x\n", hr);
+    ok(V_VT(&v) == VT_I4, "V_VT(&v) = %d\n", V_VT(&v));
+    ok(V_I4(&v) == 0, "V_I4(&v) = %d\n", V_I4(&v));
+
+    ShowWindow(hwnd, TRUE);
+    pt.x = pt.y = 60;
+    ok(ClientToScreen(hwnd, &pt), "ClientToScreen failed\n");
+    hr = IAccessible_accHitTest(acc, pt.x, pt.y, &v);
+    ok(hr == S_OK, "got %x\n", hr);
+    ok(V_VT(&v) == VT_I4, "V_VT(&v) = %d\n", V_VT(&v));
+    ok(V_I4(&v) == 0, "V_I4(&v) = %d\n", V_I4(&v));
+
+    pt.x = pt.y = 25;
+    ok(ClientToScreen(hwnd, &pt), "ClientToScreen failed\n");
+    hr = IAccessible_accHitTest(acc, pt.x, pt.y, &v);
+    ok(hr == S_OK, "got %x\n", hr);
+    ok(V_VT(&v) == VT_DISPATCH, "V_VT(&v) = %d\n", V_VT(&v));
+    ok(V_DISPATCH(&v) != NULL, "V_DISPATCH(&v) = %p\n", V_DISPATCH(&v));
+    VariantClear(&v);
+
+    ShowWindow(chld, FALSE);
+    pt.x = pt.y = 25;
+    ok(ClientToScreen(hwnd, &pt), "ClientToScreen failed\n");
+    hr = IAccessible_accHitTest(acc, pt.x, pt.y, &v);
+    ok(hr == S_OK, "got %x\n", hr);
+    ok(V_VT(&v) == VT_I4, "V_VT(&v) = %d\n", V_VT(&v));
+    ok(V_I4(&v) == 0, "V_I4(&v) = %d\n", V_I4(&v));
+
     DestroyWindow(hwnd);
 
     hr = IAccessible_get_accChildCount(acc, &l);
@@ -410,6 +449,11 @@ static void test_default_client_accessible_object(void)
     ok(V_VT(&v) == VT_I4, "V_VT(&v) = %d\n", V_VT(&v));
     ok(V_I4(&v) == STATE_SYSTEM_INVISIBLE, "V_I4(&v) = %x\n", V_I4(&v));
 
+    hr = IAccessible_accHitTest(acc, 200, 200, &v);
+    ok(hr == S_OK, "got %x\n", hr);
+    ok(V_VT(&v) == VT_I4, "V_VT(&v) = %d\n", V_VT(&v));
+    ok(V_I4(&v) == 0, "V_I4(&v) = %d\n", V_I4(&v));
+
     IAccessible_Release(acc);
 }
 




More information about the wine-cvs mailing list