2

私はwin32プログラムを書いています。スクロールバーのあるウィンドウがあり、ツールバーを追加しました。私の問題は、ウィンドウをスクロールするとツールバーがスクロールすることです。メニューなど、自分の場所にツールバーを配置するにはどうすればよいですか?

これは、ウィンドウをスクロールするときにツールバーがどのようにスクロールするかを示すコードの例です。コードは完全ではありませんが、ウィンドウの行を上または下にスクロールするときにツールバーがどのようにスクロールするかを示しています。

#include <windows.h> 
#include <stdlib.h>
#include <CommCtrl.h>
#pragma comment(lib, "comctl32.lib")

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

HINSTANCE instance;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    instance = hInstance;

    WNDCLASSEX wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style           = CS_HREDRAW | CS_VREDRAW; 
    wcex.lpfnWndProc    = WndProc; 
    wcex.cbClsExtra     = 0; 
    wcex.cbWndExtra     = 0;  
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));  
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW); 
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1); 
    wcex.lpszMenuName   = NULL; 
    wcex.lpszClassName  = L"Example";  
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

    RegisterClassEx(&wcex);

    HWND hWnd = CreateWindow(L"Example", L"", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
        500, 500, NULL, NULL, hInstance, NULL);

    ShowWindow(hWnd, nCmdShow);

    MSG msg;

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);  
        DispatchMessage(&msg); 
    }

    return (int) msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_CREATE: 
        {
            // create toolbar
            HWND hWndToolbar = CreateWindowEx(0 , TOOLBARCLASSNAME, NULL, WS_CHILD | TBSTYLE_TOOLTIPS,
                0, 0, 0, 0, hWnd, (HMENU)0, instance, NULL);

            HIMAGELIST hImageList = ImageList_Create(16, 16, ILC_COLOR16 | ILC_MASK, 3, 0);

            SendMessage(hWndToolbar, TB_SETIMAGELIST, (WPARAM)0, (LPARAM)hImageList);
            SendMessage(hWndToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);

            TBBUTTON tbb[4] = 
            {
                {0,0,TBSTATE_ENABLED,TBSTYLE_BUTTON,},
                {1,1,TBSTATE_ENABLED,TBSTYLE_BUTTON,},
                {2,2,TBSTATE_ENABLED,TBSTYLE_BUTTON,},
                {0,0,TBSTATE_ENABLED,BTNS_SEP} 
            };

            SendMessage(hWndToolbar, (UINT) TB_ADDBUTTONS, 4, (LPARAM)&tbb);

            SendMessage(hWndToolbar, TB_AUTOSIZE, 0, 0);
            ShowWindow(hWndToolbar , SW_SHOW);

            // scrollbar
            SCROLLINFO si;
            si.cbSize = sizeof(SCROLLINFO);
            si.fMask = SIF_ALL;
            si.nMax = 1000;
            si.nMin = 0;
            si.nPos = 0;
            si.nPage = 500; 
            SetScrollInfo(hWnd, SBS_VERT, &si, TRUE);
        }
    break;

 case WM_VSCROLL:
        switch(LOWORD(wParam))
        {
        case SB_LINEDOWN:
                ScrollWindow(hWnd, 0, -20, NULL, NULL);
            break;

        case SB_LINEUP:
                ScrollWindow(hWnd, 0, 20, NULL, NULL);
            break;
        }
    return 0;

    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
}
4

3 に答える 3

0

ウィンドウ階層に別のレベルを追加して、スクロールバーとそれらがスクロールする領域がツールバーの下に配置された子ウィンドウになるようにします。

于 2013-05-20T13:04:52.660 に答える
0

試してみるオプションがいくつかあります。

ホスト ウィンドウを WS_CLIPCHILDREN で作成すると、ScrollWindow() は、子ウィンドウ (ツールバーを含む) が占める領域を無視する場合があります。子ウィンドウのスクロールを解決するために SW_SCROLLCHILDREN とさまざまな組み合わせでScrollWindowEx ()を使用しましたが、それが 100% 正しいかどうかはわかりません。

既存のコードの別のオプションは、スクロールを要求している領域からツールバーが占める領域を除外することです。NULL を渡す代わりに、ツールバーのサイズを差し引いたクライアントの四角形を渡します。

このようなもの:

RECT toolRect;
GetClientRect(hWndToolbar, &toolRect);
RECT clientRect;
GetClientRect(hWnd, &clientRect);
// Adjust clientrect by the height of the toolbar
clientRect.top += toolRect.bottom;
// Scroll the region of our client area minus the toolbar at the top
ScrollWindow(hWnd, 0, 20, &clientRect, NULL);
于 2013-05-17T21:51:53.267 に答える