Web サイトの表示方法 - 1 / 2 -
IHTMLViewer
IHTMLViewer は HTML データをインライン画像も含めて画面にレイアウト表示する BREW インターフェースです。
※ HTML データは HTML の文法に則って正しく記述する必要があります。また、HTML のバージョンは HTML 3.2 のサブセットであり、サポートされていない HTML 機能もあります。詳細は BREW API リファレンスをご覧ください。
関連情報:" 第 12 回 HTTP ネットワークプログラミング "
アプリの概要
- 最初に、左のHTML データを表示します。
" Access to Sample " がセレクトされると、ソフィア・クレイドル Web サイトにある HTML ページを表示します。
※ "TabBrowser" からも閲覧できます。
MIF ファイルの設定
MIF ファイルには「ネットワーク」と 「Web アクセス」の特権レベルを設定します。
※ HTML データを表示するだけなら、特権レベルの設定は不要です。
関連情報:" 第 11 回 TCP / IP ネットワークプログラミング − MIF ファイルの設定 − "
準備
アプレット構造体には IHTMLViewer インターフェースと IWeb インターフェースのインスタンス変数、URL を格納する配列を追加します。
■アプレット構造体の宣言
typedef struct HTMLViewerApp { AEEApplet a; // アプレット構造体の先頭メンバは必ず AEEApplet 型にすること。 IDisplay* display; int width; int height; IHtmlViewer* htmlviewer; // IHTMLViewer インターフェースのインスタンス変数 char url[256]; // URL を格納する配列 // Web 通信用 IWeb* web; // IWeb インターフェースのインスタンス変数 AEECallback callback; IWebResp* webresp; IGetLine* getline; } HTMLViewerApp;
※ その他 : " AEEHTMLViewer.h " ヘッダーファイルのインクルードが必要です。
バッファ内の HTML データの画面表示
■アプレット開始時に呼び出される OnAppStart 関数
IHTMLViewer のインスタンスを生成し、プログラム内に記述された HTML データを画面に表示します。
// アプレットが開始したときに呼び出される。 static boolean OnAppStart(HTMLViewerApp* app) { AEEDeviceInfo devinfo; IShell* shell = app->a.m_pIShell; AEERect rc; char htmlData[] = "HtmlViewerApp<br /><br /><br />" "<a href=\"/example/tabbrowser/\">" "Access to Sample Page</a><br /><br />" "<img src=\"/images/SC_logo_3d.jpg\" " "width=\"92\" height=\"97\" alt=\"SC LOGO\" />"; WebOpt webopts[2]; app->display = NULL; ISHELL_CreateInstance(shell, AEECLSID_DISPLAY, (void**)&app->display); // 画面サイズを取得 ISHELL_GetDeviceInfo(shell, &devinfo); app->width = devinfo.cxScreen; app->height = devinfo.cyScreen; // IHtmlViewer インターフェース作成 app->htmlviewer = NULL; ISHELL_CreateInstance(shell, AEECLSID_HTML, (void**)&app->htmlviewer); // アクティブ画面の領域設定 rc.x = 5; rc.y = 5; rc.dx = app->width - 10; rc.dy = app->height - 10; IHTMLVIEWER_SetRect(app->htmlviewer, &rc); // HTML の読み込み IHTMLVIEWER_ParseBuffer(app->htmlviewer, htmlData); // 通知コールバックの設定 IHTMLVIEWER_SetNotifyFn(app->htmlviewer, (PFNHVIEWNOTIFY)HTMLVIEWERNotify, app); // Active 設定 IHTMLVIEWER_SetActive(app->htmlviewer, TRUE); app->web = NULL; ISHELL_CreateInstance(shell, AEECLSID_WEB, (void**)&app->web); // 接続のタイムアウト時間の設定 (ms) webopts[0].nId = WEBOPT_CONNECTTIMEOUT; webopts[0].pVal = (void*)10000; // WebOpt 終了マーク webopts[1].nId = WEBOPT_END; // オプションを設定 IWEB_AddOpt(app->web, webopts); return TRUE; }
IHTMLVIEWER_SetRect で表示する領域を設定し、IHTMLVIEWER_ParseBuffer で HTML データを渡し、IHTMLVIEWER_SetActive で Active に設定します。
※ 1. コントロールは Active に設定されると、キーイベントなどの処理が行われます。
※ 2. IHTMLVIEWER_SetNotifyFn で通知コールバック関数 HTMLVIEWERNotify を設定します。
※ 3. IHTMLViewer コントロールは画面表示するときに、IDISPLAY_Update 関数を呼ぶ必要はありません。
イベントハンドリング
テキストコントロール ( ITextCtl ) と同様に、HTMLViewerApp_HandleEvent の先頭でキー入力などのイベントを IHTMLViewer インスタンスに渡します。
※ 関連情報 : BREW プログラミング入門 "BREW のテキストコントロール"
static boolean HTMLViewerApp_HandleEvent(HTMLViewerApp* app, AEEEvent eCode, uint16 wParam, uint32 dwParam) { if (eCode == EVT_APP_START) { return OnAppStart(app); } else if (app->htmlviewer != NULL && IHTMLVIEWER_HandleEvent(app->htmlviewer, eCode, wParam, dwParam)) { // htmlviewer にイベントを通知。処理されれば関数を終了する。 return TRUE; } else { switch (eCode) { case EVT_APP_STOP: return OnAppStop(app); } } return FALSE; }
IHTMLViewer の通知コールバック
リンクが選択されると、IHTMLViewer は、リンクが選択された、というイベントで、先の IHTMLVIEWER_SetNotifyFn で設定された通知コールバック関数 HTMLVIEWERNotify を呼び出します。
その後、リンク先の HTML データを取得し、IHTMLViewer に渡して表示します。
■通知コールバック関数
// HTMLViewe のイベント処理 static void HTMLVIEWERNotify(HTMLViewerApp* app, HViewNotify* notify) { switch (notify->code) { // <a href="xxx">が押下されたとき case HVN_JUMP: DBGPRINTF(notify->u.jump.pszURL); STRCPY(app->url, notify->u.jump.pszURL); // 通信開始 WebAction_Start(app, app->url); break; default: DBGPRINTF("HTML NOTIFY: %d", notify->code); break; } return; }
HViewNotify は通知されるイベント情報を保持する構造体です。code はイベントの種類、u はイベントに応じた値を保持する共用体です。notify->u.jump.pszURL の中に URL が格納されており、WebAction_Start 関数でその URL にアクセスします。
通知コールバック関数には HVN_JUMP の他にも、イメージを除くロードの完了、イメージを含むロードの完了、ユーザのテキスト入力完了、などのイベントがあります。
リンク先の HTML データ表示
取得した HTML データは、IWeb インスタンスの保持するバッファ (ISource インターフェース) 内にあります。IHTMLVIEWER_LoadSource 関数を使って、 ISource インターフェースから非同期で HTML データを読み込みます。
// メッセージの取得開始(IWeb を使った通信が終了したときの処理) static void WebAction_GotResp(void* p) { HTMLViewerApp* app = (HTMLViewerApp*)p; WebRespInfo* info; info = IWEBRESP_GetInfo(app->webresp); DBGPRINTF("** got response...\n** info code: %d\n", info->nCode); if (info->pisMessage != NULL) { // 相対アドレスを解決するため、表示する URL を設定 IHTMLVIEWER_SetURL(app->htmlviewer, app->url); // HTML の読み込み IHTMLVIEWER_LoadSource(app->htmlviewer, info->pisMessage); } else { DBGPRINTF("** no response\n"); } WebAction_Stop(app); return; }
IHTMLVIEWER_SetURL 関数で表示する URL を設定することで、HTML データ内の相対 URL を IHTMLViewer が正しく扱えます。