Re[2]: splitter
От: Calc Россия  
Дата: 08.07.03 12:11
Оценка:
Здравствуйте, KycoK, Вы писали:

KK>Вот куски моего кода на C++:

KK> ...
KK>//========================

Вот что у меня получилось:


void Splitter(HWND hwnd, DWORD lParam)
{
    RECT rectClient;

    GetClientRect(hwnd, &rectClient);
    if(LOWORD(lParam) > 50 && LOWORD(lParam) < (rectClient.right - 50))
    {
        MoveWindow(GetDlgItem(hwnd, IDC_TREE), rectClient.left, rectClient.top, LOWORD(lParam) - 2, rectClient.bottom, TRUE);
        MoveWindow(GetDlgItem(hwnd, IDC_LIST), LOWORD(lParam) + 2, rectClient.top, rectClient.right - LOWORD(lParam), rectClient.bottom, TRUE);
    }
}

/////////////////////////////////////////////////////////////////////////////

INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg) {
        chHANDLE_DLGMSG(hwnd, WM_INITDIALOG, Dlg_OnInitDialog);
        chHANDLE_DLGMSG(hwnd, WM_COMMAND, Dlg_OnCommand);
        chHANDLE_DLGMSG(hwnd, WM_SIZE, Dlg_OnSize);
    case WM_LBUTTONUP:
        ReleaseCapture();
        break;
    case WM_MOUSEMOVE:
        SetCursor(LoadCursor(NULL, IDC_SIZEWE));
        if(wParam == MK_LBUTTON)
        {
            SetCapture(hwnd);
            Splitter(hwnd, lParam);
        }
        break;
    }
    return(FALSE);
}


Помоему короче и легче.
Доработать надо только:
При нажатии на мышь, курсор меняется на стандартную стрелку.
При наведении курсора предположем на левый край сплиттера и зажатии кнопки, а потом движении влево сообщение WM_MOUSEMOVE не генерируется и сплиттер не перемещается.
Думаю это можно доработать
1) WM_LMOUSEDOWN
2) WM_MOUSELEAVE

Вот ваш код:

//========================

    case WM_LBUTTONDOWN:
        split=true;
        SetCapture(hMainW);
        SetCursor(LoadCursor(NULL,IDC_SIZEWE));
    return 0;

    case WM_LBUTTONUP:
        split=false;
        ReleaseCapture();
    return 0;

    case WM_MOUSEMOVE:
        SetCursor(LoadCursor(NULL,IDC_SIZEWE));
        Splitter(lParam);
    return 0;
//========================

Заметил такую вещь:
При генерации сообщения WM_LMOUSEDOWN у меня почемуто после этого не генерировалось сообщение WM_MOUSEMOVE

Вот ещё:
MoveWindow(hControl2, LOWORD(lParam)+3, y, pRECT.right, pRECT.bottom, TRUE);

При размере больше 3х курсор IDC_SIZEWE находиться не по середине сплиттера.

И ещё вопрос, только он по C++ а не по WinApi

Обязательно ли завершать функции типа void ключевым словом return; ?


Жду похожей критики в адрес моего кода.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.