Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Прозрачные подписи под значками SysListView32 на WinApi [D6, WinXP]


DVM ©   (2003-03-11 13:02:00) 

Есть следующий код, создающий окно похожее чем то на окно Progman-а, т.е сквозь него "просвечивает" Desktop со своей картинкой. Никак не могу сделать прозрачные надписи у значков!

program listview;

uses
windows,
messages,
commctrl;

var
wc : TWndClassEx;
MainWnd,lv,himlLarge : HWND;
Mesg : TMsg;
oldLV : Pointer;
lvi : TLVItemA;
xPos,yPos,nWidth,nHeight : Integer;

function LVProc(wnd:HWND; Msg : Integer; Wparam:Wparam; Lparam:Lparam):Lresult; stdcall;
var dc:THandle;
ps:TPaintStruct;
rect:Trect;
Begin
case msg of

WM_ERASEBKGND:
begin
DC:=BeginPaint(lv, ps);
PaintDesktop(DC);
EndPaint(lv, ps);
Result:=0;
end;
else
Result:=CallWindowProc(oldLV,wnd,msg,wParam,lParam);
end;
end;

function WindowProc(wnd:HWND; Msg : Integer; Wparam:Wparam; Lparam:Lparam):Lresult; stdcall;
var dc:THandle;
ps:TPaintStruct;
rect:Trect;
Begin
case msg of


WM_ERASEBKGND:
begin
DC:=BeginPaint(MainWnd, ps);
PaintDesktop(DC);
EndPaint(MainWnd, ps);
Result:=0;
end;
wm_destroy :
Begin
Result:=0;
postquitmessage(0);
exit;
End;
else Result:=DefWindowProc(wnd,msg,wparam,lparam);
end;
End;

begin
wc.cbSize:=sizeof(wc);
wc.style:=cs_hredraw or cs_vredraw;
wc.lpfnWndProc:=@WindowProc;
wc.cbClsExtra:=0;
wc.cbWndExtra:=0;
wc.hInstance:=HInstance;
wc.hIcon:=LoadIcon(0,idi_application);
wc.hCursor:=LoadCursor(0,idc_arrow);
wc.hbrBackground:=COLOR_BTNFACE+1;
wc.lpszMenuName:=nil;
wc.lpszClassName:="WndClass1";
RegisterClassEx(wc);
xPos:=0;yPos:=0;
nWidth:=GetSystemMetrics(SM_CXSCREEN);
nHeight:=GetSystemMetrics(SM_CYSCREEN);
MainWnd:=CreateWindowEx(WS_EX_TOOLWINDOW,"WndClass1","Caption",WS_POPUP,xPos,yPos,nWidth,nHeight,0,0,Hinstance,nil);
ShowWindow(MainWnd,CmdShow);

lv:=CreateWindowEx(0,WC_LISTVIEW,"",lvs_singlesel or lvs_icon or ws_child
or ws_visible or ws_border or LVS_SHOWSELALWAYS, 0,0,500,500, MainWnd,
0,Hinstance,nil);

oldLV:=Pointer(SetWindowLong(LV,gwl_wndproc,Integer(@LVProc)));

himlLarge := ImageList_Create(GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), ILC_COLOR32 or ILC_MASK, 1, 1);
ImageList_AddIcon(himlLarge, LoadIcon(0,idi_application));

ListView_SetImageList(LV, himlLarge, LVSIL_NORMAL);

lvi.mask := LVIF_TEXT or LVIF_IMAGE or LVIF_PARAM or LVIF_STATE;
lvi.state := 0;
lvi.iImage := 0;

lvi.pszText := pchar("Значок1");
ListView_InsertItem(LV, lvi);
lvi.pszText := pchar("Значок2");
ListView_InsertItem(LV, lvi);
lvi.pszText := pchar("Значок3");
ListView_InsertItem(LV, lvi);

ListView_SetBkColor(lV,CLR_NONE);
ListView_SetTextColor(LV,RGB(255,255,255));
ListView_SetTextBkColor(LV,CLR_NONE);

While GetMessage(Mesg,0,0,0) do
begin
TranslateMessage(Mesg);
DispatchMessage(Mesg);
end;
end.


DVM   (2003-03-11 15:41:00) [1]


> ers


> Посылать листвиев это сообшение "WM_ERASEBKGND"

Это то понятно, я могу и Desktop перерисовать если надо, но КОГДА это надо делать? Дело в том что если я ставлю перерисовку десктопа в обработчик сообщения нажатия кнопки мыши над итемом, то нажатия не происходит, т.к. не вызывается стандартный обработчик, если же его вызвать после, то итем опять покрасится (как мне и не надо).


ers   (2003-03-11 15:15:00) [2]

Посылать листвиев это сообшение "WM_ERASEBKGND"


ers   (2003-03-11 13:48:00) [3]

Извиняюсь за оффтопик:
DVM спасибо ты мне сейчас более ответил на вопрос который меня уже давно беспокоил;)))))))

А теперь не оффтопик;))))
Может онкликомобновлять если это возможно?


DVM   (2003-03-11 13:08:00) [4]

Точнее говоря, надо сделать фон надписей прозрачным. На самом деле он становится прозрачным, но до щелчка мышью на значке. Как избавится от этого побочного эффекта?


Наверх

Титульная страница Поиск, карта сайта Написать письмо