熊「標準のより重い戻るボタンを実装する」


戻るボタンの履歴を取得する

先回は、ITravelLogStgを取得して、使いやすい場所にセットするところまでやりました
今回はそれを使って、IEの履歴を取得して、メニューに出して、
でもって、クリックしたらその履歴に遷移するみたいなことをします

実装後の動きはこんな感じ

キャプチャ

熊「なんか・・・割とまともだな」


なぜ、残念そうに言う?


履歴の取得方法

履歴を取得するには、
1. ITravelLogStgEnumEntries を使って、
2. IEnumTravelLogEntry (履歴の一覧みたいなもの)を取得して、それを Next で回して、
     ITravelLogEntry を取得して、そこから GetTitleGetURL します。

・・・えーと、ソースで説明しますか


1, ITravelLogStg → IEnumTravelLogEntry

適当に書いた、引数から IEnumTravelLogEntry を返す処理です
戻るボタンと進むボタンがあるので、戻るだったら TLEF_RELATIVE_BACK を、
進むだったら TLEF_RELATIVE_BACKを、EnumEntries の引数に指定します

//ITravelLogStg から IEnumTravelLogEntryを取ってくる関数 CComPtr<IEnumTravelLogEntry> GetEnumTravelLogEntry ( int iBtnID, CComPtr<ITravelLogStg> spTravelLogStg )
{
    CComPtr<IEnumTravelLogEntry> spEnumTLEntry;

    //戻る、進むボタンのフラグわけ
    int tlefRelative = iBtnID == ID_IE_GO_BACK ? TLEF_RELATIVE_BACK : TLEF_RELATIVE_FORE;

    //TravelLogの取得
    if ( FAILED ( spTravelLogStg->EnumEntries ( tlefRelative, &spEnumTLEntry ) ) )
        return 0;

    return spEnumTLEntry;
}

この処理の詳しい説明は、こちら
http://msdn.microsoft.com/en-us/library/aa768470(VS.85).aspx

熊「お、それはアカシックレコードのURLだな」


いえ、残念ながらそんな大層なものではありません


1, IEnumTravelLogEntry → ITravelLogEntry

次はIEnumTravelLogEntryをNextでぶん回して、ITravelLogEntryを取得します
ITravelLogEntryから、URLとタイトルが取得できます
こんな感じです

CComPtr<ITravelLogEntry> spTLEntry;
while( S_FALSE != spEnumTLEntry->Next(1, &spTLEntry, NULL) )
{
    LPWSTR szTitle, szUrl;
    spTLEntry->GetTitle ( &szTitle );
    spTLEntry->GetURL ( &szUrl );
    spTLEntry.Release ( );

}

最後の方でReleaseしてるのは、CComPtr は今回みたく参照先に別の代入すると、
正しく解放されないらしいので

これで szTitle に履歴のタイトルが、szUrl にURLが入ります
履歴は50件くらいまで出してみましたが、なんか制限無く出るっぽい気がしました
なので、メニューに出す時は、何件までとか制限かけた方がいいかも

詳しい話は、この辺で
http://msdn.microsoft.com/en-us/library/aa768481%28VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/aa768475%28VS.85%29.aspx

熊「お、それは光輝の書のURLだな?」


だからそんな大層なものじゃなりません
あと、マニアック過ぎる発言はご遠慮ください


というわけで、ソース

改修したソースはこんな感じです
新しくCTravelLogUtilsなるクラスを作って、そこで履歴の操作をしてます

後はヘッダに戻るメニュー用と進むメニュー用の関数を追加

const.h
  定数ファイルに、COMMAND_RANGE_HANDLERで指定する用のIDの範囲を規定

ToolbarButtonCtrl.h
  メニューをクリアする関数を追加(戻る進むのメニュー毎回クリアする為)

ToolbarButtonCtrl.cpp
  メニューをクリアする関数の実装

ToolbarWindow.h
戻るメニューと進むメニュー用の関数を用意する

ToolbarWindow.cpp
戻るメニューと進むメニュー用の動作を用意する
あと、戻ると進むのドロップダウン時にメニューを用意する


熊「さて、1万文字のタイトルのページを用意・・・」


エラー処理付ける前にそういうことをしてはいけません


HOME    次へ


コメントスペース