「Win32/64ネットワーク開発 001 ATLを使ったブラウザ」の版間の差分
(→手順) |
(→手順) |
||
10行目: | 10行目: | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
AtlAxWinInit() | AtlAxWinInit(); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
2023年11月8日 (水) 13:38時点における版
概要
ATLで準備されているライブラリを使うと簡単に役に立ちそうもないブラウザが作れます。CSSやJavaScriptに対応していないので、だいたいのページが不完全な状態で表示される程度のものです。それでもイチカラ作るよりは楽。これはお遊び程度の技術です。簡単にこんなこともできるという程度です。まったく実用的ではないので、ネットワークの処理の到達点にはこういうものがあるという程度の情報です。つぎに紹介するwininetライブラリも同じです。我々はもっと地味な低レベルなネットワーク処理技術を習得を目指しています。根本的な技術を習得するのが目的です。
手順
Windowsアプリの骨格についてはこちらで勉強して下さい。CreateWindow関数でメインウインドウは作ったとして、作成したメインウィンドウに対して、更にサブウィンドウを生成します。このサブウィンドウをブラウザのウィンドウとする感じです。自分の作ったWin32/64基本の説明でEditコントロールを埋め込みましたが、ここを変える感じです。WM_CREATEのメッセージが飛んで来たら、メインウィンドウが作られているので、WM_CREATEの中での処理を記述します。まずATLの初期化を行います。
AtlAxWinInit();
初期化は、基本の説明でもやったWNDCLLASS型のメンバ関数にウィンドウ作成に必要な情報を登録する作業によく似た処理です。
次にCreateWindowEx関数の第2引数、第3引数に
HWND HWNDie;
CComQIPtr<IWebBrowser2> CComQIPtr_IWebBrowser2_Br;
HWNDie = CreateWindow(
L"AtlAxWin140",//ウィンドウクラス名
L"Shell.Explorer.2",//ウィンドウタイトル名
WS_CHILD | WS_VISIBLE, 0, 0, 0, 0,
hWnd, (HMENU)NULL, HINSTANCEinst, NULL);
を指定してウィンドウを作ります。Editコントロールを作成するときにEDITと指定したのとよく似ていることで、上記の指定でブラウザを持ったウィンドウが作られます。
CComPtr<IUnknown> CComPtr_IUnknown_func;
AtlAxGetControl(HWNDie, &CComPtr_IUnknown_func);
CComQIPtr_IWebBrowser2_Br = CComPtr_IUnknown_func;
と、意味不明なCComptrテンプレートのIUnknown型とか、CComQIPtrテンプレートのIWebBrowser2型とかを渡り歩きながら、AtlAxGetControl関数を使って、CComQIPtr_IWebBrowser2_Brのような形でポインタを受け取ります。そうするとCComQIPtr_IWebBrowser2_Brにはメンバ関数にGoHome(ホーム設定のURIに戻る命令)やNavigate(第一引数で指定したURLへ移動する命令), GoBack(ひとつ前のSiteに戻る), GoForward(戻ってきたときにやっぱり先のSiteに進む命令), Stop(通信の停止をする命令)のようなブラウザを操作する関数が結び付いた状態になります。他にもページを更新するメンバ関数Refresh()もありあす。
その他Refresh2(*Level), GoSearch(), get_Application(), get_Parent(), get_Container(), get_Document(), get_TopLevelContainer(), get_Type(), get_Left(), get_Top(), put_Top(), get_Width(), put_Width(), get_Height(), put_Height(), get_LocationName(), get_LocationURL(), get_Busy()というメンバ関数があります。あまり深入りはしません。
CComQIPtr_IWebBrowser2_Br->Refresh()といった関数の実行はボタンを押したり、メニューを選択したりしたときに動くようにコマンドの実行を送信するメッセージプロシージャ関数に組み込むのがよいでしょう。