Форум: "Начинающим";
Текущий архив: 2016.05.08;
Скачать: [xml.tar.bz2];
ВнизИзменить цвет пикселя на контроле Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.036 c