Picture в TWinControl
От: Nagir  
Дата: 22.01.06 00:39
Оценка:
Всем доброго времени суток,

Подскажите плиз как можно в свой контрол унаследованный от TWinControl вставить картинку.
Только эта картинка должна быть на весь этот контрол.

Вставлял картинку просто в мой контрол (как child control), но после загрузки картинки она не отображается.

Какие можно придумать решения?
Может есть какой-то аналог TImage только унаследованный от TWinControl?
Re: Picture в TWinControl
От: sfsoft Россия  
Дата: 22.01.06 07:07
Оценка:
Здравствуйте, Nagir, Вы писали:

N>Подскажите плиз как можно в свой контрол унаследованный от TWinControl вставить картинку.


Перекрыть событие OnPaint.

N>Только эта картинка должна быть на весь этот контрол.


Рисовать используя StretchDIBits
Re: Picture в TWinControl
От: Jack128  
Дата: 22.01.06 12:43
Оценка:
Здравствуйте, Nagir, Вы писали:

N>Всем доброго времени суток,


N>Подскажите плиз как можно в свой контрол унаследованный от TWinControl вставить картинку.

N>Только эта картинка должна быть на весь этот контрол.

N>Вставлял картинку просто в мой контрол (как child control), но после загрузки картинки она не отображается.


Очень подробное объяснение. Все тут же поняли в чем у тебя проблема...
N>Какие можно придумать решения?
N>Может есть какой-то аналог TImage только унаследованный от TWinControl?
Нет. Есть TImage, обычно большего и не надо. Покажи как контрол вставляешь и как картинку загружаешь
Re: Picture в TWinControl
От: ekamaloff Великобритания  
Дата: 23.01.06 04:38
Оценка:
Здравствуйте, Nagir, Вы писали:

N>Вставлял картинку просто в мой контрол (как child control), но после загрузки картинки она не отображается.


Вставлял динамически? Если да, покажи код.
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[2]: Picture в TWinControl
От: Nagir  
Дата: 25.01.06 15:21
Оценка:
Здравствуйте, ekamaloff, Вы писали:

E>Вставлял динамически? Если да, покажи код.


Задача свелась к тому, чтобы проверить загружена ли картинка в TImage... Смотрите коментарии...
Вот так делал:
{.......}
type
  TImageContro = class(TWinControl)
  private
    fImage: TImage;
  protected
    procedure WndProc(var Message: TMessage); override; {HERE is the cause I tink... See implementation...}
  published
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

    property Image: TImage read fImage;    
  end;
{.......}

implementation
{.......}

constructor TImageControl.Create(AOwner: TComponent);
begin
  inherited Create(aOwner);
  Width := 100;
  Height := 100;
  fImage := TImage.Create(self);
  fImage.Align := alClient;
end;

destructor TImageControl.Destroy;
begin
  fImage.Free;
  inherited;
end;

procedure TImageControl.WndProc(var Message: TMessage);
var
  ps: TPaintStruct;
  DrawDC: HDC;
  brush: HBRUSH;
begin
  { WM_PAINT обрабатывается для того чтобы рисовать что-то в котроле пока не загрузили картинку.
    А вто только как проверить загружена ли эта картинка??? }
  if Message.Msg = WM_PAINT then
  begin
     DrawDC := BeginPaint(Handle, ps);
     brush := CreateHatchBrush(hs_Cross, clOlive);
     FillRect(DrawDC, ClientRect, brush);
     DeleteObject(brush);
     EndPaint(Handle, ps);
     Message.Result := 0;
     exit;
  end
  else
     inherited;
end;
{.......}
Re[3]: Picture в TWinControl
От: sfsoft Россия  
Дата: 25.01.06 15:30
Оценка:
Здравствуйте, Nagir, Вы писали:

У fImage еще есть свойство Parent
Re[4]: Picture в TWinControl
От: sfsoft Россия  
Дата: 25.01.06 15:37
Оценка:
К тому же раз уж вы пишите fImage := TImage.Create(self), то вызов fImage.Free необязателен.
Re[5]: Picture в TWinControl
От: Nagir  
Дата: 25.01.06 20:29
Оценка:
Здравствуйте, sfsoft, Вы писали:

S>К тому же раз уж вы пишите fImage := TImage.Create(self), то вызов fImage.Free необязателен.

Ну это все замечатьельно, но как узнать загружена ли в Image картинка?
Re[6]: Picture в TWinControl
От: Сергей  
Дата: 26.01.06 12:40
Оценка:
Здравствуйте, Nagir, Вы писали:

[..]
N>Ну это все замечатьельно, но как узнать загружена ли в Image картинка?

Попробуй Image.Picture.Bitmap.SaveToFile (), и посмотри — сохранет или нет.
И еще после вставки попробуй написать Image.Visible := true. Мало ли — может, она невидимая.
http://rsdn.org/File/31732/spite.gif
Re[7]: Picture в TWinControl
От: Nagir  
Дата: 26.01.06 14:08
Оценка:
Здравствуйте, Сергей, Вы писали:

С>Здравствуйте, Nagir, Вы писали:


С>Попробуй Image.Picture.Bitmap.SaveToFile (), и посмотри — сохранет или нет.

Как-то нехорошо при WM_PAINT-е каждый раз пытаться сохранять в файл
Re[8]: Picture в TWinControl
От: Сергей  
Дата: 26.01.06 14:18
Оценка:
Здравствуйте, Nagir, Вы писали:

N>Здравствуйте, Сергей, Вы писали:


С>>Здравствуйте, Nagir, Вы писали:


С>>Попробуй Image.Picture.Bitmap.SaveToFile (), и посмотри — сохранет или нет.

N>Как-то нехорошо при WM_PAINT-е каждый раз пытаться сохранять в файл

епрст.
Имею ввиду, что SaveToFile () — это чисто чтобы проверить — загружена или нет. Если нормально сохраняет — значит загружена. И грабли в другом месте.
А насчет visible конкретно имею ввиду вот что:
constructor TImageControl.Create(AOwner: TComponent);
begin
  inherited Create(aOwner);
  Width := 100;
  Height := 100;
  fImage := TImage.Create(self);
  fImage.Align := alClient;
  fImage.Visible := True; // где-то такое мне приходилось втыкать, по умолчанию создавался невидимый контрол
end;
http://rsdn.org/File/31732/spite.gif
Re[9]: Picture в TWinControl
От: sfsoft Россия  
Дата: 26.01.06 17:18
Оценка:
Здравствуйте, Сергей, Вы писали:

С>И грабли в другом месте.

С>А насчет visible конкретно имею ввиду вот что:
С>
С>constructor TImageControl.Create(AOwner: TComponent);
С>begin
С>  inherited Create(aOwner);
С>  Width := 100;
С>  Height := 100;
С>  fImage := TImage.Create(self);
С>  fImage.Align := alClient;
С>  fImage.Visible := True; // где-то такое мне приходилось втыкать, по умолчанию создавался невидимый контрол
С>end;
С>


Блин, ну вы что издеваетесь? Я же уже написал, что грабли в том, что fImage не присваевается свойство parent
Re: Picture в TWinControl
От: Сергей  
Дата: 26.01.06 20:26
Оценка:
Здравствуйте, Nagir, Вы писали:

[..]
unit ImageWinControl;

interface

uses
        Windows, Messages, SysUtils, Classes, Controls, ExtCtrls;

type
        TImageWinControl = class (TWinControl)
        private
                mImage : TImage;
                procedure mSetImage (image : TImage);
                procedure imageChanged (Sender : TObject);
        protected
        public
                constructor Create (owner : TComponent); override;
        published
                property Image : TImage read mImage write mSetImage;
        end;

procedure Register;

implementation

procedure TImageWinControl.mSetImage (image : TImage);
begin
        if Assigned (image) then
        begin
                mImage.Assign (image);
                mImage.Picture.OnChange := imageChanged;
        end;
end;

procedure TImageWinControl.imageChanged (Sender : TObject);
begin
        Refresh;
end;

constructor TImageWinControl.Create (owner : TComponent);
begin
        inherited;
        mImage := TImage.Create (Self);
        InsertControl (mImage);
        mImage.Visible := true;
        mImage.Align := alClient;
        mImage.Picture.OnChange := imageChanged;
end;

procedure Register;
begin
        RegisterComponents ('ImageWinControl', [TImageWinControl]);
end;

end.

Оно?
http://rsdn.org/File/31732/spite.gif
Re[2]: Picture в TWinControl
От: sfsoft Россия  
Дата: 27.01.06 06:13
Оценка:
Здравствуйте, Сергей, Вы писали:

С>
С>InsertControl (mImage);
С>


Можно и так.
Re[10]: Picture в TWinControl
От: Nagir  
Дата: 27.01.06 22:15
Оценка:
Здравствуйте, sfsoft, Вы писали:

S>Блин, ну вы что издеваетесь? Я же уже написал, что грабли в том, что fImage не присваевается свойство parent

Попробовал — все отлично работает (если присвоить Parent). Огромное спасибо за помощь и терпение

Вот только как узнать загружена ли картинка в Image могу найти...
Просто хочу рисовать что-то на WM_PAINT если ее нет.
Re[2]: Picture в TWinControl
От: Nagir  
Дата: 27.01.06 22:53
Оценка:
Здравствуйте, Сергей, Вы писали:

С>Здравствуйте, Nagir, Вы писали:


С>
С>procedure TImageWinControl.mSetImage (image : TImage);
С>begin
С>        if Assigned (image) then
С>        begin
С>                mImage.Assign (image);
С>                mImage.Picture.OnChange := imageChanged;
С>        end;
С>end;
С>

С>Оно?
Не совсем оно. OnChange вызывается даже при инициализации — не подходит.
Единственное что придумал для проверки наличия картинки — это проверить ширину или высоту:

  if mImage.Picture.Width = 0 then
  begin
    //....
  end
  else
  begin
    //....
  end;


Ничего лучше пока не придумал
Re[3]: Picture в TWinControl
От: Андреус  
Дата: 28.01.06 08:41
Оценка:
Nagir пишет:
> Единственное что придумал для проверки наличия картинки — это проверить
> ширину или высоту:


используй функцию Image.Picture.Graphic.Empty
(естественно, предварительно надо проверить на nil Image.Picture и
Image.Picture.Graphic)
Posted via RSDN NNTP Server 2.0
Re[11]: Picture в TWinControl
От: sfsoft Россия  
Дата: 28.01.06 16:13
Оценка:
Здравствуйте, Nagir, Вы писали:

Огромное спасибо за помощь и терпение

Да совершенно не за что.

N>Просто хочу рисовать что-то на WM_PAINT если ее нет.


А вы просто рисуйте на событие WM_PAINT. Картинка будет сверху (правда если transparent = false) и все затрет
Re[4]: Picture в TWinControl
От: Nagir  
Дата: 31.01.06 10:39
Оценка:
Здравствуйте, Андреус, Вы писали:

А>используй функцию Image.Picture.Graphic.Empty

А>(естественно, предварительно надо проверить на nil Image.Picture и
А>Image.Picture.Graphic)

Спасибо. То что нужно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.