レバーコントロールの状態を保存したい

[戻る]
OHKUBO 2002/03/12(火) 15:14:00
VC++6 & 非MFC で作成しています。
IE4 とかで使用されているレバーコントロールについてなのですが、
作成方法などはわかったのですが、終了時に状態を保存して、再度開く時に
前回の状態に戻す方法がわかりません。
どなたか御存知の方がいましたら教えてください。

よろしくおねがいします。

不良PG 2002/03/12(火) 15:30:20
>IE4 とかで使用されているレバーコントロールについてなのですが、
おそらくスライダーコントロール(トラックバー)の事だと思いますので

http://www.kumei.ne.jp/c_lang/sdk2/sdk_190.htm

ここを参照してみてください。

>作成方法などはわかったのですが、終了時に状態を保存して、再度開く時に
>前回の状態に戻す方法がわかりません。

終了時にTBM_GETPOSで取得して、

設定ファイル or レジストリ or どこかのファイル に保存して

起動時にTBM_SETPOSで戻してあげれば良いのでは、ないでしょうか?

OHKUBO 2002/03/12(火) 15:48:05
早速の御回答ありがとうございます

> おそらくスライダーコントロール(トラックバー)の事だと思いますので

ちょっとちがいますね。こっちのうほうです。
http://www.kumei.ne.jp/c_lang/sdk2/sdk_182.htm

作成方法はこちらのページを参考にさせていただいたのですが、
保存、再現方法が載っていないもので...
MSDN も見てみたのですが、いまいち分かりませんでした。

よろしくおねがいします。

不良PG 2002/03/12(火) 16:21:47
どうでも良いことですが・・・
これってレバーではなくて、リバーって呼びませんでしたっけ?

終了時
RB_GETBARINFO
RB_GETBANDINFO
RB_GETBANDCOUNT
RB_GET.....

起動時
RB_INSERTBAND
RB_SETBARINFO
RB_SETBANDINFO
RB_SET.....

試してませんが

この辺りのメッセージで出来そうです。

OHKUBO 2002/03/13(水) 22:52:30
[[解決]]
色々試行錯誤した挙句うまくいきました。

[終了時]
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 ファイルに値がないときの処理や不正な値が登録されていたときの処理が必要
ですが、ひとまず解決です。
どうもありがとうございました。

古いスレッドには追加発言できません。