天天看點

Windows Mobile下使用HTML控件 Mobile

Windows Mobile下使用HTML控件 Mobile, 控件, Windows, 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,不然控件本身會再處理一遍。