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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #121  
Старый 11.12.2012, 11:52
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

В процедуре ListViewDrawItem заремируй строки
Код:
  if Integer(lpdis.itemID + 1) > LV_GetTopIndex(PlayList) + LV_GetVisibleRowCount(PlayList) then
    Exit;
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
sariman (11.12.2012)
  #122  
Старый 11.12.2012, 20:01
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

Не получается переделать эту функцию, необходимо не делать выделенный текст жирным шрифтом, а просто изменить цвет текста или фон выделенного элемента:
Код:
procedure ListViewDrawItem(lpdis: PDRAWITEMSTRUCT);
var
  aRect: TRect;
  OldFont: HFONT;
begin
  aRect := lpdis.rcItem;
  DSFillRect(lpdis.hDC, aRect, clSilver);

  //if Integer(lpdis.itemID + 1) > LV_GetTopIndex(PlayList) +
  ///  LV_GetVisibleRowCount(PlayList) then Exit;

  OldFont := SelectObject(lpdis.hDC, FontNormal);

  if ((lpdis.itemState and CDIS_SELECTED) = CDIS_SELECTED) then
  begin
    DSFillRect(lpdis.hDC, aRect, clSilver);
    SetTextColor(lpdis.hDC, clNavy);
    SetBkColor(lpdis.hDC, clWhite);
    OldFont := SelectObject(lpdis.hDC, FontNormal);
  end
  else
    SetTextColor(lpdis.hDC, clWhite);

  if lpdis.itemID = TrackIndex then
    OldFont := SelectObject(lpdis.hDC, FontBold)
  else
    SetTextColor(lpdis.hDC, clBlack);

  aRect := LV_GetSubItemRect(PlayList, lpdis.itemID, 0, lvLabel);
  DrawText(lpdis.hDC, PChar(Format('%d.', [lpdis.itemID + 1])), -1, aRect,
    DT_RIGHT or DT_VCENTER);
  aRect := LV_GetSubItemRect(PlayList, lpdis.itemID, 1, lvLabel);
  aRect.Left := aRect.Left + 4;
  DrawText(lpdis.hDC, PChar(LV_GetItemText(PlayList, lpdis.itemID, 1)), -1,
    aRect, DT_VCENTER or DT_END_ELLIPSIS);
  SelectObject(lpdis.hDC, OldFont);
end;

Последний раз редактировалось sariman, 11.12.2012 в 21:20.
Ответить с цитированием
  #123  
Старый 11.12.2012, 22:29
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Ну вот, то жирным, то не жирным.
Код:
procedure ListViewDrawItem(lpdis : PDRAWITEMSTRUCT);
var
  aRect : TRect;
begin
  aRect := lpdis.rcItem;
  DSFillRect(lpdis.hDC, aRect, clSkyBlue);

  if ((lpdis.itemState and CDIS_SELECTED) = CDIS_SELECTED) then
  begin
    DSFillRect(lpdis.hDC, aRect, clTeal);
    SetTextColor(lpdis.hDC, clWhite);
    SetBkColor(lpdis.hDC, clTeal);
  end
  else
    SetTextColor(lpdis.hDC, clBlack);

  aRect := LV_GetSubItemRect(PlayList, lpdis.itemID, 0, lvLabel);
  DrawText(lpdis.hDC, PChar(Format('%d.', [lpdis.itemID + 1])), -1, aRect, DT_RIGHT or DT_VCENTER);
  aRect := LV_GetSubItemRect(PlayList, lpdis.itemID, 1, lvLabel);
  aRect.Left := aRect.Left + 4;
  DrawText(lpdis.hDC, PChar(LV_GetItemText(PlayList, lpdis.itemID, 1)), -1, aRect, DT_VCENTER or DT_END_ELLIPSIS);
end;
И дополнительно убери в коде всё, что касается создания и удаления шрифтов.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
sariman (11.12.2012)
  #124  
Старый 11.12.2012, 22:41
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

Спасибо! Еще такой вопрос: как сделать форму поверх всех окон и обратно? Какой параметр для этого посылать?
Ответить с цитированием
  #125  
Старый 11.12.2012, 22:51
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Смотри функцию SetWindowPos и её флаги HWND_TOPMOST, HWND_NOTOPMOST. В ресайзе формы она используется для подгонки контролов под размер формы и первй параметр не используется. Здесь же нужно играться именно с первым параметром, а остальные игнорировать.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #126  
Старый 11.12.2012, 23:07
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

Там же только изменение размеров объектов, а если я передам параметр HWND_TOPMOST объектам на форме - имхо будет бесполезно.
Ответить с цитированием
  #127  
Старый 11.12.2012, 23:12
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

Да и еще, как обрабатывать двойной щелчок по ListView? В списке WM_... я не нахожу..
Ответить с цитированием
  #128  
Старый 11.12.2012, 23:15
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Плохо читал справку, а я немного неточно написал. Первый параметр окно с которым работаем, второй - нужный нам флаг.
Код:
  // Выше всех
  SetWindowPos(Wnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
  // нормальный режим
  SetWindowPos(Wnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);

WM_LBUTTONDBLCLK
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 11.12.2012 в 23:18.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
sariman (11.12.2012)
  #129  
Старый 11.12.2012, 23:18
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

Таким способом не работает
Код:
 ID_ONTOP:
      case ((GetMenuState(Menu, LOWORD(wParam), MF_BYCOMMAND) and
        MF_CHECKED) = MF_CHECKED) of
        True: begin
          // Снмаеи чек элемента
          CheckMenuItem(Menu, LOWORD(wParam), MF_BYCOMMAND or MF_UNCHECKED);
          SetWindowPos(Wnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
        end;
        False: begin
          // Ставим чек элементу
          CheckMenuItem(Menu, LOWORD(wParam), MF_BYCOMMAND or
            MF_CHECKED);
          SetWindowPos(Wnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
        end;
      end;
Ответить с цитированием
  #130  
Старый 11.12.2012, 23:20
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

И еще вопрос: как получить текст выделенного элемента при двойном нажатии в ListView?
Ответить с цитированием
  #131  
Старый 11.12.2012, 23:21
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

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

Код:
WM_COMMAND:
    case LoWord(wParam) of
      ID_ADDFILES: AddFiles;
      ID_HOTKEYS: MessageBox(Wnd, MsgHotKeys, MsgHotKeysCap, 64);
      ID_REDUCENAME:
      case ((GetMenuState(Menu, LOWORD(wParam), MF_BYCOMMAND) and
        MF_CHECKED) = MF_CHECKED) of
        True: begin
          CheckMenuItem(Menu, LOWORD(wParam), MF_BYCOMMAND or MF_UNCHECKED);
        end;
        False: begin CheckMenuItem(Menu, LOWORD(wParam), MF_BYCOMMAND or
          MF_CHECKED);
        end;
      end;
      ID_ONTOP:
      case ((GetMenuState(Menu, LOWORD(wParam), MF_BYCOMMAND) and
        MF_CHECKED) = MF_CHECKED) of
        True: begin
          // Снмаеи чек элемента
          CheckMenuItem(Menu, LOWORD(wParam), MF_BYCOMMAND or MF_UNCHECKED);
          SetWindowPos(Wnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
        end;
        False: begin
          // Ставим чек элементу
          CheckMenuItem(Menu, LOWORD(wParam), MF_BYCOMMAND or
            MF_CHECKED);
                    SetWindowPos(Wnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
        end;
      end;
Ответить с цитированием
  #133  
Старый 11.12.2012, 23:30
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Правильно, это для "горячей" клавишы сработает, а для меню нужно обрабатывать в родительском контроле - ListView. И, у тебя в ресурсном файле сразу указано становится выше всех, значит нужно в сообщении WM_CREATE проверить этот пункт меню и выставить OnTop в соответствии с ним.
Код:
  LV_GetItemText(PlayList, LV_GetSelected(PlayList), 2);
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 11.12.2012 в 23:32.
Ответить с цитированием
  #134  
Старый 11.12.2012, 23:40
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

Спасибо! Кстати у меня стоит WM_COMMAND тот который я указывал именно на обработчике событий ListView.

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

"Горячие" клавиши обрабатываются в главном окне, чтобы не было двойного кода, из главного окна посылай в PlayList сообщение.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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