|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
||||
|
||||
Спасибо, а если требуется отловить клик на ProgressBar'e?
|
#17
|
||||
|
||||
а что с ListBox сработало?)))
Пишу программы за еду. __________________ |
#18
|
||||
|
||||
Я не пробовал. Перепутал с ProgressBar'ом
|
#19
|
||||
|
||||
ProgressBar напрямую клик не ловит, нужно сабклассировать.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#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; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось 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, получить Кординаты мышки и рассчитать новую позицию. Простая арифметика.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо 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; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо 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; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 04.12.2012 в 00:21. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
sariman (04.12.2012)
|
#28
|
||||
|
||||
Спасибо Вам ОГРОМНОЕ. На сегодня вопросы исчерпаны
|
#29
|
||||
|
||||
И снова здравствуйте! Создаю PopupMenu, но он присваивается только одному хэндлу, т.е. на форме работает, а на объектах - нет.
|
#30
|
||||
|
||||
в TrackPopupMenu окно владельца указываешь ведь
Пишу программы за еду. __________________ |