Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.04.03;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.04.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.012 c
14-6742
race1
2003-03-15 13:19
2003.04.03
(pascal & GUI):=True


4-6848
chudaks
2003-02-05 16:11
2003.04.03
Как заархивитровать из своей программы


1-6433
MAXXX
2003-03-23 16:59
2003.04.03
Многострочная ячейка. КАК ЭТО СДЕЛАТЬ ????


14-6741
Сергей Суровцев
2003-03-16 22:13
2003.04.03
Над всей Испанией безоблачное небо


14-6746
Николай Быков
2003-03-16 17:27
2003.04.03
---|Ветка была без названия|---





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский