IEコントロールのいくつかの高度な使用方法


IEコントロールのいくつかの高度な使用方法の著者:楊先生
ソースコードのダウンロードここでは、メモリ内のHTMLページを表示する方法について説明します.2、マウスの右ボタンのコンテキストメニューをどのように遮断するか.3、HTMLのスクリプト(external)オブジェクトをどのように拡張するか.4、HTMLスタイルのダイアログウィンドウを表示する方法;5、HTMLスクリプトの実行方法一、メモリのHTMLページをどのように表示するか、あるいはページの秘密保持の考慮のため.あるいはソフトウェア配布の考えから、IEやIEブラウザコントロールにメモリやリソースのHTMLページを表示させる必要がある場合があります.MFCでは、CHtmlView::LoadFromResource()がプログラムリソースのHTMLコンテンツを表示します.MFCのCHtmlViewは実はIWebBrowser 2のパッケージであることはよく知られていますが、IWebBrowser 2では似たような方法はありません.どうやって実現したのでしょうか?手順は以下の通りである:1、まずIWebBrowser 2::Navigate 2()を通じて有効なオブジェクトを生成し、IHTML Document 2インタフェースを得ることを目的とするウェブページを表示する.  2、IWebBrowser2::get_Document()は、IHTML Document 2インタフェースポインタを取得する.3、IHTML Document 2::QueryInterface()IPersistStreamInitインタフェースポインタを得る;4、IPersistStreamInit::InitNew()インタフェースオブジェクトを初期化する;5、IPersistStreamInit::Load()メモリに搭載されたHTMLデータストリーム(IStream*);     メモリポインタをストリームに変換する方法は、次のとおりです.   I、   GlobalAlloc()申請メモリ;     II、  上記のメモリにHTML文字列の内容をコピーする.     III、CreateStreamFromHGlobal()メモリをIStreamポインタに変換する;原理コードは次のとおりです.
 //          m_ie.Navigate2( &CComVariant(_T("about:blank")),NULL,NULL,NULL,NULL); //    IHTMLDocument2    CComPtr< IDispatch > spDoc(m_ie.GetDocument()); //    IPersistStreamInit    CComQIPtr< IPersistStreamInit, &IID_IPersistStreamInit > spPSI( spDoc ); //     ,   HTML     LPTSTR lpMem = (LPTSTR)::GlobalAlloc( GPTR, ::lstrlen( lpHtml )+1 ); lstrcpy( lpMem, "xxx xxx" ); //            CComPtr< IStream > spStream; CreateStreamOnHGlobal( lpMem, TRUE, &spStream ); //     ,     spPSI->InitNew(); spPSI->Load( spStream ); 

  図1、IEコントロールはメモリの中のHTMLファイル図2、HTMLダイアログウィンドウIEがサポートできるデータ転送プロトコルを表示し、皆さんがよく知っているhttp、ftp、fileのほかに......もう一つのプロトコルはresで、それは表示ファイルの中のHTMLリソースを閲覧することを表す.IEのアドレスバーに「res://ファイル名/リソース名」というフォーマットのURLを直接入力できます.HTMLファイルをプログラムリソースに追加する方法は簡単ですが、リソースカードで右クリックしてメニューをポップアップし、Import…(導入)を実行し、指定したHTMLファイルを選択して、リソース名を1つあげればいいです.(ここでは、最も便利なリソース名は文字列がいいですが、整数IDを使うと、将来使うときにはres://ファイル名/#101というフォーマットになります.ここで101がリソースのID番号だと仮定します.面倒くさい!私はあまり好きではありません.)画像ファイルなど他の添付ファイルについては、リソースRCファイルを手作業で編集する必要があります(IDE環境で導入すると、テキストで2進数ファイルを開こうとしますが、多くの場合「ハングアップ」します).次の図は、事例プログラムがリソースを導入した後のスタイルです.図3、HTMLリソースの導入による手動でRCファイルを編集する部分は、次のとおりです.
...... ///////////////////////////////////////////////////////////////////////////// // // HTML // HTML_TOWORD       HTML  DISCARDABLE   "res\\ToWord.htm" //     HTML  ,     HTML_DLG        HTML  DISCARDABLE   "res\\html_dlg.htm" ~SEND_R1_C1.GIF     HTML  DISCARDABLE   "res\\~Send_r1_c1.gif" //     GIF  ,       ~SEND_R1_C2.GIF     HTML  DISCARDABLE   "res\\~Send_r1_c2.gif" LOGO.GIF        HTML  DISCARDABLE   "res\\Logo.gif" SEND_R1_C1.GIF     HTML  DISCARDABLE   "res\\Send_r1_c1.gif" SEND_R1_C2.GIF     HTML  DISCARDABLE   "res\\Send_r1_c2.gif" SPACER.GIF       HTML  DISCARDABLE   "res\\spacer.gif" #endif  // Chinese (P.R.C.) resources ///////////////////////////////////////////////////////////////////////////// ......

二、シールドIEコントロールのコンテキストメニューシールドまたはカスタムIEコントロールのコンテキストメニューは、実はIDocHostUIHandlerインタフェースにおけるShowContextMenu方法を実現する必要がある.ATLを使用してプログラムを作成する場合、実現は比較的簡単だと思う(私がATLを使用してCOMを書くのはMFCより熟知している要素かもしれない).事例プログラムはMFCで書かれているので、本当に目がくらくらして、箱をひっくり返してやっとマイクロソフトが書いたプレゼンテーションコードを見つけたので、私は直接コピーして使いました.(言い換えれば、読者がこのコードを読んでいる間に、問題があったら私に聞かないでください.マイクロソフトに直接電話して聞いてください.)三、拡張HTMLスクリプトのexternalオブジェクトCCmdTargetから自動化オブジェクトが派生する(C++クラスを新規作成する場合は、Automationの選択を忘れないように注意).このクラスではClassWizardのAutomationカードを使用して、カスタムのメソッドと属性を追加できます.HTMLのスクリプトプログラムでは、window.externalを使用して呼び出すことができます.このメソッドで、HTMLスクリプト機能の拡張を実現しました.HTMLスクリプトと自動化オブジェクトとの関係を確立するには、IDocHostUIHandler::GetExternal()メソッド.四、HTMLスタイルのダイアログウィンドウを表示することが本稿の重点である.ユーザーのインタフェース設計はいくつかの発展段階を経験した.最初のプログラム設計は、ユーザーインタフェースがないと言える.それから、ユーザーと対話する簡単な境界面(コンソールインタフェース、全画面テキストインタフェース)を発展させる.;それからグラフィックインターフェースを発展させた.実は私たちの現在のビジネスプログラム設計では、インターフェースの処理コードが大きな紙面を占めている.インターフェースの処理を簡単で、汎用的で、修正・メンテナンスしやすいように、人々は多くのインターフェースライブラリを作った.正直に言うと、多くのインターフェースライブラリはパッケージが悪いため、一つは柔軟ではなく、二つは常に修正が必要であるその内部のBUG、再利用の効果は理想的ではありません.共通のスキンケアソフトでも標準的なウィンドウクラスを肌美化するしかありません.カスタマイズされたウィンドウクラスには自分でフックを書く必要があります.咳......今、私たちはすでに非常に良い方法でインタフェースを設計しています.それはHTMLを使うことです.(Visual Studio.netを使っているプログラマーは、きっと.netのインタフェースが気に入っているのではないでしょうか?!.net開発環境で、HTML方式を使っているインタフェースはどこにでもあります).完全に本場のローカルソフトウェア(B/Sソフトウェアではありません)でも、ローカルASP方式、HTA方式でプログラム設計を行うこともできます.ソフトウェアユーザーはこのようなプログラムが大好きです.彼はとっくにブラウザの操作を熟知して掌握しているからです.また、プログラマーにとっても、このような方式が大好きです.肌を変えることはできないので、ユーザーとは異なるインタフェースの特化に頭を悩ませています.マイクロソフトは次世代のプログラムを設置しますユーザーインタフェースを記述するためにXMLを使用します.この設計方式はあなた、私のようなプログラマーを解放し、私たちの仕事量をすべて美工師のところに変換します:)vckbaseのプラットフォームを借りて、今みんなに呼びかけて、できるだけ早くHTML、XMLの設計と足本のプログラミングを勉強して掌握して、そしてそれらとC++オブジェクトのインタラクションを熟練してプログラミングすることができます.ここ2、3年の間に、このようなレベルのプログラマーは、きっと人気者になるでしょう.へへへ……次は、HTMLダイアログウィンドウをどのように表示するか、私たちの将来のソフトウェア方式のプログラミングを始めましょう.MSHTML.DLLの関数ShowHTML Dialog(Ex)を呼び出して、HTMLダイアログウィンドウの表示とデータのインタラクションを完了します.この関数の声明は、
HRESULT ShowHTMLDialogEx(       HWND hwndParent,   IMoniker *pMk,   DWORD dwDialogFlags,   VARIANT *pvarArgIn,   WCHAR *pchOptions,   VARIANT *pvarArgOut );

hwndParent
ダイアログウィンドウの親ウィンドウハンドル
これは簡単すぎて、くどくどしない.
pMk
URLの名前付きインタフェースポインタ
ダイアログウィンドウにどのURLが表示されるかを示すページです.ただし、簡単なURL文字列では提供されません.moniker(名前付き)インタフェースポインタを使用しています.URLに基づいてIMoniker*を得るのは簡単で、CreateURLMoniker()を呼び出します.唯一注意したいのは、この関数はUrlmon.libに接続する必要があります ライブラリ.
dwDialogFlags
ダイアログウィンドウのタイプ
HTML DLG_NOUI、HTML DLG_MODAL、HTML DLG_MODELESS、HTML DLG_PRINT_TEMPLATE、HTML DLG_VERIFYを組み合わせることができます.例示的なプログラムは、モードダイアログウィンドウを使用します.HTML DLG_NOUIは、次の節で説明します.
pvarArgIn
ダイアログウィンドウの入力パラメータ
Windows.dialogArgumentsを使用してダイアログウィンドウに入力されるVARIANT変数です.
pchOptions
ダイアログウィンドウスタイル
文字列で表示されるダイアログウィンドウのスタイル.IHTML Window 2::showModalDialog()関数を参照してください.たとえば、「dialogHeight:100 px dialogWidth:200 px」は200ポイント幅、100ポイント高さを表します.プログラムで指定したくない場合は、HTMLでで説明することもできます.
pvarArgOut
ダイアログウィンドウ出力パラメータ
ダイアログウィンドウのVARIANTは値を返し、ダイアログウィンドウスクリプトではwindow.returnValueを使用して値を割り当てることができます.
この関数はvc.netのヘッダファイルに完全な宣言があります.vc 6.0を使用する場合は、関数宣言、関数ポインタ定義、定数を手動で追加する必要があります.幸いなことに、本明細書のサンプルプログラムはVC 6で作成され、デバッグされています.コードをダウンロードした後、ソースファイルと注釈をよく読んでください.五、HTMLスクリプトの調整についてスクリプトの方法で、私はvckbaseでいくつかの文章を発表しました(私がなぜスクリプトに興味を持っているのか分かりません).ShowHTML DialogEx()関数では、タイプパラメータがHTML DLG_NOUIを与えている場合は、実際にダイアログウィンドウを表示するのではなく、指定されたHTMLをロードしてスクリプトを実行することを示します.サンプルプログラムのこのスクリプトでは、一連の動作を実行し、前のHTMLダイアログウィンドウでユーザーが入力したテキストをMS WORDに送信することを完了します.すべての機能について説明します.次に、スクリプトと注釈を友人に示します.
 On Error Resume Next Set wordapp=CreateObject("Word.Application") ''''   MS WORD if err<>0 then MsgBox("     MS WORD") else wordapp.visible = true ''''  WORD   wordapp.Documents.Add "",false, 0 ''''        wordapp.Selection.TypeText window.dialogArguments ''''          end if window.close ''''    

六、终わったらよく勉强して、毎日向上します.合格した社会主义コンピュータソフトウェア事业の后継者になります.へへへ......