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

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

Прозрачность в 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"


Наверх

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