MFC   VC++   Visual Studio   Visual Studio   プログラミング

CHtmlViewのスクロールバー

 CHtmlViewはCView→CScrollView→CFormViewからの派生クラスで、WebBrowserコントロールの機能を提供するもので、WEBページに関する処理をする場合に便利なクラスです。

 しかし、実際に色々な処理をするにはMSHTMLやDOMを使わないといけなくて、結構面倒だったりします。
 そこで、今回は、スクロールバーを操作する方法を紹介したいと思います。

 このクラスは、CFormViewからの派生クラスなので、簡単にスクロールバーを操作出来そうな気がしますが、実際にWEBページが表示された時に見えているスクロールバーは、CHtmlViewのものではなくWebBrowserコントロールのものなので、操作や処理などが面倒なのです。

 といっても、わかってしまえば比較的楽で、下向きへスクロールさせるには以下のようになります。
    MSHTML::IHTMLDocument2Ptr pHtmlDoc = GetHtmlDocument();
    IDispatchPtr pDisp = pHtmlDoc->GetScript();
    MSHTML::IHTMLWindow2Ptr pWindow2 = pDisp;
    pWwindow2->scrollBy(0, 50);
 ※注: このコードではエラー処理などを入れていないので、実際に使う場合はきちんとチェックをしてください。
 このコードを見てわかるかもしれませんが、スクロールさせるのにWEBページに対してスクリプトを使っています。
 なので、ブラウザの設定でスクリプトを禁止していると動作しないかもしれません。(未確認)

 コードの説明については、それ程書くことはないのですが、「scrollBy」のところは、「scroll」や「scrollTo」などもあるので、用途によって使い分けて下さい。

 ここで、上記のコードを実行させるにあたり、現在位置の取得やスクロールできる範囲などを取得したい場合があると思います。
 その場合は、以下のようにして各値を取得出来ます。
    MSHTML::DispHTMLBodyPtr pBody = pHtmlDoc->body;
    pBody->scrollTop;    // 現在位置
    pBody->scrollHeight;    // スクロール範囲の高さ
    pBody->clientHeight;    // クライアント領域の高さ
 このように、スクロールバーの現在位置やスクロール範囲、クライアント領域の高さや幅、left座標、top座標など、いろいろ取得できます。
 例えば、下方向にスクロールさせる場合に、
    if(pBody.scrollTop < pBody.scrollHeight - pBody.clientHeight)
 としておけば、スクロールできる場合にのみ、処理をさせることが出来ます。
ランキングへ     posted by 遠雷 | Comment(0) | ビュー

ビューのツールバーラージアイコン

 Visual Studio 2008 sp1で、ビューやドッキングウインドウに「CMFCToolBar」を取り付けたとき、
カスタマイズからツールバーアイコンを「大きいアイコン」にすると、メインツールバーだけでなくこれらのアイコンも大きくなってしまう。
 そこで、ビューやドッキングウインドウのアイコンは大きくしないようにする方法を紹介します。

 やり方は非常に簡単で、「CMFCToolBar」のメンバ変数「m_bLargeIconsAreEnbaled」を「FALSE」にするだけです。
 ただし、このメンバ変数は「protected」属性なので、作成先では変更出来ない。
 そこで、「CMFCToolBar」を派生させ、そこの「PreSubclassWindow」などで変更するようにします。

 恐らく、ビューやドッキングウインドウに「CMFCToolBar」を使う場合、派生クラスを作りコマンドの処理やカスタマイズさせないようにしたりすると思うので、そこで、
    virtual void PreSubclassWindow() { m_bLargeIconsAreEnbaled = FALSE; }
とすれば常に小さいアイコンで表示されるようになります。
ランキングへ     posted by 遠雷 | Comment(0) | ビュー

ビューのツールバー/ステータスバー

 ビューにツールバーとステータスバーを作成し、ツールバーボタンにカーソルを合わせた時、ステータスバーに説明を表示させる方法。

 WindowProcをオーバーライドし、そこに表示する処理を書く。
LRESULT CXXXView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    if(message == WM_SETMESSAGESTRING)
    {
        CString str;
        if(str.LoadString(wParam))        // 「wParam」にツールバーボタンのコマンドIDが入っている。
        {
            int iFnd = str.Find('\n');    // ツールチップ用とステータスバー用と分ける。
            if(iFnd != -1)
                str = str.Left(iFnd);
            m_wndStatusBar.SetPaneText(0, str);
// ここの"0"は、ステータスバーの表示したい位置を指定する。
        }
    }

    return CView::WindowProc(message, wParam, lParam);
}
 ここで、メインフレームのように、普段「レディ」と表示され、ツールバーボタンにカーソルが乗った時だけ説明が表示されるようにするには、リソースの「String Table」内の該当IDに表示させたい文字(レディとか)を設定しておけばいい。

 ビューのステータスバーではなく、メインフレームのステータスバーに説明を表示させたい場合は、メッセージをそのままメインウインドウへ送ればよい。
LRESULT CXXXView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    if(message == WM_SETMESSAGESTRING)
        theApp.m_pMainWnd->SendMessage(message, wParam, lParam);

    return CView::WindowProc(message, wParam, lParam);
}
 これで後は、メインフレームの方で勝手にやってくれる。
ランキングへ     posted by 遠雷 | Comment(0) | ビュー