Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как в ListView изменить цвет columns со стандартон 
:(
    Опции темы
RA
Дата 15.7.2003, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



Как в ListView изменить цвет columns со стандартоного clBtnFace на нечто другое ?
PM   Вверх
<Spawn>
Дата 15.7.2003, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Наверное поставить OwnerDraw в True и самому нарисовать))) У ListView множество различных событий ответственных за перерисовку. Есть из чего выбрать)))))))))))


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
RA
Дата 16.7.2003, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



Цитата
Наверное поставить OwnerDraw в True и самому нарисовать))) У ListView множество различных событий ответственных за перерисовку. Есть из чего выбрать)))))))))))

Ты знаешь я перерыл весь компонент ListView
но события отвечающее за column'sы не нашёл.

OwnerDraw не помогает.


PM   Вверх
B2_Russia
Дата 17.7.2003, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


В доску свой :)
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 3.7.2003
Где: Тверь

Репутация: нет
Всего: 1



По-моему у него (Column) даже HWND нету либо не найти. Скажете как найти HWND скажу как закрасить.
PM WWW ICQ   Вверх
Гость_Crash
Дата 22.7.2003, 19:53 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Да нет у него Handle и все тут!
пиши свой
или спроси мож у кого есть готовый :-) smile.gif
  Вверх
ziga
Дата 31.7.2003, 18:59 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











primer koda v C++Builder. v Delphi pohozje.
pered FillRect u Canvas.Brush nado pomenjatj Color

void __fastcall TFormTranslatorDlg::ListBoxLanguagesDrawItem(TWinControl *Control, int Index, TRect &Rect, TOwnerDrawState State)
{
ListBoxLanguages->Canvas->Font->Charset = ListBoxLanguages->Font->Charset;
ListBoxLanguages->Canvas->Font->Name = ListBoxLanguages->Font->Name;
ListBoxLanguages->Canvas->Font->Size = ListBoxLanguages->Font->Size;
ListBoxLanguages->Canvas->FillRect(Rect);
ListBoxLanguages->Canvas->TextOut(Rect.Left+2, Rect.Top, ListBoxLanguages->Items->Strings[Index]);
}

  Вверх
p0s0l
Дата 31.7.2003, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Вообще речь то вроде о ListView а не о ListBox'е...



--------------------
С уважением, г-н Посол.
PM   Вверх
RA
Дата 1.8.2003, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



smile.gif В натуре о ListView и единственный способ, это менять системный цвет.
PM   Вверх
p0s0l
Дата 1.8.2003, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Согласен, но тогда вообще все окна в системе начинают перерисовываться...



--------------------
С уважением, г-н Посол.
PM   Вверх
stab
Дата 1.8.2003, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



вот, надумал smile.gif

Код

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ComCtrls, StdCtrls;

type
 TForm1 = class(TForm)
   ListView1: TListView;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

uses CommCtrl;

var
 oldProc: Pointer;

function newProc(hw: HWND; msg: UINT; wP: WPARAM; lP: LPARAM): LRESULT; stdcall;
var
 ph: PNMCustomDraw;
 c: TCanvas;
begin
 case msg of
   WM_NOTIFY: begin
     ph := Pointer(lP);
     if (ph.hdr.code = NM_CUSTOMDRAW) then begin
       case ph.dwDrawStage of
         CDDS_PREPAINT: Result := CDRF_NOTIFYITEMDRAW;
         CDDS_ITEMPREPAINT: begin
           c := TCanvas.Create;
           c.Handle := ph.hdc;
           c.Brush.Color := clWindow;
           c.Pen.Color := clWindow;
           c.Pen.Style := psSolid;
           c.Rectangle(ph.rc);

           InflateRect(ph.rc, -1, -1);
           c.Brush.Color := clMoneyGreen;
           c.Pen.Color := clGreen;
           c.Pen.Style := psDot;
           c.Rectangle(ph.rc);

           InflateRect(ph.rc, -1, -1);
           DrawText(c.Handle, PChar(Form1.ListView1.Columns[ph.dwItemSpec].Caption),  Length(Form1.ListView1.Columns[ph.dwItemSpec].Caption), ph.rc, DT_END_ELLIPSIS or DT_VCENTER or DT_CENTER);
           c.Free;
           Result := CDRF_SKIPDEFAULT;
         end;
       else
         Result := CallWindowProc(oldProc, hw, msg, wP, lP);
       end;
     end
     else
       Result := CallWindowProc(oldProc, hw, msg, wP, lP);
   end;
 else
   Result := CallWindowProc(oldProc, hw, msg, wP, lP);
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 hh: Integer;
 r: TRect;
begin
 hh := ListView1.Handle;
 oldProc := Pointer(GetWindowLong(hh, GWL_WNDPROC));
 SetWindowLong(hh, GWL_WNDPROC, Integer(@newProc));

 r := Rect(0, 0, ListView1.Width, 100);
 InvalidateRect(ListView_GetHeader(ListView1.Handle), @r, True);
end;

end.


далеко от совершенства, но все в ваших руках ;) лучше всего это засунуть в класс TListViewEx, посимпатишней тогда будет... и проще сделать, не нужно будет GetWindowLong, SetWindowLong...


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
RA
Дата 2.8.2003, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



cully Удивил! Слушай а там возле скролла кусок колонки не окрашевается.
PM   Вверх
p0s0l
Дата 2.8.2003, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Вариант, который _почти_ устраняет этот недостаток (почти - потому что хэдер самой правой
колонки без названия рисуется хоть и нужным цветом, но с 3D рамкой...):

Код
function newProc(hw: HWND; msg: UINT; wP: WPARAM; lP: LPARAM): LRESULT; stdcall;
var
ph: PNMCustomDraw absolute lp;
c: TCanvas;
handled : boolean;
begin
 handled := false;
 if msg = WM_NOTIFY then
   if (ph.hdr.code = NM_CUSTOMDRAW) then
   begin
     c := TCanvas.Create;
     c.Handle := ph.hdc;
     case ph.dwDrawStage of
       CDDS_PREPAINT:
         begin
           c.Brush.Color := clMoneyGreen;
           c.Brush.Style := bsSolid;
           c.Pen.Style := psSolid;
           c.Pen.Color := clMoneyGreen;
           c.Rectangle(ph.rc);

           Result := CDRF_NOTIFYITEMDRAW;
           handled := true;
         end;
       CDDS_ITEMPREPAINT:
         begin
           c.Brush.Style := bsClear;
           c.Pen.Color := clWindow;
           c.Pen.Style := psSolid;
           c.Rectangle(ph.rc);

           InflateRect(ph.rc, -1, -1);
           c.Pen.Color := clGreen;
           c.Pen.Style := psDot;
           c.Rectangle(ph.rc);

           InflateRect(ph.rc, -1, -1);
           DrawText(c.Handle, PChar(Form1.ListView1.Columns[ph.dwItemSpec].Caption),  Length(Form1.ListView1.Columns[ph.dwItemSpec].Caption), ph.rc, DT_END_ELLIPSIS or DT_VCENTER or DT_CENTER);

           Result := CDRF_SKIPDEFAULT;
           handled := true;
         end;
     end;
     c.Free;
   end;

 if not handled then Result := CallWindowProc(oldProc, hw, msg, wP, lP);
end;

Можно в CDDS_PREPAINT сделать Result := CDRF_NOTIFYITEMDRAW + CDRF_NOTIFYPOSTPAINT,
и тогда в case надо добавить CDDS_POSTPAINT и там попробовать что-нибудь поделать.



--------------------
С уважением, г-н Посол.
PM   Вверх
RA
Дата 7.8.2003, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



P0s0l а что нельзя их так перекрасить чтоб свойсво 3D не утрачивалось?
PM   Вверх
p0s0l
Дата 7.8.2003, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Хэдеры с названиями ты можешь красить как угодно, хоть с 3D, хоть без 3D.
А вот самый крайний хэдер без названия почему-то получается только с 3D, без 3D - нельзя...
Причем цвет 3D в нем идет от стандартного цвета, т.е. если ты захочешь рисовать заголовки, например, зеленым цветом, то 3D грани у крайнего хэдера будут немного выделяться...
(в обычной цветовой схеме 3D грани серые, а не зеленоватые)



--------------------
С уважением, г-н Посол.
PM   Вверх
RA
Дата 7.8.2003, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



Тогда как перекрасить Хэдеры с названиями в 3D ?

Ато там Flat тут 3d ну некрасиво.
PM   Вверх
p0s0l
Дата 8.8.2003, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Может быть можно какими-нибудь стандартными фичами рисовать 3D-окантовку,
но я не знаю как... Поэтому вот ручной способ, ничем не отличается от стандартного 3D:

Код

function newProc(hw: HWND; msg: UINT; wP: WPARAM; lP: LPARAM): LRESULT; stdcall;
var
ph: PNMCustomDraw absolute lp;
c: TCanvas;
handled : boolean;
x1, x2, y1, y2 : integer;
begin
 handled := false;
 if msg = WM_NOTIFY then
   if (ph.hdr.code = NM_CUSTOMDRAW) then
   begin
     c := TCanvas.Create;
     c.Handle := ph.hdc;
     case ph.dwDrawStage of
       CDDS_PREPAINT:
         begin
           c.Brush.Color := clMoneyGreen;
           c.Brush.Style := bsSolid;
           c.Pen.Style := psSolid;
           c.Pen.Color := clMoneyGreen;
           c.Rectangle(ph.rc);

           Result := CDRF_NOTIFYITEMDRAW;// + CDRF_NOTIFYPOSTPAINT;
           handled := true;
         end;
       CDDS_ITEMPREPAINT:
         with c do
         begin
// begin of 3D
           x1 := ph.rc.Left;
           x2 := ph.rc.Right-1;
           y1 := ph.rc.Top;
           y2 := ph.rc.Bottom-1;

           Pen.Color := clBtnHighlight;
           MoveTo(x1, y2-1);
           LineTo(x1, y1);
           LineTo(x2, y1);
           Pen.Color := cl3DLight;
           MoveTo(x1+1, y2-2);
           LineTo(x1+1, y1+1);
           LineTo(x2-1, y1+1);

           Pen.Color := cl3DDkShadow;
           MoveTo(x1, y2);
           LineTo(x2, y2);
           LineTo(x2, y1-1);
           Pen.Color := clBtnShadow;
           MoveTo(x1+1, y2-1);
           LineTo(x2-1, y2-1);
           LineTo(x2-1, y1);

// end of 3D paint

           InflateRect(ph.rc, -2, -2);
           if ph.dwItemSpec < Form1.ListView1.Columns.Count then
           Brush.Style := bsClear;
           DrawText(c.Handle,
                    PChar(Form1.ListView1.Columns[ph.dwItemSpec].Caption),  
                    Length(Form1.ListView1.Columns[ph.dwItemSpec].Caption),
                    ph.rc,
                    DT_END_ELLIPSIS or DT_VCENTER or DT_CENTER);

           Result := CDRF_SKIPDEFAULT;
           handled := true;
         end;
     end;
     c.Free;
   end;

 if not handled then Result := CallWindowProc(oldProc, hw, msg, wP, lP);
end;




--------------------
С уважением, г-н Посол.
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0589 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.