• Windows Mobile下使用HTML控件


    在某些特殊的应用场合,我们很想要一个类似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://点击Url
                     break;

                   case NM_DOCUMENTCOMPLETE://文档显示结束
                     break;

                   case NM_INLINE_IMAGE://显示图片
                      return TRUE;
                }
            }
           break;

           default:
            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,不然控件本身会再处理一遍。

  • 相关阅读:
    减轻Temporal AA 的 拖影问题(ghosting)
    UE4开发PSVR游戏流程
    3.1 使用STC89C52控制MC20拨打电话
    2.6 基于ARDUINO UNO+MC20的路径显示功能
    2.5 使用ARDUINO做主控,手机发送短信控制开关LED
    2.4 使用ARDUINO控制MC20进行GPS数据的获取和解析
    2.3 使用ARDUINO控制MC20进行GPRS的TCP通讯
    2.2 使用ARDUINO控制MC20发短信
    2.1 使用ARDUINO控制MC20打电话
    1.8 使用电脑测试MC20的GPRS功能
  • 原文地址:https://www.cnblogs.com/fengju/p/6173568.html
Copyright © 2020-2023  润新知