Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 03.12.2012, 16:30
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

Спасибо, а если требуется отловить клик на ProgressBar'e?
Ответить с цитированием
  #17  
Старый 03.12.2012, 16:52
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

а что с ListBox сработало?)))
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #18  
Старый 03.12.2012, 17:20
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

Я не пробовал. Перепутал с ProgressBar'ом
Ответить с цитированием
  #19  
Старый 03.12.2012, 21:50
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

ProgressBar напрямую клик не ловит, нужно сабклассировать.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #20  
Старый 03.12.2012, 22:12
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

А есть какие-нибудь альтернативные решения? Например узнать координаты ProgressBar'а и если была нажата клавиша в пределе этих координат, то выполнять определенные действия? Просто хочу добиться минимального размера приложения, а подключение Classes прибавит к exe'шнику как минимум 200 кб.
Ответить с цитированием
  #21  
Старый 03.12.2012, 22:27
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Есть - 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  
Старый 03.12.2012, 23:26
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

Спасибо, все работает отлично, возник еще один вопрос: как перемещать позицию ProgressBar'а по клику, т.е. перемещать именно в ту позицию, по которой был произведен клик. Вот что у меня есть на данный момент:
Код:
SendMessage(PlayBar, PBM_SETPOS, Round((Width) * (SendMessage(PlayBar,
  PBM_GETRANGE, 0, 0) / Width)), 0);
Но при клике полностью заполняется.
Width - это ширина ProgressBar'а.
Помогите.
Ответить с цитированием
  #23  
Старый 03.12.2012, 23:36
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

В том же событии WM_LBUTTONDOWN, получить Кординаты мышки и рассчитать новую позицию. Простая арифметика.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
sariman (04.12.2012)
  #24  
Старый 03.12.2012, 23:41
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

Я же привел выше код, просто посмотрите на вышеприведенный код и объясните, что у меня там не правильно.
Ответить с цитированием
  #25  
Старый 03.12.2012, 23:46
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Вместо сообщения о клике:
Код:
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;
где 100 - максимальный диапазон ProgressBar-а. Подставь своё число.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
sariman (04.12.2012)
  #26  
Старый 04.12.2012, 00:10
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

Спасибо, но если например поставить за максимальное значение отличное от 100, то не правильно работает.
Ответить с цитированием
  #27  
Старый 04.12.2012, 00:18
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Ну так я и указал ставь своё или используй как хотел 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  
Старый 04.12.2012, 00:32
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

Спасибо Вам ОГРОМНОЕ. На сегодня вопросы исчерпаны
Ответить с цитированием
  #29  
Старый 04.12.2012, 10:20
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

И снова здравствуйте! Создаю PopupMenu, но он присваивается только одному хэндлу, т.е. на форме работает, а на объектах - нет.
Ответить с цитированием
  #30  
Старый 04.12.2012, 11:05
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

в TrackPopupMenu окно владельца указываешь ведь
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:05.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter