Форум: "WinAPI";
Текущий архив: 2003.05.12;
Скачать: [xml.tar.bz2];
ВнизПрозрачные подписи под значками SysListView32 на WinApi Найти похожие ветки
← →
DVM (2003-03-11 13:02) [0]Есть следующий код, создающий окно похожее чем то на окно 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 13:08) [1]Точнее говоря, надо сделать фон надписей прозрачным. На самом деле он становится прозрачным, но до щелчка мышью на значке. Как избавится от этого побочного эффекта?
← →
ers (2003-03-11 13:48) [2]Извиняюсь за оффтопик:
DVM спасибо ты мне сейчас более ответил на вопрос который меня уже давно беспокоил;)))))))
А теперь не оффтопик;))))
Может онкликомобновлять если это возможно?
← →
ers (2003-03-11 15:15) [3]Посылать листвиев это сообшение "WM_ERASEBKGND"
← →
DVM (2003-03-11 15:41) [4]
> ers
> Посылать листвиев это сообшение "WM_ERASEBKGND"
Это то понятно, я могу и Desktop перерисовать если надо, но КОГДА это надо делать? Дело в том что если я ставлю перерисовку десктопа в обработчик сообщения нажатия кнопки мыши над итемом, то нажатия не происходит, т.к. не вызывается стандартный обработчик, если же его вызвать после, то итем опять покрасится (как мне и не надо).
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.05.12;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c