「標準のより重い戻るボタンを実装する」
戻るボタンの履歴を取得する
先回は、ITravelLogStgを取得して、使いやすい場所にセットするところまでやりました
今回はそれを使って、IEの履歴を取得して、メニューに出して、
でもって、クリックしたらその履歴に遷移するみたいなことをします
実装後の動きはこんな感じ
「なんか・・・割とまともだな」
なぜ、残念そうに言う?
履歴の取得方法
履歴を取得するには、
1. ITravelLogStg の EnumEntries を使って、
2. IEnumTravelLogEntry (履歴の一覧みたいなもの)を取得して、それを Next で回して、
ITravelLogEntry を取得して、そこから GetTitle や GetURL します。
・・・えーと、ソースで説明しますか
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万文字のタイトルのページを用意・・・」
エラー処理付ける前にそういうことをしてはいけません
コメントスペース