![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ListView и фоновая картинка [D7, WinXP]
tytus © (2008-01-09 12:50:00)Доброго дня мастера. Вот пытаюсь рисовать фоновую картинку на онном компоненте посредством сообщения LVM_SETBKIMAGE.
Исходные данные:
LV1 - TListView (но переделанный - перекрыта WndProc)
ViewStyle=vsReport, три столбца, якоря по всем углам
Image3 - TImage, в нем картинка bmp 206х25
LVBmp - TBitMap - для фоновой картинки
теперь процедура:
procedureTMainFm.SetBkImage;
var
pw,ph,w,h:integer;
begin
pw:=Image3.Picture.Bitmap.Width;
ph:=Image3.Picture.Bitmap.Height;
w:=LV1.Width;
h:=LV1.Height;
LVBmp.Width:=w;
LVBmp.Height:=h;
StretchBlt(LVBmp.Canvas.Handle,0,0,w,h,
Image3.Picture.Bitmap.Canvas.Handle,0,0,pw,ph,SRCCOPY);
FillChar(LVBKIMAGE,SizeOf(LVBKIMAGE),0);
LVBKIMAGE.ulFlags:=LVBKIF_SOURCE_HBITMAP or LVBKIF_STYLE_TILE;
LVBKIMAGE.hbm:=LVBmp.Handle;
LVBKIMAGE.pszImage:=nil;
LVBKIMAGE.xOffsetPercent:=0;
LVBKIMAGE.yOffsetPercent:=0;
SendMessage(LV1.Handle,LVM_SETTEXTBKCOLOR,0,CLR_NONE);
SendMessage(LV1.Handle,LVM_SETBKIMAGE,0,Integer(@LVBKIMAGE));
end;
Все рисуеццо нормально, но когда размер LV1 уменьшаеться так, что появляются полосы прокрутки (гор. к прим.) то вылетает ошибка "EInvalidGraphic with message Bitmap Image is not valid"
При увеличении контрола - все ОК.
Сию процедуру вызываю в обработчике OnResize LV1.
Вот прошу помощи в сем нелегком деле - как правильно рисовать фоновую картинку?
tytus (2008-01-11 11:12:00) [1]>clickmaker © (11.01.08 10:32) [10]
ок, будем разбираться со своей процедурой SetBkImage...
clickmaker (2008-01-11 10:32:00) [2]ну если из OnResize вызывается только SetBkImage, то, видимо, ошибка при манипуляциях с одним из Image или Bitmap.
Invalid Graphic - исключение VCL, а не виндозного ListView, оберткой которого является TListView
tytus (2008-01-11 09:57:00) [3]>clickmaker © (10.01.08 18:59) [8]
посмотрел. Получается, что последние вызовы процедур в списке call stack начинаются сначала, тоесть в начале списка. На что обратить внимание? На процедуры, где вместо параметров знаки вопроса? К примеру вот такие строки:
TMainFm.LV1Resize(???);
...
TBkListView.WndProc(???);- это я написал компонент, добавив лишь сию процедуру:
procedureTBkListView.WndProc( var Message:TMessage);
begin
if Message.Msg=WM_ERASEBKGND then
DefaultHandler( Message)
else
inheritedWndProc( Message);
end;
Самым первым в списке идет сообщение "Invalid Graphic ($425B88)".
Вот так, и что из этого мне может быть полезным?
clickmaker (2008-01-10 18:59:00) [4]
> [7] tytus (10.01.08 18:54)
посмотри стек вызовов (call stack), откуда ноги растут
tytus (2008-01-10 18:54:00) [5]>clickmaker © (10.01.08 18:50) [6]
нашел... подсветилась строка в модуле Graphics
в процедуре :
procedureInvalidGraphic(Str: PResStringRec);
begin
raiseEInvalidGraphic.CreateRes(Str);
end;
что-то мне сдаеться, что проблема нерешаемая...
clickmaker (2008-01-10 18:50:00) [6]
> [5] tytus (10.01.08 18:46)
чё, правда?
так до второго пришествия можно баги ловить.
в project options - compiler
галки поставь, потом rebuild all
tytus (2008-01-10 18:46:00) [7]>clickmaker © (10.01.08 18:33) [4]
первый раз о таком слышу... где это?
clickmaker (2008-01-10 18:33:00) [8]
> [3] tytus (10.01.08 18:31)
да ладно. Отладочные галки включены? use debug dcu и иже с нею?
tytus (2008-01-10 18:31:00) [9]>clickmaker © (10.01.08 12:45) [2]
в том то и дело, что строка не подсвечивается.
(только не нужно говорить что ошибка в 17 стр -)))
clickmaker (2008-01-10 12:45:00) [10]
> [1] tytus (10.01.08 12:32)
на какой строке вылетает означенная ошибка?
tytus (2008-01-10 12:32:00) [11]не интересно ? - ну и ладно....