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
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.