MSHTML Reference 及相关HTML的操作

from:http://up-beat.pos.to/linux/cdiary.cgi?year=2005&mon=4&no=7

 

INDEX UP-BEAT

Visual C++ 日々の泡(仮)
4月26日


『IE コンポーネント』(11)

- CHtmlView関連(COM) -

=================================================================================================

[ THE CODE PROJECT ] CHtmlViews Search でお勉強(第10回)

=================================================================================================


12.MSHTML はここで調べる







4月21日


『IE コンポーネント』(10)

- CHtmlView関連(COM) -

=================================================================================================

[ THE CODE PROJECT ] CHtmlViews Search でお勉強(第9回)

=================================================================================================


11.スマートポインタ(Smart Pointer) って何だ?





[1]こんなんらしい・・

どうも,奥は深そうだけど「IE コンポーネント」関連で考えてみると

『ポインタの扱いを簡単にしてくれるテンプレート』らしい・・

 下記の例を見ればわかるように[IHTMLDocument2]インターフェース(ポインタ)を取得するのに

 QueryInterface(インターフェイスを問い合わせ)
 ASSERT    (引数を評価)
  |
  |
 Release    (解放)

なんて,だらだらとめんどくさい。これを簡単にしてくれる。

[2]使い方

 #import "mshtml.tlb" を記入

[3]注意(その1)

 現象 :ビルドすると「WARNING」がでる
 理由 :既存の定義をmshtml.tlbで上書きしているため
 対策1:プロジェクト⇒設定⇒C/C++の警告レベルを2に設定する
 対策2:WARNINGの出ていた項目をすべて以下のように列挙

     #import "mshtml.tlb" exclude("_FINDTEXT_FLAGS", / "wireHDC", ・・・・・・・ "IEnumUnknown")

 対策3:#pragma warning(disable : 4192)
     #pragma warning(disable : 4146)
     #import "mshtml.tlb"
     #pragma warning(default : 4146)
     #pragma warning(default : 4192)

 対策1~3のうち1つでいい! 対策3が簡単かな?

[4]注意(その2)

 IHTMLElement2のヘルプ
 Minimum availability Internet Explorer 5(「IE5以降が必須です」:動作条件)




参照:[MSDN MSHTML Reference [Interfaces and Scripting Objects ]



--------------------------------------------------------------------------------

// ---- <IHTMLDocument2 インターフェイスを取得> ----

IHTMLDocument2 *lpHtmlDocument = NULL;
LPDISPATCH lpDispatch = NULL;
lpDispatch = GetHtmlDocument();
ASSERT(lpDispatch);

lpDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&lpHtmlDocument);
ASSERT(lpHtmlDocument);

lpDispatch->Release();


        |

        |


lpHtmlDocument->Release();

--------------------------------------------------------------------------------
              ↓
--------------------------------------------------------------------------------

// ---- <IHTMLDocument2 インターフェイスを取得> ----

MSHTML::IHTMLDocument2Ptr lpHtmlDocument(GetHtmlDocument());

--------------------------------------------------------------------------------


--------------------------------------------------------------------------------

// ---- <IHTMLTxtRange インターフェイスを取得> ----

//  LPDISPATCH → IHTMLDocument2 → IHTMLElement → IHTMLBodyElement → IHTMLTxtRange

  MSHTML::IHTMLDocument2Ptr pHtmlDoc(GetHtmlDocument());

  MSHTML::IHTMLElementPtr lpBodyElm;
  pHtmlDoc->get_body(&lpBodyElm);

  IHTMLBodyElementPtr lpBody = lpBodyElm;

  IHTMLTxtRangePtr lpTxtRange;
  lpBody->createTextRange(&lpTxtRange);

--------------------------------------------------------------------------------


[応用その1]
----------------------------------------------------------------------------------------------------
// テキストボックス内に文字を入力  <INPUT maxLength=256 size=55 name=q> 注:全角<>

MSHTML::IHTMLDocument2Ptr pHtmlDoc(GetHtmlDocument());
MSHTML::IHTMLElementCollectionPtr pElements( pHtmlDoc->Getall() );
MSHTML::IHTMLInputTextElementPtr input = pElements->item("q");

CString c_input_text = "ABCDEFG";
CComBSTR b_input_text(c_input_text.GetLength()+1,(LPCTSTR)c_input_text);
input-> put_value(b_input_text);
----------------------------------------------------------------------------------------------------


[応用その2]
----------------------------------------------------------------------------------------------------
// テキストボックス内の文字取得  <INPUT maxLength=256 size=55 name=q> 注:全角<>

MSHTML::IHTMLDocument2Ptr pHtmlDoc(GetHtmlDocument());
MSHTML::IHTMLElementCollectionPtr pElements( pHtmlDoc->Getall() );
MSHTML::IHTMLInputTextElementPtr input = pElements->item("q");

// 表示する
MessageBox(input->value);
----------------------------------------------------------------------------------------------------


[応用その3]
----------------------------------------------------------------------------------------------------
// ボタンを押す  <INPUT type=submit value="Google 検索" name=btnG> 注:全角<>


MSHTML::IHTMLDocument2Ptr pHtmlDoc(GetHtmlDocument());
MSHTML::IHTMLElementCollectionPtr pElements( pHtmlDoc->Getall() );

// 全てのエレメントをチェック
for (long i = 0; i < pElements->Getlength(); i++)
{
MSHTML::IHTMLInputButtonElementPtr pButton( pElements->item(i) );
if (!(bool)pButton)
{
continue; // ボタンがなかったら for に飛ぶ
}

// 登録ボタン発見

ASSERT(pButton->Gettype() == _bstr_t(L"submit"));
ASSERT(pButton->Getvalue() == _bstr_t(L"Google 検索"));

MSHTML::IHTMLElementPtr pElement(pButton);
pElement->click(); // ボタンをクリック
break;
}
----------------------------------------------------------------------------------------------------



4月19日


『IE コンポーネント』(9)

- CHtmlView関連(COM) -

=================================================================================================

[ THE CODE PROJECT ] CHtmlViews Search でお勉強(第8回)

=================================================================================================


10.IHTMLElement って何だ?

参照:[MSDN]
--------------------------------------------------------------------------------



--------------------------------------------------------------------------------

--------------------------------------------------------------------------------













4月17日


『IE コンポーネント』(8)

- CHtmlView関連(COM) -

=================================================================================================

[ THE CODE PROJECT ] CHtmlViews Search でお勉強(第7回)

=================================================================================================


9.IHTMLTxtRange って何だ?

参照:[MSDN]
--------------------------------------------------------------------------------





--------------------------------------------------------------------------------

--------------------------------------------------------------------------------






4月16日


『IE コンポーネント』(7)

- CHtmlView関連(COM) -

=================================================================================================

[ THE CODE PROJECT ] CHtmlViews Search でお勉強(第6回)

=================================================================================================


8.超難解COM(Component Object Model)インターフェース


参照:[MSDN]
--------------------------------------------------------------------------------
COM の概要

1.COM は、ActiveX コントロールと OLE の基盤となる "オブジェクト モデル" です。
2.COM を使用すると、オブジェクトの機能をほかのコンポーネントやホスト アプリケーションに公開できます。
3.COM では、オブジェクト自身を公開する方法と、この公開によるプロセス間 およびネットワーク間での
 オブジェクトの動作方法を定義しています。
 また、オブジェクトの有効期間も定義しています。

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------
COM の概要

1.ActiveX コントロールとOLEに関係あるらしい。
2.「COMでEXCEL操作」なんてことができると言う有意味?
3.3つの定義
  ・オブジェクト自身を公開する方法
  ・動作方法を定義
  ・有効期間も定義

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------
COM には、次の 6 つの基本的な概念があります。

・インターフェイス — オブジェクトの機能を公開する機構。
・IUnknown — ほかのインターフェイスの基本となるインターフェイス。
 IUnknown は、COM で実行される参照カウント機構とインターフェイス照会機構を実装します。
・参照カウント — 不要になったオブジェクト (正確にはインターフェイス) を解放して削除するタイミングを決定するための技法。
・QueryInterface — オブジェクトに特定のインターフェイスを照会するために使用するメソッド。
・マーシャリング — 場所に関係なく、スレッド間、プロセス間、ネットワーク境界間でオブジェクトを使用するための機構。
・集約 — あるオブジェクトで別のオブジェクトを利用するための方法。

--------------------------------------------------------------------------------

■□■COMテクニック[01]■□■

[ IHTMLDocument2 インターフェイスを取得 ]



IUnknown COM   インターフェイスの基本となるインターフェイス
------------------------------------------------------------------------------------------
QueryInterface COM オブジェクトから指定したインターフェイスへのポインタを要求します。
Release     インターフェイス ポインタの使用を終える。
------------------------------------------------------------------------------------------
GetHtmlDocument アクティブドキュメントのIDispatch インターフェイスへのポインタを取得
------------------------------------------------------------------------------------------
ASSERT     アプリケーション内で予期せぬ結果が発生した場合にアプリケーションの実行を停止
------------------------------------------------------------------------------------------








■□■COMテクニック[02]■□■

[ 型変換 CString → CComBSTR  ]


--------------------------------------------------------------------------------
CComBSTR クラス

解説
CComBSTR クラスは、プリフィックスとして長さが付加された文字列 BSTR のラッパー クラスです。
この長さは、文字列内のデータの前のメモリ位置に整数として格納されます。

BSTR は、最後にカウントされた文字の後に NULL 文字が付加されて終了します。
ただし、文字列内に NULL 文字を埋め込むこともできます。
したがって、文字列の長さは、最初の NULL 文字で判断するのではなく、文字数によって判断します。

--------------------------------------------------------------------------------


BSTR型 - COMでの標準文字列型

 構造: 文字列の長さ + 文字列内容(UNICODE)

こんなイメージらしい! (使い分け)

MFC        - CString
ATL        - CComBSTR
COM クライアント - _bstr_t , _variant_t
標準 C++      - string



--------------------------------------------------------------------------------



--------------------------------------------------------------------------------
・型変換 CString c_str → CComBSTR cb_str
--------------------------------------------------------------------------------
  CComBSTR cb_str(c_str.GetLength()+1,(LPCTSTR)c_str);
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
・型変換 _bstr_t test_b → CString test_c
--------------------------------------------------------------------------------
  CString test_c = (char*)test_b
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
・型変換 CString c_test → CComBSTR cb_test
--------------------------------------------------------------------------------
  CString c_test((BSTR)cb_test);
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
・型変換 _variant_t v_test → CString c_test
--------------------------------------------------------------------------------
  CString c_test = (const char *)(_bstr_t)v_test ;
--------------------------------------------------------------------------------

--------------------------------------------------------------------------------
・型変換 VARIANT FAR* vf_test → CString c_test
--------------------------------------------------------------------------------
  CString c_test(vf_test->bstrVal);
--------------------------------------------------------------------------------





4月14日


『IE コンポーネント』(6)

- CHtmlView関連(COM) -

=================================================================================================

[ THE CODE PROJECT ] CHtmlViews Search でお勉強(第5回)

=================================================================================================


7.検索・置換の練習

--------------------------------------------------------------------------------
findText
--------------------------------------------------------------------------------

解説

ドキュメントの中でテキストを検索する。検索範囲の開始位置および終了位置を指定する。

構文 bFound = object.findText(sText [ , iSearchScope ] [ , iFlags])


sText
 検索したいテキストを指定する。

iSearchScope オプション
 検索する方向を示す整数。
 正の場合には開始位置から終了位置へ向かっての検索を行う。
 負の場合には逆方向に検索する。

iFlags オプション
 検索のタイプを指定するフラグで、次のいずれかまたは両方を指定できる。
 2 検索語の全体一致。
 4 大文字小文字の区別付き。
--------------------------------------------------------------------------------


--------------------------------------------------------------------------------
moveStart 範囲の始点を移動させることによって有効範囲を変更する。
moveEnd  範囲の終点を移動させることによって有効範囲を変更する。
--------------------------------------------------------------------------------

HRESULT moveStart(
  BSTR Unit,
  long Count,
  long *ActualCount
);


範囲の始点を移動させることによって有効範囲を変更する。

<Unit>
 移動する単位数を指定する文字列。以下の中の1つを指定する。

・[Character] 1つ以上の文字を移動する。
・[Word]   1つ以上の単語を移動する。
・[Sentence] 1つ以上の文を移動する。
・[Textedit] オリジナル範囲の最初または最後に移動する。

<Count>
 移動する単位数を指定する数値。正負の数値を指定できる。

<ActualCount>
 実際に移動した単位数を返す。



--------------------------------------------------------------------------------
search 正規表現検索に一致する、最初の部分文字列の位置を返します。
--------------------------------------------------------------------------------

--------------------------------------------------------------------------------
Select     コントロールをアクティブ
scrollIntoView オブジェクトをスクロールさせて表示させる。
         同時に、オブジェクトをウィンドウの上端または下端に合わせる。
--------------------------------------------------------------------------------




4月13日


『IE コンポーネント』(5)

- CHtmlView関連(COM) -

=================================================================================================

[ THE CODE PROJECT ] CHtmlViews Search でお勉強(第4回)

=================================================================================================


7.検索用3つメンバ関数の追加

[MainFrm.cpp]ファイルに追加
--------------------------------------------------------------------------------------

#include "stdafx.h"
#include "CHtmlView_Search.h"

#include "MainFrm.h"

// ==== ↓ 追加 ↓ ====
#include "CHtmlView_SearchDoc.h"
#include "CHtmlView_SearchView.h"
// ==== ↑ 追加 ↑ ====

--------------------------------------------------------------------------------------


[CHtmlView_SearchView.cppMainFrm.cpp]ファイルに追加
--------------------------------------------------------------------------------------

#include "stdafx.h"
#include "CHtmlView_Search.h"

#include "CHtmlView_SearchDoc.h"
#include "CHtmlView_SearchView.h"

// ==== ↓ 追加 ↓ ====
#include < Mshtml.h>
#include < atlbase.h>
// ==== ↑ 追加 ↑ ====


--------------------------------------------------------------------------------------

/
// CCHtmlView_SearchView クラスのメッセージ ハンドラ

void ClearSearchResults(CString searchID)

void FindText2(CString searchText, long lFlags /* =2 */, CString matchStyle, CString searchID)

void FindText(CString searchText, long lFlags /* =2 */, BOOL bNNF /* =FALSE (for internal use)*/)


--------------------------------------------------------------------------------------



[CHtmlView_SearchView.h]ファイルに追加
--------------------------------------------------------------------------------------

// インプリメンテーション
public:

void ClearSearchResults(CString searchID = "CHtmlView_Search");

void FindText2(CString searchText, long Flags = 2, CString matchStyle = "color: white; background-color: darkblue", CString searchID = "CHtmlView_Search");

void FindText(CString searchText, long Flags = 2, BOOL bNNF = FALSE /*for internal use*/)


--------------------------------------------------------------------------------------

ヘッダーファイルで引数の初期化をしているのか?

4月12日


『IE コンポーネント』(4)

- CHtmlView関連(COM) -

=================================================================================================

[ THE CODE PROJECT ] CHtmlViews Search でお勉強(第3回)

=================================================================================================


6.ダイアログバー上のコントロールを活性化

次のメンバ関数を追加


■ void CMainFrame::OnHall()

ClassWizardを使って

リソースエディタで「ダイアログバー」をクリック



↑ [クラスの追加]キャンセルを押す








■ void CMainFrame::OnSearch()


ClassWizardを使って作成することができないため,
直接コードを追加する

<その1>「メッセージ マップ」
MainFrm.cpp ファイルに追加




<その2>「メッセージ マップ」
MainFrm.h ファイルに追加






<その3>「メンバ関数」
MainFrm.cpp ファイルに追加





4月11日


『IE コンポーネント』(3)

- CHtmlView関連(COM) -

=================================================================================================

[ THE CODE PROJECT ] CHtmlViews Search でお勉強(第2回)

=================================================================================================


「CHtmlViews Search を作ってみる!」




1.MDIのスケルトンを作成

・ステップ 4/6 ツールバーの外見は「Internet Explorer の ReBar」を選択
・ステップ 4/6[詳細設定]ボタンを押す MDI子フレームのスタイル -[起動時に最大化]をチェック。
・ステップ 6/6 基本クラスは 「CHtmlView」 にする


2.コンボボックスを作成

●[resource.h] ファイル に追加する。(Dialog - IDR_MAINFRAME)
----------------------------------------------------------------------

//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by CHTMLVIEW_SEARCH.RC
//
#define IDD_ABOUTBOX 100
#define IDR_MAINFRAME 128
#define IDR_CHTMLVTYPE 129
// ==== ↓ 追加 ↓ ====
#define IDC_SEARCHCOMBO_PLACEHOLDER 1002
#define IDC_SEARCHCOMBO 1003
// ==== ↑ 追加 ↑ ====


// 次のデフォルト値は新規オブジェクト用の値です

----------------------------------------------------------------------

●クラスの新規作成
----------------------------------------------------------------------
 クラスの種類 MFCクラス
 クラス名 CSearchCombo
 ファイル名 SearchCombo
 基本クラス CComboBox
 ダイアログID IDR_MAINFRAME
----------------------------------------------------------------------
 

●メンバ変数を追加 CMainFrameクラス
----------------------------------------------------------------------

 変数タイプ CSearchCombo  変数名 m_wndSearchCombo (protected)

----------------------------------------------------------------------


●[MainFrm.cpp]ファイル
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)に追加
----------------------------------------------------------------------

TRACE0("Failed to create dialogbar/n");
return -1; // 作成に失敗
}

// ==== ↓ 追加 ↓ ====

CRect rect(50,3,250,200);
m_wndSearchCombo.Create(WS_VISIBLE|WS_CHILD|CBS_DROPDOWN|CBS_AUTOHSCROLL|WS_VSCROLL,rect,&m_wndDlgBar,IDC_SEARCHCOMBO);
m_wndSearchCombo.SetFont(m_wndDlgBar.GetFont());

// ==== ↑ 追加 ↑ ====


if (!m_wndReBar.Create(this) ||
!m_wndReBar.AddBar(&m_wndToolBar) ||
!m_wndReBar.AddBar(&m_wndDlgBar))

----------------------------------------------------------------------




3.リソースエディタを使い、Dialog-IDR_MAINFRAMEに追加・修正する。



キャプション ID  
     
  IDD_DIALOGBAR ダイアログバー
Search:   スタティクテキスト
Match whole word only  IDC_WORD チェックボックス
Highligt All       IDC_HALL   チェックボックス
Hightlight Color:   スタティクテキスト
  IDC_HCOLOR  エディットボックス
     


注意: コンボボックスは書かない!


4.Hightlight Color の初期化(入力を無効に)

[MainFrm.cpp]ファイル
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)の最後に追加
----------------------------------------------------------------------
// ==== ↓ 追加 ↓ ====

m_wndDlgBar.GetDlgItem(IDC_HCOLOR)->SetWindowText("darkblue");
m_wndDlgBar.GetDlgItem(IDC_HCOLOR)->EnableWindow(FALSE);
m_wndDlgBar.GetDlgItem(IDC_HCOL)->EnableWindow(FALSE);

// ==== ↑ 追加 ↑ ====


return 0;
----------------------------------------------------------------------

5.キー入力の取得

 ClassWizard で PreTranslateMessage(MSG* pMsg)









4月5日

=================================================================================================

Microsoft Visual C++ トラブル [ ClassViewからクラスが消えた場合 ] 

=================================================================================================


参照:http://forums.belution.com/ja/vc/000/199/68s.shtml

[現象]

ワークスペースの表示のClassViewタブからあるクラスのメンバー関数を削除
  ↓
クラスの表示がClassViewから消える
  ↓
ClassViewの表示を更新させる方法?
   


[対策]

消えてしまったクラスのヘッダファイルを「FileView」表示
  ↓
何んでもいいから編集すれば(スペースでも)
  ↓
クラス再出現!! 



4月3日


『ダイアログバー』(4)

- MDI にダイアログバーを追加[4] -

=================================================================================================

<Rebar>タクスバー上にコンボボックスをのせる!

=================================================================================================


1.
 MFC Appwizardを使用して,新規プログラムを作成するときに,
4/6ツールバーの外見で「Internet Explorer の ReBar」を選択すると,
ReBarが使えるようになる。













この後,ダイアログバーも短くする!

2.
 [ THE CODE PROJECT ]ではコードで書かれている!

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)の中に

CRect rect(50,3,250,200);
m_wndSearchCombo.Create(WS_VISIBLE|WS_CHILD|CBS_DROPDOWN|CBS_AUTOHSCROLL|WS_VSCROLL,rect,&m_wndDlgBar,IDC_SEARCHCOMBO);
m_wndSearchCombo.SetFont(m_wndDlgBar.GetFont());

これをすべて定義出来たか調べてみると

WS_VISIBLE     可視         OK
CBS_DROPDOWN    ドロップダウン    OK
CBS_AUTOHSCROLL  水平オートスクロール OK 
WS_VSCROLL     垂直スクロールバー  OK
rect        サイズと位置     OK
&m_wndDlgBar    メンバ変数      未定義
IDC_SEARCHCOMBO  ID          OK


ID IDC_SEARCHCOMBO  にメンバ変数 &m_wndDlgBar を

対応させなければならない !

   ↓
   ?




4月2日


『ダイアログバー』(4)

- MDI にダイアログバーを追加[3] -

=================================================================================================

<Rebar コントロールの作成>

=================================================================================================





参照:MSDNライブラリより

 Rebar オブジェクトには、各種の子ウィンドウを格納できます。通常、エディット ボックス、ツール バー、リスト ボックスなどほかのコントロールが使用されます。Rebar オブジェクトは、指定されたビットマップに子ウィンドウを表示できます。アプリケーションでは、Rebar のサイズを自動的に変更できます。ユーザーは、グリッパ バーをクリックまたはドラッグして、Rebar のサイズを手動で変更できます。

Rebar オブジェクトは、ツール バー オブジェクトに似ています。リバー内のバンドのサイズは、クリックとドラッグによって変更できます。Rebar コントロールには、バンドをいくつでも格納できます。バンドごとに、グリップ バー、ビットマップ、テキスト ラベル、子ウィンドウの任意の組み合わせを設定できます。ただし、バンドに収容できる子ウィンドウは 1 つだけです。


=================================================================================================

<MFC AppwizardによるReBar>

=================================================================================================


MFC Appwizardを使用して,新規プログラムを作成するときに,
4/6ツールバーの外見で「Internet Explorer の ReBar」を選択すると,
ReBarが使えるようになる。




 このときダイアログバーが追加される!






2005年12月
2005年11月
2005年10月
2005年9月
2005年5月
2005年4月
2005年3月
2004年12月
2003年11月
2003年9月
2003年8月
2003年7月
2003年5月
2003年4月
2003年1月
2002年12月
2002年11月
2002年10月
2002年9月
2002年8月
2002年7月

admin.

 

Produced by Cute Girls Interface

你可能感兴趣的:(HTML,reference,html,search,dropdown,input,microsoft)