Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  20:20[Войти] | [Зарегистрироваться]
Ответ на вопрос № 45653

06-10-2006 04:20
Здравствуйте.

Поставлена задача - написать красивое приложение. Может кто компоненты подскажет?
Используются button, edit, combobox, dbgrid.
Основная проблема: как сделать у edit, combobox и dbgrid фоном картинку, а не простую заливку?

Заранее благодарен.
Remer.

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

01-12-2006 12:04
>>> А красоты своего грида
Лично по мне, стандартный грид - некрасив. Нормальную альтернативу предлагает TMS сетки. Рекомендую. При этом сетка не слишком сильно отличается от привычной. Кстати, в этом же пакете есть и другие красивые компоненты (но не сильно отличающиеся от стандартных - это основной плюс!).

09-10-2006 03:15 | Сообщение от автора вопроса
>>>попробуйте JVCL
Попробовал. Переварить всё сразу не смог - буду переваривать по частям. :-)))

>>>www.devexpress.com
Спасибо. Насколько я понял - они платные и в данный момент более актуальны бесплатные компоненты.

>>>картинка не сделает ваше приложение красивым.
Вы стали бы играть в игровые автоматы, если бы дизайн игрушки был сделан в виндовом стиле? Я пишу ПО для автомата по продаже рингтонов и красивая шкурка - обязательный элемент.

Спасибо ВСЕМ за помощь. Попробую ВСЁ.

08-10-2006 22:18
>>To : Алексей Румянцев
>>TTreeView = class(ComCtrls.TTreeView)
кстати, хороший способ подмены компонентов, не устанавливая их в палитру и сохраняя визуальный контроль, сам пользуюсь - удобно

тока такие дописки лучше выделить в отдельный модуль и подключать его последним в списке модулей (в части Interface)


08-10-2006 04:49
Shoor: Да не "ну,ну" а точно - ты отделался ответом как разукрасить кнопку и нунукаешь... а ты бы ответил по поводу остальных контролов, зачем остановился...

Например у меня валяется код(автора не знаю) как поместить задний фон в TTreeView, но, например, для TListView его надо будет ещё доработать: в TListView в WM_PAINT красится только рабочая часть. Для TEdit работает, но надо обработать WM_SETFOCUS, для TMemo также как для TListView. С TStringGrid'ом проблема в том, что когда курсор перемещается на ячейку ниже видимых на экране, то, видимо для уменьшения мирцания, сдвигают канву на высоту ячейки вверх, и на экране видно как дёргается background, нужно думать как заблокировать изображение в момент перерисовки, в TDBGrid скорей всего тоже что и в TStringGridе.

type
  TTreeView = class(ComCtrls.TTreeView)
  private
    FBitmap: TBitmap;
  protected
    procedure WndProc(var Message: TMessage); override;
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  public
    property Bitmap: TBitmap read FBitmap write FBitmap;
  end;

  TForm1 = class(TForm)
    TreeView1: TTreeView;
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses CommCtrl;

{$R *.dfm}

{ TTreeView }

procedure TTreeView.WndProc(var Message: TMessage);
begin
  if Message.Msg = WM_ERASEBKGND then
  begin
    Message.Result := 1
  end else
  begin
    case Message.Msg of
      CN_NOTIFY:
        if TWMNotify(Message).NMHdr^.code = TVN_ITEMEXPANDING then
          InvalidateRect(Handle, nil, False);
      WM_KEYDOWN, WM_HSCROLL, WM_VSCROLL, WM_MOUSEWHEEL:
        InvalidateRect(Handle, nil, False);
    end;
    inherited
  end
end;

procedure TTreeView.WMPaint(var Message: TWMPaint);
var
  DC, TempDC, TempDC1: HDC;
  TempBmp, OldBmp, OldBmp1, TempBMP1: HBITMAP;
  PS: TPaintStruct;
  TempRect: TRect;
begin
  if Message.DC <> 0 then
    inherited
  else begin
    TempRect := ClientRect;
    BeginPaint (Handle, PS);
    try
      DC := GetDC(Handle);
      TempDC := CreateCompatibleDC(DC);
      TempDC1 := CreateCompatibleDC(DC);
      TempBMP := CreateCompatibleBitmap(DC, TempRect.Right, TempRect.Bottom);
      TempBMP1 := CreateCompatibleBitmap(DC, TempRect.Right, TempRect.Bottom);
      try
        OldBmp := SelectObject(TempDC, TempBMP);
        OldBmp1 := SelectObject(TempDC1, TempBMP1);
        try
          Message.DC := TempDC;
          inherited;
          Message.DC := 0;
          FillRect(TempDC1, TempRect, GetStockObject(WHITE_BRUSH));
          if FBitmap <> nil then
            BitBlt(TempDC1, 0, 0, FBitmap.Width, FBitmap.Height, FBitmap.Canvas.Handle, 0, 0, SRCCOPY);
          TransparentBlt (TempDC1, 0, 0, TempRect.Right, TempRect.Bottom, TempDC, 0, 0, TempRect.Right, TempRect.Bottom, clWhite);
          BitBlt(DC, 0, 0, TempRect.Right, TempRect.Bottom, TempDC1, 0, 0, SRCCOPY);
        finally
          SelectObject (TempDC, OldBmp);
          SelectObject (TempDC1, OldBmp1)
        end;
      finally
        DeleteObject (TempBMP);
        DeleteObject (TempBMP1);
        ReleaseDC (Handle, TempDC);
        ReleaseDC (Handle, TempDC1);
        ReleaseDC (Handle, DC);
      end;
    finally
      EndPaint (Handle, PS)
    end;
  end
end;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  treeview1.Color := clWhite;
  treeview1.Bitmap := ...
end;


07-10-2006 12:20
Ну ну.

07-10-2006 04:43 | Комментарий к предыдущим ответам
2 Shoor: На форуме люди дают советы как сделать что-то лучше. Слушать эти советы или игнорировать их - это личное дело спрашивающего.
Наилучший (с моей точки зрения) ответ на этот вопрос (вопрос о красоте) - посоветовать автору отказаться от рисования картинок на канве. А красоты своего грида он может добиться многими другими способами, например вот так http://www.delphikingdom.com/asp/viewitem.asp?catalogid=168 Но эта ссылка выходит за рамки вопроса

06-10-2006 15:47
Хм, человек задал вопрос, а тут вместо помощи его пытаются убедить, что ему не надо это, это глупо, не красиво, и вообще, как ему такая мысль в голову пришла!!! Рисовать на кнопках!!! Это же надо, додумался. Сидел бы там себе спокойно под стандартными кнопками, стандартными окнами, осталость только весь мир еще в одинаковую одежду нарядить, и все, тогда я точно повешусь на проводе от стандартной мышки для порта PS/2. Кгм, это я...

Ладно, меньше слов - больше дела.
Итак, к великой радости на всех визуальных компонентах делфи можно рисовать! Для этого лишь надо знать HDC компонента (это по сути хендл его только графический, и рашифровывается как Handle Device Context). Так вот, этот самый хендл возвращает функция GetDC(handle), где handle-хендл объекта типа HWND.

Что теперь с этим HDC делать?

Можно сразу с помощью его рисовать, например:

var h:HDC;
begin
  h:=GetDC(Button1.handle); //здесь создаем ссылку
  Rectangle(h,5,5,15,15);
  ReleaseDC(Button1.handle,h) //здесь освобождение ссылки
  DeleteDC(h); //здесь удаление ссылки
end;



Можно создать канву, и с помощю ее делать с кнопкой все что захоца:

var q:TCanvas;
begin
  q:=TCanvas.Create;
  q.Handle:=GetDC(Button1.Handle);
  q.MoveTo(0,0);
  q.LineTo(10,10);
  ReleaseDC(Button1.handle,q.Handle);
  DeleteDC(q.Handle);
  q.Free;
end;



Ну и наконец, если вдруг захочется прям так компонент, чтобы был всегда под рукой, и содержал канву, то можно его написать, вот пример апдейта обыкновенного TButton:

unit GraphButton;

interface

uses
  SysUtils, Classes, Controls, StdCtrls, Graphics;

type
  TGraphButton = class(TButton)
  private
    FCanvas: TControlCanvas;
    function GetCanvas: TCanvas;
    { Private declarations }
  protected
    { Protected declarations }
  public
    property Canvas:TCanvas read GetCanvas;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    { Public declarations }
  published
    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('MyGraph', [TGraphButton]);
end;

{ TGraphButton }



constructor TGraphButton.Create;
begin
  inherited;
  FCanvas := TControlCanvas.Create;
  FCanvas.Control := Self;
end;

destructor TGraphButton.Destroy;
begin
  FCanvas.Free;
  inherited;
end;

function TGraphButton.GetCanvas: TCanvas;
begin
  Result := FCanvas;
end;

end.



Ну вот собстенно и все:) По моему больше добавить нечего

06-10-2006 09:27
Тоже считаю, что красота программы должна быть в ее функциональности и удобстве, а не в картинках и круглых кнопках (которые, обычно, еще и неправильно работают, взять, для примера, тот же Roxio Easy Creator 7.0 или Ad-Aware)

06-10-2006 09:03
картинка не сделает ваше приложение красивым. Более того, она потихоньку начнет раздрожать ваших пользователей.

06-10-2006 08:28
www.devexpress.com

06-10-2006 07:10
попробуйте JVCL
http://homepages.borland.com/jedi/jvcl/

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Два кольца, два конца, посередине гвоздик.
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования