Текущий архив: 2003.04.03;
Скачать: CL | DM;
ВнизBackground Найти похожие ветки
← →
Cosmic (2003-02-06 21:04) [0]Как можно сделать background из BMP-шки с жесткого диска на элементе listbox, созданном при помощи CreateWindowEx?
Если не трудно - с примерами.
← →
Игорь Шевченко (2003-02-07 09:40) [1](c) Peter Below
procedure TJvBMPListBox.WMEraseBkGnd(var msg: TWMEraseBkGnd);
var
imagerect, clipbox, clientrect, temp: TRect;
cv: TCanvas;
clipComplexity: Integer;
begin
If FBackground.Empty Then
inherited
Else Begin
msg.result := 1;
clientrect := Self.Clientrect;
// Функция GetClipBox выбирает ближайший возможный прямоугольник, который
// может быть нарисован вокруг текущей видимой области в контексте
// устройства. Видимая область определяется текущей областью рисования
// (clipping region) или совокупоностью областей рисования (clip path).
// Функция возвращает NULLREGION, если нужный прямоугольник
// пуст, ERROR, если произошла ошибка, SIMPLEREGION, если текущая видимая
// область является прямоугольником и COMPLEXREGION, если текущая видимая
// область состоит более чем из одного прямоугольника.
clipComplexity:= GetClipBox( msg.dc, clipbox );
If clipComplexity = NULLREGION Then
Exit; // Ничего не надо рисовать
If ClipComplexity = ERROR Then
clipbox := clientRect; // при ошибке считаем, что надо перерисовать всю
// клиентскую область.
cv:= TCanvas.Create;
try
cv.Handle := msg.DC;
If FFillmode = bfm_Stretch Then
cv.StretchDraw( clientRect, FBackground )
Else Begin //Tile Drawing mode
//
// Алгоритм заполнения изображением области в режиме Tile (мозаика).
//
imagerect := FBackground.canvas.Cliprect; // Область рисования канвы,
// которую необходимо заполнить изображением
while imagerect.top < clientrect.bottom do begin
while imagerect.left < clientrect.right do begin
// Фукнция IntersectRect определяет пересечение двух прямоугольников
// в виде прямоугльника. Возвращает true, если получившийся
// прямоугольник не пустой.
If IntersectRect( temp, clipbox, imagerect ) Then
cv.Draw( imagerect.left, imagerect.top, FBackground );
// Сместить прямоугольник вправо
OffsetRect( imagerect, imagerect.right - imagerect.left, 0 );
end;
// Сместить прямоугольник вниз.
OffsetRect( imagerect, -imagerect.left,
imagerect.bottom - imagerect.top );
end;
End;
finally
// Для того, чтобы метод TCanvas.Free не удалил контекст устройства
cv.Handle := 0;
cv.free;
end;
End;
end;
procedure TJvBMPListBox.DrawItem(Index: Integer; Rect: TRect;
State: TOwnerDrawState);
begin
// draw text transparently
Canvas.Brush.Style := bsClear;
// always use font color, CNDrawItem sets it to clHighlitetext for
// selected items.
Canvas.Font.Color := Font.Color;
// The listbox не очищает background для элемента перед посылкой сообщения
// WM_DRAWITEM! Нам необходимо сделать это вручную.
// SaveDC копирует состояние контекста устройства (brush,pen,font,palette,
// drawing mode, mapping mode, region, etc) в стек контекстов.
SaveDC( Canvas.handle );
// IntersectClipRect создает новую область рисования из пересечения текущей
// области рисования (clipping region) и заданного прямоугольника
IntersectClipRect( canvas.handle, rect.left, rect.top, rect.right, rect.bottom );
// Вызов метода WMEraseBkGnd вручную.
perform( WM_ERASEBKGND, canvas.handle, 0 );
// Восстановление текущего состояния контекста устройства из стека,
// -1 указывает на последнее сохраненное состояние.
RestoreDC( Canvas.Handle, -1 );
If (Index >= 0) and (Index < Items.Count) Then
Canvas.TextOut( Rect.left+2, Rect.top, Items[Index]);
// Функция InvertRect инвертирует цвет каждой точки в регионе, заданном
// прямоугольником. Для того, чтобы выделенный элемент отличался от невы-
// деленных, мы инвертируем его область.
If odSelected In State Then
InvertRect( Canvas.Handle, Rect );
// Не надо рисовать фокус, CNDrawItem сделает это за нас
end;
Страницы: 1 вся ветка
Текущий архив: 2003.04.03;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.013 c