VC++6 & 非MFC で作成しています。
IE4 とかで使用されているレバーコントロールについてなのですが、
作成方法などはわかったのですが、終了時に状態を保存して、再度開く時に
前回の状態に戻す方法がわかりません。
どなたか御存知の方がいましたら教えてください。
よろしくおねがいします。
>IE4 とかで使用されているレバーコントロールについてなのですが、
おそらくスライダーコントロール(トラックバー)の事だと思いますので
http://www.kumei.ne.jp/c_lang/sdk2/sdk_190.htm
ここを参照してみてください。
>作成方法などはわかったのですが、終了時に状態を保存して、再度開く時に
>前回の状態に戻す方法がわかりません。
終了時にTBM_GETPOSで取得して、
設定ファイル or レジストリ or どこかのファイル に保存して
起動時にTBM_SETPOSで戻してあげれば良いのでは、ないでしょうか?
早速の御回答ありがとうございます
> おそらくスライダーコントロール(トラックバー)の事だと思いますので
ちょっとちがいますね。こっちのうほうです。
http://www.kumei.ne.jp/c_lang/sdk2/sdk_182.htm
作成方法はこちらのページを参考にさせていただいたのですが、
保存、再現方法が載っていないもので...
MSDN も見てみたのですが、いまいち分かりませんでした。
よろしくおねがいします。
どうでも良いことですが・・・
これってレバーではなくて、リバーって呼びませんでしたっけ?
終了時
RB_GETBARINFO
RB_GETBANDINFO
RB_GETBANDCOUNT
RB_GET.....
起動時
RB_INSERTBAND
RB_SETBARINFO
RB_SETBANDINFO
RB_SET.....
試してませんが
この辺りのメッセージで出来そうです。
色々試行錯誤した挙句うまくいきました。
[終了時]
char iniSection[50];
REBARBANDINFO bandInfo;
ZeroMemory(&bandInfo, sizeof(bandInfo));
bandInfo.cbSize = sizeof(bandInfo);
bandInfo.fMask = RBBIM_ID | RBBIM_SIZE | RBBIM_STYLE;
int barcnt = SendMessage(wprop->hRebar, RB_GETBANDCOUNT, 0, 0);
for(int i = 0; i < barcnt; i++){
sprintf(iniSection, INISECTION_BAR, i);
SendMessage(hRebar, RB_GETBANDINFO, (WPARAM)(UINT)i
, (LPARAM)(LPREBARBANDINFO)&bandInfo);
// wID, cx, fStyle を ini ファイルに保存する
MyWriteProfileInt(iniSection, ID, bandInfo.wID);
MyWriteProfileInt(iniSection, CX, bandInfo.cx);
MyWriteProfileInt(iniSection, FL_BREAK, (bandInfo.fStyle & RBBS_BREAK) ?
1 : 0);
MyWriteProfileInt(iniSection, FL_HIDDEN, (bandInfo.fStyle &
RBBS_HIDDEN) ? 1 : 0);
}
[起動時]
int i;
char iniSection[50];
// CreateToolbarx はバンド内のツールバーを作成する関数
HWND (*hwndproc[])(HWND) = {CreateToolbar1, CreateToolbar2};
REBARBANDINFO rbBand;
ZeroMemory(&rbBand, sizeof(REBARBANDINFO));
rbBand.cbSize = sizeof(REBARBANDINFO);
rbBand.fMask = RBBIM_ID | RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE |
RBBIM_SIZE;
rbBand.cxMinChild = 0;
rbBand.cyMinChild = 25;
for(i = 0; i < NUM_TOOL; i++){
sprintf(iniSection, INISECTION_BAR, i);
rbBand.wID = SZC_GetProfileInt(iniSection, ID, 9999);
rbBand.cx = SZC_GetProfileInt(iniSection, CX, 100);
rbBand.fStyle = RBBS_CHILDEDGE;
if(SZC_GetProfileInt(iniSection, FL_BREAK, 0)) rbBand.fStyle |=
RBBS_BREAK;
if(SZC_GetProfileInt(iniSection, FL_HIDDEN, 0)) rbBand.fStyle |=
RBBS_HIDDEN;
rbBand.hwndChild = hwndproc[rbBand.wID](hRebar);
SendMessage(wprop->hRebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);
}
のようにしたらうまくいきました。
バンドを wID 順で描画しようとしていたので、難しく考えていましたが、インデックス順に描
画していけば案外簡単に実装することができました。
実際には、ini ファイルに値がないときの処理や不正な値が登録されていたときの処理が必要
ですが、ひとまず解決です。
どうもありがとうございました。