![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Прозрачность в TglListBox (class(TCustomListBox)) [D6, WinXP]
Kripton © (2005-08-19 05:57:00)Извините, это опять я.
Сначала приведу код. Ненужное удалено.
unit Unit1;
interface
uses
const
cUseAlpha: array [Boolean] of Integer = (0, LWA_ALPHA);
cUseColorKey: array [Boolean] of Integer = (0, LWA_COLORKEY);
sUser32 = 'User32.dll';
private
SetLayeredWindowAttributes: TSetLayeredWindowAttributes;
ModH : HMODULE;
Style: integer;
название процедуры;
type
TSetLayeredWindowAttributes = function (Hwnd: THandle; crKey: COLORREF; bAlpha: Byte; dwFlags: DWORD): Boolean; stdcall;
procedure TForm1.SetTransparentWindow(WND: HWND; AlphaBlend,
TransparentColor: boolean; AlphaBlendValue: byte;
TransparentColorValue: integer);
begin
ModH := GetModuleHandle(sUser32);
if ModH <> 0 then
begin
@SetLayeredWindowAttributes := GetProcAddress(ModH, 'SetLayeredWindowAttributes');
Style := GetWindowLong(WND, GWL_EXSTYLE);
if AlphaBlend or TransparentColor then
begin
if (Style and WS_EX_LAYERED) = 0 then
begin
SetWindowLong(WND, GWL_EXSTYLE, Style or WS_EX_LAYERED);
SetLayeredWindowAttributes(WND, TransparentColorValue, AlphaBlendValue,
cUseAlpha[AlphaBlend] or cUseColorKey[TransparentColor]);
end;
end
else
begin
SetWindowLong(WND, GWL_EXSTYLE, Style and not WS_EX_LAYERED);
RedrawWindow(WND, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_FRAME or RDW_ALLCHILDREN);
end;
end;
end;
Если кто-нибудь работал с этим, то очень прошу помочь. Когда я применяю данную процедуру, то пишу в FormShow
SetTransparentWindow(Listbox1.Handle,True,False,170,0);
Если оставить только Handle, то всё работает для всей формы со всем, что на ней находится. Объясните, пожалуйста, почему так нельзя сделать для только одного ListBox'а(TglListBox)? А как можно и можно ли?
alpet (2005-08-19 07:10:00) [1]See MSDN Layered Windows, UpdateLayeredWindowfunction.
"Note that WS_EX_LAYERED cannot be used for child windows"