![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#121
|
||||
|
||||
|
В процедуре ListViewDrawItem заремируй строки
Код:
if Integer(lpdis.itemID + 1) > LV_GetTopIndex(PlayList) + LV_GetVisibleRowCount(PlayList) then
Exit; |
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
sariman (11.12.2012)
| ||
|
#122
|
||||
|
||||
|
Не получается переделать эту функцию, необходимо не делать выделенный текст жирным шрифтом, а просто изменить цвет текста или фон выделенного элемента:
Код:
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
|
||||
|
||||
|
Ну вот, то жирным, то не жирным.
Код:
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; |
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
sariman (11.12.2012)
| ||
|
#124
|
||||
|
||||
|
Спасибо! Еще такой вопрос: как сделать форму поверх всех окон и обратно? Какой параметр для этого посылать?
|
|
#125
|
||||
|
||||
|
Смотри функцию SetWindowPos и её флаги HWND_TOPMOST, HWND_NOTOPMOST. В ресайзе формы она используется для подгонки контролов под размер формы и первй параметр не используется. Здесь же нужно играться именно с первым параметром, а остальные игнорировать.
|
|
#126
|
||||
|
||||
|
Там же только изменение размеров объектов, а если я передам параметр HWND_TOPMOST объектам на форме - имхо будет бесполезно.
|
|
#127
|
||||
|
||||
|
Да и еще, как обрабатывать двойной щелчок по ListView? В списке WM_... я не нахожу..
|
|
#128
|
||||
|
||||
|
Плохо читал справку, а я немного неточно написал. Первый параметр окно с которым работаем, второй - нужный нам флаг.
Код:
// Выше всех 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 Последний раз редактировалось angvelem, 11.12.2012 в 23:18. |
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
sariman (11.12.2012)
| ||
|
#129
|
||||
|
||||
|
Таким способом не работает
![]() Код:
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
|
||||
|
||||
|
И еще вопрос: как получить текст выделенного элемента при двойном нажатии в ListView?
|
|
#131
|
||||
|
||||
|
Где, в каком сообщении, ловишь ID_ONTOP?
|
|
#132
|
||||
|
||||
|
Код:
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
|
||||
|
||||
|
Правильно, это для "горячей" клавишы сработает, а для меню нужно обрабатывать в родительском контроле - ListView. И, у тебя в ресурсном файле сразу указано становится выше всех, значит нужно в сообщении WM_CREATE проверить этот пункт меню и выставить OnTop в соответствии с ним.
Код:
LV_GetItemText(PlayList, LV_GetSelected(PlayList), 2); Последний раз редактировалось angvelem, 11.12.2012 в 23:32. |
|
#134
|
||||
|
||||
|
Спасибо! Кстати у меня стоит WM_COMMAND тот который я указывал именно на обработчике событий ListView.
Последний раз редактировалось sariman, 11.12.2012 в 23:49. |
|
#135
|
||||
|
||||
|
"Горячие" клавиши обрабатываются в главном окне, чтобы не было двойного кода, из главного окна посылай в PlayList сообщение.
|