`
guowee
  • 浏览: 176679 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Windows Mobile中使用htmlCtrl控件

阅读更多
在某些特殊的应用场合,我们很想要一个类似IE功能的模块,定制自己的功能。

HTML控件现在向我们张开了怀抱。稍稍奇怪的是,它并不完全支持WAP协议。看来,IE还是做了自己的解析。

首先,我们要注册一下控件。把Htmlctrl.h包含进来,调用InitHTMLControl()函数,里面的参数为应用程序句柄。以下代码在MFC中使用:

VERIFY(InitHTMLControl(AfxGetInstanceHandle()));
 
 DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS;
 RECT rect;
 GetClientRect(&rect);
 m_hHtmlWnd = ::CreateWindow (DISPLAYCLASS,
                                 NULL,
                                 dwStyle,
                                 rect.left,
                                 rect.top,
                                 rect.right,
                                 rect.bottom,
                                 m_hWnd,
                                 0,
                                 ::AfxGetInstanceHandle(),
                                 NULL);

 ::SetWindowLong(m_hHtmlWnd, GWL_ID, 12321);
 ::SetFocus(m_hHtmlWnd);
 ::SendMessage(m_hHtmlWnd, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)_T(""));

在这里,m_hHtmlWnd是某个Dialog的HWND型成员变量。

然后,在Dialog的WindowProc函数中,使用如下方法:

switch(message)
 {
  case WM_NOTIFY:
        {
            WCHAR wszURL[1000] = {0};
            NM_HTMLVIEW* pnmHTMLView = (NM_HTMLVIEW*)lParam;
   
            switch (pnmHTMLView->hdr.code)
            {
              case NM_HOTSPOT:
             {
              OutputDebugString(pnmHTMLView->szTarget);
             break;
            }

             case NM_INLINE_IMAGE:
            {
             OutputDebugString(TEXT("NM_INLINE_IMAGE\r\n"));
             break;
            }

            case NM_INLINE_SOUND:
           {
          OutputDebugString(TEXT("NM_INLINE_SOUND\r\n"));
           break;
           }

          case NM_TITLE:
          {
          OutputDebugString(TEXT("NM_TITLE\r\n"));
          break;
         }

         case NM_META:
        {
        OutputDebugString(TEXT("NM_META\r\n"));
         break;
        }

        case NM_BASE:
        {
        OutputDebugString(TEXT("NM_BASE\r\n"));
        break;
        }

      case NM_CONTEXTMENU:
       {
        OutputDebugString(TEXT("NM_CONTEXTMENU\r\n"));
        break;
      }

      case NM_INLINE_XML:
      {
       OutputDebugString(TEXT("NM_INLINE_XML\r\n"));
       break;
      }

     case NM_BEFORENAVIGATE:
      {
       OutputDebugString(TEXT("NM_BEFORENAVIGATE\r\n"));
       break;
      }

     case NM_DOCUMENTCOMPLETE:
      {
       OutputDebugString(TEXT("NM_DOCUMENTCOMPLETE\r\n"));
       break;
      }

     case NM_NAVIGATECOMPLETE:
      {
       OutputDebugString(TEXT("NM_NAVIGATECOMPLETE\r\n"));
       break;
      }

     case NM_TITLECHANGE:
      {
       OutputDebugString(TEXT("NM_TITLECHANGE\r\n"));
       break;
      }

     default:
      {
       ASSERT(FALSE);
       break;
      }

}

}
  }


  在上面的几个关键点,NM_HOTSPOT是用户点击了网页链接,通过访问pnmHTMLView->szTarget可以得到网页内容。 SendMessage可以将得到的内容赋给控件,控件会自己解析网页元素。如果有图片链接,将会触发NM_INLINE_IMAGE动作。此时亦需要通过访问pnmHTMLView->szTarget来得到图片。如果得到了图片的内容,可以使用下面的代码来显示:

INLINEIMAGEINFO imageInfo;
imageInfo.dwCookie = pnmHTMLView->dwCookie;
imageInfo.bOwnBitmap = FALSE;
imageInfo.hbm = hBitmap;

BITMAP mInfo; 
GetObject(hBitmap, sizeof(BITMAP), (LPBYTE)&mInfo);

imageInfo.iOrigWidth  = mInfo.bmWidth;
imageInfo.iOrigHeight = mInfo.bmHeight;
        
::SendMessage(pnmHTMLView->hdr.hwndFrom, DTM_SETIMAGE, 0, (LPARAM)(INLINEIMAGEINFO*)&imageInfo);


上面代码中hBitmap为图片位图句柄。

  我在处理图片的时候,遇到的问题是。使用SHLoadImageFile函数后,需使用DeleteObject函数释放句柄内存。否则将有内存泄露。MSDN没有提及这一现象。

如果未得到图片内容,想在网页相应的位置显示一个叉,DTM_SETIMAGE参数应改为DTM_IMAGEFAIL。

  值得注意的是,如果我们处理了NM_HOTSPOT或NM_INLINE_IMAGE消息,需要返回TURE或FALSE,不然控件本身会再处理一遍。

关于 NM_HTMLVIEW 结构体

typedef struct tagNM_HTMLVIEW {
NMHDR hdr;
LPSTR szTarget;
LPSTR szData;
DWORD dwCookie;
} NM_HTMLVIEW;


函数中的第一个参数是一个NMHDR类型的结构体
NMHDR Structure

Contains information about a notification message.

Syntax

    typedef struct tagNMHDR {
                HWND hwndFrom;
                UINT_PTR idFrom;
                UINT code;
                } NMHDR;


Members

    hwndFrom
        A window handle to the control sending the message.
    idFrom
        An identifier of the control sending the message.
    code
        A notification code. This member can be one of the common notification codes (see Notifications under General Control Reference), or it can be a control-specific notification code.
分享到:
评论

相关推荐

    windows mobile 第三方控件

    Windows Mobile第三方控件是开发者在构建Windows Mobile应用时不可或缺的工具。Windows Mobile,作为微软针对移动设备开发的操作系统,虽然自带了一些基本的UI元素和功能,但为了满足更丰富的交互设计和功能需求,...

    windows mobile 透明控件渐变色

    本文将深入探讨如何在Windows Mobile中实现透明控件以及使用渐变色,以提升用户体验。 首先,透明控件允许背景图像或颜色透过控件本身,为用户提供更为丰富的视觉效果。在Windows Mobile中,可以使用GDI+图形库来...

    windows mobile 图片展示控件

    windows mobile 图片展示控件windows mobile 图片展示控件windows mobile 图片展示控件windows mobile 图片展示控件windows mobile 图片展示控件windows mobile 图片展示控件windows mobile 图片展示控件windows ...

    windows mobile 透明控件

    使用"AlphaMobileControls"库时,提供的示例代码可以帮助开发者理解如何在实际项目中使用这些控件。通过查看和学习示例,可以快速掌握如何创建和配置透明控件,以及如何处理它们与其他UI元素的相互作用。 8. **...

    WINCE和windowsmobile的背景透明控件

    在Windows CE(简称WINCE)和Windows Mobile操作系统中,开发应用程序时,我们有时需要实现一些高级的用户界面效果,比如背景透明的控件。这样的设计可以使应用看起来更加现代和吸引人,同时也可能提升用户体验。本...

    screenlib windows mobile手機調整控件位置程式庫

    "screenlib windows mobile手機調整控件位置程式庫"是一个专为Windows Mobile操作系统设计的库,主要功能是帮助开发者更方便地调整应用程序中的控件位置。Windows Mobile是微软为掌上设备如智能手机和平板电脑开发的...

    WINCE和Windows Mobile上的透明控件,图片按钮,图片标签,支持窗体背景图

    在Windows CE和Windows Mobile中,可以使用Bitmap对象并结合PictureBox控件来创建图片按钮。当按钮被按下时,可以通过改变图片的状态(如高亮或按下状态)来反馈用户的操作。在提供的DLL中,可能已经封装了图片按钮...

    windows mobile透明控件

    在Windows Mobile上,透明控件的实现并不像在现代操作系统中那么直观,但仍然可以通过一些技巧来达到目的。 首先,了解基本原理:Windows Mobile使用GDI(图形设备接口)进行绘图,它支持基本的透明性,但没有直接...

    windows mobile 6.0模拟器使用

    Windows Mobile 6.0 模拟器使用 Windows Mobile 6.0 模拟器是一个功能强大的工具,可以模拟企业邮件收发,主要用于测试和开发目的。在本文中,我们将详细介绍如何设置 Windows Mobile 6.0 模拟器来收发企业电子邮件...

    非常漂亮的Windows Mobile 进度条控件

    这些资源可以帮助开发者深入了解如何在Windows Mobile环境中创建美观且功能丰富的进度条控件,提升应用的用户界面质量。通过学习和实践,开发者可以掌握更多关于控件设计、性能优化以及用户体验提升的技巧。

    windowsmobile6常用控件的用法及打包安装程序过程

    在Windows Mobile 6开发中,掌握常用控件的用法和打包安装程序的过程是至关重要的。本文将详细阐述这些知识点。 首先,我们来看时间控件DateTimePicker。这个控件允许开发者为时间显示设定特定样式。通过设置...

    windows mobile透明树型控件

    平台:windows mobile 实现思想:在树型控件中加入背景图,此背景图为树型控件所在窗口的背景图的一部分.这样看起来树型控件就透明了. 解决了各种情况下的背景重叠,错位闪硕等问题,是一个完整的ctreectrl类

    Windows mobile 透明/半透明控件组(皮肤控件)

    当前Windows mobile下的皮肤控件还很少,而且实现透明的更加少。本人曾经在Delphi开发过一套透明控件,于是决定把它移植到windows mobile系统下。在仿真器上和三星I718+上测试过,更换皮肤速度优化得相当快了,在...

    windows mobile 透明控件应用例子

    在Windows Mobile中,这通常是通过设置控件的背景颜色或使用特定的绘图技术来实现的。 对于button控件,透明化通常涉及更改控件的背景色或使用自定义绘制。例如,我们可以设置按钮的背景色为透明(RGB(255, 255, ...

    windows mobile 控件组

    这款工具包在业界具有较高的知名度,甚至中兴通讯这样的大型企业也在其项目中使用。 Resco.MobileForms Toolkit包含了多种控件,如按钮、文本框、列表视图、日历、滑块、进度条、下拉菜单等,这些控件都经过优化,...

    windows mobile动画控件

    windows mobile动画按钮,.net cf写的

    windows mobile下透明控件

    在Windows Mobile操作系统上,开发透明控件是一种提升用户体验和界面美观度的重要技术。透明控件允许用户看到控件下方的背景或其它控件,从而创建出更具吸引力的UI设计。以下我们将详细介绍两种实现Windows Mobile下...

Global site tag (gtag.js) - Google Analytics