Re[3]: splitter
От: KycoK  
Дата: 09.07.03 12:25
Оценка:
Здравствуйте, Calc, Вы писали:


C>

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

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

C>/////////////////////////////////////////////////////////////////////////////

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



WM_MOUSEMOVE посылается очень часто при движении мыши, а у Вас тут вызывается функция SetCapture каждый раз. Это может затормозить машину или ещё какая гадость случится.

C>Вот ваш код:


C>
C>//========================

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

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

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

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

Не знаю: у меня всё работало. У меня тоже было с одной стороны дерево а с другой лист, но не в диалоге. Я при WM_CREATE создавал окна там где надо а потом уже обрабатывал WM_SIZE всякий.

C>Вот ещё:

C>
C>MoveWindow(hControl2, LOWORD(lParam)+3, y, pRECT.right, pRECT.bottom, TRUE);
C>

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

На счёт всяких там пикселей не помню: делал подбором, и потом у меня там ещё тулбар и статусбар были, так что не знаю. Я выдрал из программы и на скорую руку убрал что не надо...

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


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


Нет. Это тебе надо только для досрочного завершения. Типа, если в if`е.


C>Жду похожей критики в адрес моего кода.

Ну, небольшую ты получил.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.