スクロールバー

[戻る]
リク 2006/12/04(月) 01:36:55
*hVScrollbar = CreateWindow( 
        TEXT("SCROLLBAR"), TEXT(""), 
        WS_CHILD | WS_VISIBLE | SB_VERT | SBS_SIZEGRIP,
        620, 0, 20, 480,
        hWnd, NULL, (HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE), 
NULL
    );

    vscroll->cbSize = sizeof(SCROLLINFO);
    vscroll->fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
    vscroll->nMin = 0;
    vscroll->nMax = MAP_HEIGHT;
    vscroll->nPage = 1;

    SetScrollInfo(*hVScrollbar,SB_VERT,vscroll,TRUE);

CreateWindow関数でスクロールバーを設定したいんですが
なぜかスクロールバーが固定されずに動いたりします
これはどうしたらいいのでしょうか?

PATIO 2006/12/04(月) 15:59:14
どういう事をすると動くのかとか、
動くと言うのはどう動く事を言っているのかとか、
情報が足りないような気がします。
開発環境も明示されていないようなので
必要な情報を提示して質問するようにしてください。
必要な情報がどんな物か分からないときは、
追加発言の所にある「使用上の注意」のリンク先を参照してください。

リク 2006/12/04(月) 16:37:47
その部分は解決できました
あと問題なのがCreateWindow関数でスクロールバーをウィンドウの端に
付けたいのですがウィンドウのサイズが変更されるとスクロールバーも大きさに
あわせて変更したいのですがウィンドウのサイズを変更すると以前設置されていた
場所にもスクロールバーが残ってしまいます。
これを解決したいのですがどうしたらいいでしょうか?

環境はVisual C++ 2005が開発環境です


case WM_SIZE:
                        //コントロールのサイズを
調べる
            //ウィンドウのクライアントサイズを調べる
            GetClientRect(hWnd,&clientsize);
            //ツールバーのサイズを調べる
            GetClientRect(hToolbar,&toolsize);
            //ステータスバーのサイズを調べる
            GetClientRect(hStatasu,&statasusize);

                        //縦スクロールバーの設置
            setVScrollBar
(hWnd,&hVScrollbar,&vscroll,clientsize,toolsize,statasusize);


            /スクロールバーの設定
void setVScrollBar(HWND hWnd,HWND *hVScrollbar,SCROLLINFO *vscroll,RECT 
clientsize,RECT toolsize,RECT statasusize)
{
    //スクロールバーの始点座標
    int vscroll_posx = clientsize.right - 16;
    int vscroll_posy = clientsize.top + (toolsize.bottom - toolsize.top);

    //スクロールバーの縦のサイズ
    int vscroll_height = clientsize.bottom - (toolsize.bottom - 
toolsize.top + statasusize.bottom - statasusize.top); 

    *hVScrollbar = CreateWindow( 
        TEXT("SCROLLBAR"), TEXT(""), 
        WS_CHILD | WS_VISIBLE | SB_VERT,
        vscroll_posx, vscroll_posy, 16, vscroll_height,
        hWnd, NULL, (HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE), 
NULL
    );

    vscroll->cbSize = sizeof(SCROLLINFO);
    vscroll->fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
    vscroll->nMin = 0;
    vscroll->nMax = MAP_HEIGHT;
    vscroll->nPage = 1;

    SetScrollInfo(*hVScrollbar,SB_CTL,vscroll,TRUE);
}

Geo=TK3 2006/12/04(月) 18:47:40
VC++ 系列をご使用ならばプロジェクトの種類も書きましょ。
SDK で作ってるか、MFC を使っているか、Windows Form アプリケーションかで回答が違
ってきますし。

# 以下はコード片から SDK で作成しているものと推測しての記述です。
# 違った場合は無視してください。

>ウィンドウのサイズが変更されるとスクロールバーも大きさに
>あわせて変更したいのですがウィンドウのサイズを変更すると
>以前設置されていた場所にもスクロールバーが残ってしまいます。

提示のコード片では WM_SIZE がくる度にスクロールバーを CreateWindow で新しく作る
上、前に作成したスクロールバーを破棄してないので、当然そういう動作をします。
例えばスクロールバーの作成は WM_CREATE で行い、WM_SIZE の時はスクロールバーのサ
イズ変更だけ行うようにしてみたらいかがでしょう。

リク 2006/12/04(月) 19:51:31
 
このようにWM_CREATEのメッセージでスクロールを作成して
WM_SIZEでサイズの変更しているのですが
ウィンドウを大きくしても変化しません
何かおかしいのでしょうか?
SDKで作成してます
case WM_CREATE:
            InitCommonControls();

            
            //ウィンドウのクライアントサイズを調べる
            GetClientRect(hWnd,&clientsize);
            //ツールバーのサイズを調べる
            GetClientRect(hToolbar,&toolsize);
            //ステータスバーのサイズを調べる
            GetClientRect(hStatasu,&statasusize);

                    //縦スクロールバーの設置
            setVScrollBar
(hWnd,&hVScrollbar,&vscroll,clientsize,toolsize,statasusize);

                        return 0;
               case WM_SIZE:
                //ウィンドウの再描画処理
            
            SendMessage(hStatasu , WM_SIZE , wParam , lParam);
            SendMessage(hToolbar , WM_SIZE , wParam , lParam);
            SendMessage(hVScrollbar, WM_SIZE, wParam, lParam);
            //コントロールのサイズを調べる
        
                        return 0;

リク 2006/12/04(月) 20:24:38
何とか解決できました
SetWindowPos関数でサイズ変更すればよかったです

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