WINCE IE浏览器定制--支持触摸屏滑动操作

 

 

 

    由于需要在现有产品中集成WEB 浏览器,但IE自带的浏览器本身是不支持触摸屏滑动翻页的,而且IE本身用户体验也不敢恭维。有什么办法我们可以自己定制IE浏览器呢?下面将介绍如何定制IE使其支持触摸屏滑动操作。

    安装WINCE6.0后,在%_WINCEROOT%/Public/Ie/Oak 目录下有IESAMPLEIESIMPLE两个文件夹,IESAMPLECEIE的标准版本的源码,有工具栏、状态栏、地址栏,还有Internet选项、收藏夹等等。和PC WindowsIE几乎一样。而IESIMPLE是简化版本,只包含了基本的IWebBrowser控件。我们就可以基于这两个IE源码来定制我们自己需要的浏览器。IESIMPLE目录如下图所示:

 

   

    废话不多说了,下面就基于IESIMPLE源码来定制一个支持触摸滑动操作的web 浏览器。

 

      VS2005下新建一个智能设备WIN32工程,并把IESIMPLE目录下的mainwnd.cpp,mainwnd, iesimple.rc, resource.h的四个文件拷贝至新建的工程目录。你也可以 直接在PB中找到iesimple 并右键build,如下图所示,然后到PB工程realease目录下将生成的

iesimple.exe拷贝至设备运行。但这样会有一个弊端:因为PB是不支持在线调试的,而且每次build后需要手动将可执行文件拷贝至设备运行。而直接新建一个工程的话会省去这些麻烦,而且不影响WINCE600原有代码。

       首先直接编译一下,正常的话能够顺利编译通过,可以先将生成的.exe拷贝到设备运行看一下效果。

 

     要想IE能够支持滑动翻页,主要是能够让IE响应WM_MOUSEMOVE消息,但IWebBrowser控件内部本身并未对WM_MOUSEMOVE消息做处理,这里采用在消息循环中截获WM_LBUTTONDOWNWM_MOUSEMOVEWM_LBUTTONUP并将消息交给主窗体的过程处理函数处理。在mainwnd.cpp找到NewWindow线程函数,加入如下代码:

  while (GetMessage( &msg, NULL, 0, 0 )) { switch(msg.message) { case WM_LBUTTONDOWN: { ::SendMessage(pWnd->_hWnd,msg.message,msg.wParam,msg.lParam); break; } case WM_MOUSEMOVE: { ::SendMessage(pWnd->_hWnd,msg.message,msg.wParam,msg.lParam); break; } case WM_LBUTTONUP: { ::SendMessage(pWnd->_hWnd,msg.message,msg.wParam,msg.lParam); break; } } if (!pWnd->PreTranslateMessage(&msg) && !(msg.message == WM_CHAR && msg.wParam == VK_TAB)) { TranslateMessage(&msg); DispatchMessage(&msg); } } 

 

    在窗口处理函数LRESULT CALLBACK CMainWnd::MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)添加对WM_LBUTTONDOWNWM_MOUSEMOVEWM_LBUTTONUP消息处理。IE HTML页面的滑动操作主要通过调用IHTMLElement2接口的put_scrollTop方法来控制滚动条拖动。具体代码如下:LRESULT CALLBACK CMainWnd::MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { CMainWnd *pMainWnd = (CMainWnd*)GetWindowLong(hwnd, GWL_USERDATA); HRESULT hr; IDispatch *pDisp = NULL; IHTMLElement2 *pElement = NULL; IHTMLDocument2 *pDocument = NULL; if (pMainWnd) { switch (message) { case WM_LBUTTONDOWN: { g_MoveFlag=true; yLastPos = HIWORD(lParam); break; } case WM_MOUSEMOVE: { SHORT yPos = HIWORD(lParam); if(pMainWnd->_pBrowser) { hr = pMainWnd->_pBrowser->get_Document(&pDisp); ASSERT( SUCCEEDED( hr ) ); if(SUCCEEDED( hr )) { hr = pDisp->QueryInterface( IID_IHTMLDocument2, (void**)&pDocument ); IHTMLDocument3 *pDocument3=NULL; hr = pDisp->QueryInterface( IID_IHTMLDocument3, (void**)&pDocument3 ); IHTMLElement *pBody2=NULL; hr = pDocument3->get_documentElement(&pBody2); if(SUCCEEDED( hr )&&pBody2!=NULL) { hr=pBody2->QueryInterface( IID_IHTMLElement2, (void**)&pElement ); pBody2->Release(); } pDocument3->Release(); pDocument->Release(); pDisp->Release(); } } if(g_MoveFlag==true) { if(pElement) { long MoveTo=yTotal+(yLastPos-yPos); printf(" yPos:%d/n", yPos); printf(" MoveTo:%d/n", MoveTo); pElement->put_scrollTop(MoveTo); } } break; } case WM_LBUTTONUP: { SHORT yPos = HIWORD(lParam); yTotal+=(long)(yLastPos-yPos); if(yTotal<0) yTotal=0; if(pElement) { long scroll_height=0; pElement->get_scrollHeight(&scroll_height); if(yTotal>(scroll_height-IE_WINDOW_H)) yTotal=scroll_height-IE_WINDOW_H; pElement->Release(); } g_MoveFlag=false; break; } // TODO Other Message }

    这样就可以生成一个支持滑动操作的WebBrowser了,你还可以重新设计IE工具栏的UI,添加前进、返回、地址输入框等,这样一个全新的IE就出现了。

你可能感兴趣的:(wince,浏览器,ie,scroll,webbrowser,callback)