Windows Mobile下使用HTML控制項

來源:互聯網
上載者:User

在某些特殊的應用場合,我們很想要一個類似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,不然控制項本身會再處理一遍。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.