Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2016.05.08;
Скачать: CL | DM;

Вниз

Изменить цвет пикселя на контроле   Найти похожие ветки 

 
SetPixel_on_Control   (2014-10-06 16:19) [0]

Есть желание изменить цвет одного - двух пикселей, например, на TPanel или TMemo (не целиком TPanel.Color или TMemo.Color, а именно несколько пикселей на них). Насколько это реально и достаточно не сложно?
Спасибо.


 
SetPixel_on_Control   (2014-10-06 16:29) [1]

PS
Располагая только их координатами на форме ...


 
megavoid ©   (2014-10-06 16:37) [2]

Form1.Canvas.Pixels[10, 10] := clRed;


 
junglecat ©   (2014-10-06 16:48) [3]

в мемо так просто не получится


 
SetPixel_on_Control   (2014-10-06 18:06) [4]

> junglecat ©   (06.10.14 16:48) [3]

Да и на "голой" форме, не говоря о контролах, пока не получилось


 
SetPixel_on_Control   (2014-10-06 18:08) [5]

Как мне показалось, здесь нужно SetPixel. Не знаю, что назначить HDC?


 
junglecat ©   (2014-10-06 19:00) [6]

SetPixel будет виден до первой перерисовки контролом себя


 
DQ   (2014-10-06 22:31) [7]

Перекрыть ON_PAINT этих контролов. Судя по вопросу - будет сложно. =)


 
Andy BitOff ©   (2014-10-07 00:36) [8]

Не все так просто с ВинКонтролами. Я бы даже сказал, что очень не просто.

На разбирайся, если есть особой желание. Это не решение твоей задачи, это помощь для возможного ее решения.

uses ...
 GDIPAPI,
 GDIPOBJ,
 GDIPUTIL;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Panel1: TPanel;
   RadioButton1: TRadioButton;
   Edit1: TEdit;
   ListBox1: TListBox;
   StaticText1: TStaticText;
   Memo1: TMemo;
...

procedure TForm1.ControlPaint(Sender: TWinControl);
var
 a, r, g, b: byte;
 x, y, width, height, sizePixel, widthInBytes: Integer;
 DC: HDC;
 InnerImage: TGPBitmap;
 GPGraph: TGPGraphics;
 ImageBA: pByteArray;
 BitmapData: TBitmapData;
//  ImageFormatPNG: TGUID;
begin

 InnerImage := TGPBitmap.Create(Sender.ClientWidth, Sender.ClientHeight);
 GPGraph := TGPGraphics.Create(InnerImage);

 try
   DC := GPGraph.GetHDC();      // отрисовываем сам контрол
   try
     Sender.PaintTo(DC, 0, 0);
   finally
     GPGraph.ReleaseHDC(DC);
     GPGraph.Free;
   end;

   width := Floor(InnerImage.getWidth);      // работаем с данными изображения
   height := Floor(InnerImage.GetHeight);
   sizePixel := 4;
   widthInBytes := width * sizePixel;
   InnerImage.LockBits(MakeRect(0, 0, width, height), ImageLockModeRead or ImageLockModeWrite, PixelFormat32bppARGB, BitmapData);
   try
     for y := 0 to height - 1 do begin
       ImageBA := Pointer(Integer(BitmapData.Scan0) + widthInBytes * y);
       x := 0;
       while x < widthInBytes do begin
         a := ImageBA[x + 3];
         r := ImageBA[x + 2];
         g := ImageBA[x + 1];
         b := ImageBA[x];

         if y mod 2 = 0 then begin  // через строчку
           r := 255;                // Красненький :)
           g := 0;
           b := 0;
         end;

         ImageBA[x + 3] := a;
         ImageBA[x + 2] := r;
         ImageBA[x + 1] := g;
         ImageBA[x] := b;

         Inc(x, sizePixel);
       end;
     end;
   finally
     InnerImage.UnlockBits(BitmapData);
   end;

//    GetEncoderClsid("image/png", ImageFormatPNG);  // Save в файл для теста
//    InnerImage.Save("image.png", ImageFormatPNG);

   DC := GetDc(Sender.Handle);       // выводим
   try
     GPGraph := TGPGraphics.Create(DC);
     GPGraph.DrawImage(InnerImage, 0, 0, Sender.ClientWidth, Sender.ClientHeight);
   finally
     ReleaseDC(0, DC);
   end;
 finally
   GPGraph.Free;
   InnerImage.Free;
 end;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
 ControlPaint(Button1);
 ControlPaint(Panel1);
 ControlPaint(RadioButton1);
 ControlPaint(Edit1);
 ControlPaint(ListBox1);
 ControlPaint(StaticText1);
 ControlPaint(Memo1);
end;


 
ВладОшин ©   (2014-10-09 21:42) [9]

Глупый вопрос - зачем?
Хочешь юзера с ума свести?  Вдруг подумает, что пиксель на мониторе выбит :)


 
Alarm ©   (2014-10-10 14:37) [10]

Ну почему свести с ума, возможно прогеру хочется каким-то (малозаметным) образом выделить соответствующий баттон или мемо. Всяко разные могут быть причины :)



Страницы: 1 вся ветка

Текущий архив: 2016.05.08;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.005 c
15-1440451804
Юрий
2015-08-25 00:30
2016.05.08
С днем рождения ! 25 августа 2015 вторник


2-1411153202
ser
2014-09-19 23:00
2016.05.08
запись в ini файл


2-1412597981
SetPixel_on_Control
2014-10-06 16:19
2016.05.08
Изменить цвет пикселя на контроле


15-1440158492
Masterucs
2015-08-21 15:01
2016.05.08
Project -> Options -> Compiling -> Symbol reference info


15-1440059481
K-1000
2015-08-20 11:31
2016.05.08
Unable to locate file "Drawer.pas".