Windows Mobileでhtmlコントロールを使う
4999 ワード
特定のアプリケーションでは、IE機能のようなモジュールが必要で、独自の機能をカスタマイズします.
HTMLコントロールは今私たちに懐を開いています.少し不思議なことに、WAPプロトコルを完全にサポートしていない.どうやら、IEは自分の解析をしたようだ.
まず、コントロールを登録します.Htmlctrl.hは、InitHTML Control()関数を呼び出し、そのパラメータはアプリケーションハンドルです.以下のコードは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")); break; } case NM_INLINE_SOUND: { OutputDebugString(TEXT("NM_INLINE_SOUND\r")); break; } case NM_TITLE: { OutputDebugString(TEXT("NM_TITLE\r")); break; } case NM_META: { OutputDebugString(TEXT("NM_META\r")); break; } case NM_BASE: { OutputDebugString(TEXT("NM_BASE\r")); break; } case NM_CONTEXTMENU: { OutputDebugString(TEXT("NM_CONTEXTMENU\r")); break; } case NM_INLINE_XML: { OutputDebugString(TEXT("NM_INLINE_XML\r")); break; } case NM_BEFORENAVIGATE: { OutputDebugString(TEXT("NM_BEFORENAVIGATE\r")); break; } case NM_DOCUMENTCOMPLETE: { OutputDebugString(TEXT("NM_DOCUMENTCOMPLETE\r")); break; } case NM_NAVIGATECOMPLETE: { OutputDebugString(TEXT("NM_NAVIGATECOMPLETE\r")); break; } case NM_TITLECHANGE: { OutputDebugString(TEXT("NM_TITLECHANGE\r")); break; } default: { ASSERT(FALSE); break; }
}
} }
上のいくつかのキーでNM_HOTSPOTは,ユーザがウェブリンクをクリックし,pnmHTML View->szTargetにアクセスすることでウェブコンテンツを得ることができる.SendMessageは、得られたコンテンツをコントロールに割り当てることができ、コントロールは自分でページ要素を解析します.画像リンクがある場合はNM_がトリガーされますINLINE_IMAGE動作.この場合もpnmHTML View->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_についてHTML VIEW構造体
typedef struct tagNM_HTMLVIEW { NMHDR hdr; LPSTR szTarget; LPSTR szData; DWORD dwCookie; } NM_HTMLVIEW;
関数の最初のパラメータはNMHDR型の構造体である.
NMHDR Structure
Contains information about a notification message.
Syntax
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.
HTMLコントロールは今私たちに懐を開いています.少し不思議なことに、WAPプロトコルを完全にサポートしていない.どうやら、IEは自分の解析をしたようだ.
まず、コントロールを登録します.Htmlctrl.hは、InitHTML Control()関数を呼び出し、そのパラメータはアプリケーションハンドルです.以下のコードは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")); break; } case NM_INLINE_SOUND: { OutputDebugString(TEXT("NM_INLINE_SOUND\r")); break; } case NM_TITLE: { OutputDebugString(TEXT("NM_TITLE\r")); break; } case NM_META: { OutputDebugString(TEXT("NM_META\r")); break; } case NM_BASE: { OutputDebugString(TEXT("NM_BASE\r")); break; } case NM_CONTEXTMENU: { OutputDebugString(TEXT("NM_CONTEXTMENU\r")); break; } case NM_INLINE_XML: { OutputDebugString(TEXT("NM_INLINE_XML\r")); break; } case NM_BEFORENAVIGATE: { OutputDebugString(TEXT("NM_BEFORENAVIGATE\r")); break; } case NM_DOCUMENTCOMPLETE: { OutputDebugString(TEXT("NM_DOCUMENTCOMPLETE\r")); break; } case NM_NAVIGATECOMPLETE: { OutputDebugString(TEXT("NM_NAVIGATECOMPLETE\r")); break; } case NM_TITLECHANGE: { OutputDebugString(TEXT("NM_TITLECHANGE\r")); break; } default: { ASSERT(FALSE); break; }
}
} }
上のいくつかのキーでNM_HOTSPOTは,ユーザがウェブリンクをクリックし,pnmHTML View->szTargetにアクセスすることでウェブコンテンツを得ることができる.SendMessageは、得られたコンテンツをコントロールに割り当てることができ、コントロールは自分でページ要素を解析します.画像リンクがある場合はNM_がトリガーされますINLINE_IMAGE動作.この場合もpnmHTML View->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_についてHTML VIEW構造体
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.