Здравствуйте, 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; ?
Жду похожей критики в адрес моего кода.