Здравствуйте, 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>Жду похожей критики в адрес моего кода.
Ну, небольшую ты получил.