![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#16
|
||||
|
||||
|
Спасибо, а если требуется отловить клик на ProgressBar'e?
|
|
#17
|
||||
|
||||
|
а что с ListBox сработало?)))
|
|
#18
|
||||
|
||||
|
Я не пробовал. Перепутал с ProgressBar'ом
![]() |
|
#19
|
||||
|
||||
|
ProgressBar напрямую клик не ловит, нужно сабклассировать.
|
|
#20
|
||||
|
||||
|
А есть какие-нибудь альтернативные решения? Например узнать координаты ProgressBar'а и если была нажата клавиша в пределе этих координат, то выполнять определенные действия? Просто хочу добиться минимального размера приложения, а подключение Classes прибавит к exe'шнику как минимум 200 кб.
|
|
#21
|
||||
|
||||
|
Есть - subclassing. Не желает ProgressBar по-другому ловиться. Classes здесь не причём, размер будет минимальный.
Вот пример Код:
var
hpbPrev : Pointer;
...
function pbWndProc(Wnd : HWND; Msg, wParam, lParam : Longint) : Longint; stdcall;
begin
Result := CallWindowProc(hpbPrev, Wnd, Msg, wParam, lParam);
case Msg of
WM_LBUTTONDOWN : MessageBox(Wnd, 'ProgressBar1Click', 'Click', MB_OK);
end;
end;
...
function WindowProc(Wnd: HWnd; Message, wParam, lParam : Integer): Integer; stdcall;
begin
Result := 0;
case Message of
WM_CREATE :
begin
ProgressBar1 := CreateWindow('msctls_progress32', 'progressbar', WS_VISIBLE or WS_CHILD or WS_BORDER,
48, 320, 150, 18, Wnd, 0, hInstance, NIL);
// Subclass ListView
hpbPrev := Pointer(GetWindowLong(ProgressBar1, GWL_WNDPROC));
SetWindowLong(ProgressBar1, GWL_WNDPROC, Longint(@pbWndProc));
end;
...
else
Result := DefWindowProc(Wnd, Message, wParam, lParam);
end;
end;Последний раз редактировалось angvelem, 03.12.2012 в 22:40. |
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
sariman (03.12.2012)
| ||
|
#22
|
||||
|
||||
|
Спасибо, все работает отлично, возник еще один вопрос: как перемещать позицию ProgressBar'а по клику, т.е. перемещать именно в ту позицию, по которой был произведен клик. Вот что у меня есть на данный момент:
Код:
SendMessage(PlayBar, PBM_SETPOS, Round((Width) * (SendMessage(PlayBar, PBM_GETRANGE, 0, 0) / Width)), 0); Width - это ширина ProgressBar'а. Помогите. |
|
#23
|
||||
|
||||
|
В том же событии WM_LBUTTONDOWN, получить Кординаты мышки и рассчитать новую позицию. Простая арифметика.
|
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
sariman (04.12.2012)
| ||
|
#24
|
||||
|
||||
|
Я же привел выше код, просто посмотрите на вышеприведенный код и объясните, что у меня там не правильно.
|
|
#25
|
||||
|
||||
|
Вместо сообщения о клике:
Код:
function pbWndProc(Wnd : HWND; Msg, wParam, lParam : Longint) : Longint; stdcall;
var
Pt : TPoint;
aRect : TRect;
begin
Result := CallWindowProc(hpbPrev, Wnd, Msg, wParam, lParam);
case Msg of
WM_LBUTTONDOWN :
begin
Pt.x := LOWORD(lParam);
Pt.y := HIWORD(lParam);
GetClientRect(Wnd, aRect);
SendMessage(Wnd, PBM_SETPOS, Round(100 / aRect.Right * Pt.X), 0);
end;
end;
end; |
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
sariman (04.12.2012)
| ||
|
#26
|
||||
|
||||
|
Спасибо, но если например поставить за максимальное значение отличное от 100, то не правильно работает.
|
|
#27
|
||||
|
||||
|
Ну так я и указал ставь своё или используй как хотел PBM_GETRANGE
Код:
function pbWndProc(Wnd : HWND; Msg, wParam, lParam : Longint) : Longint; stdcall;
var
Pt : TPoint;
aRect : TRect;
begin
Result := CallWindowProc(hpbPrev, Wnd, Msg, wParam, lParam);
case Msg of
WM_LBUTTONDOWN :
begin
Pt.x := LOWORD(lParam);
Pt.y := HIWORD(lParam);
GetClientRect(Wnd, aRect);
SendMessage(Wnd, PBM_SETPOS, Round(SendMessage(Wnd, PBM_GETRANGE, 0, 0) / aRect.Right * Pt.X), 0);
end;
end;
end;Последний раз редактировалось angvelem, 04.12.2012 в 00:21. |
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
sariman (04.12.2012)
| ||
|
#28
|
||||
|
||||
|
Спасибо Вам ОГРОМНОЕ. На сегодня вопросы исчерпаны
![]() |
|
#29
|
||||
|
||||
|
И снова здравствуйте! Создаю PopupMenu, но он присваивается только одному хэндлу, т.е. на форме работает, а на объектах - нет.
|
|
#30
|
||||
|
||||
|
в TrackPopupMenu окно владельца указываешь ведь
|