Смаргивает черный фон в прозрачном окне
От: Денис Фадин Россия  
Дата: 20.10.06 13:31
Оценка:
Доброго времени суток!
Использую стиль WS_EX_LAYERED и ф-цию SetLayeredWindowAttributes для создания прозрачного окна. Все работает, вот только есть один неприятный эффект: когда окно появляется на экран, сначала отрисовывается черный фон, а потом само окно. Кто нибудь может помочь?

Вот код:

#include <windows.h>

LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow )
{
static char szAppName[] = "HelloWin" ;
HWND hwnd ;
MSG msg ;

WNDCLASSEX wndclass ;

wndclass.cbSize = sizeof (wndclass) ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;

wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;

wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION) ;

RegisterClassEx (&wndclass) ;

hwnd = CreateWindow (szAppName, // window class name
"The Hello Program", // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size

CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters

const int LWA_COLORKEY = 0x00000001;
const int WS_EX_LAYERED = 0x00080000;
typedef BOOL (WINAPI *PFN)( HWND hWnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags );
static HMODULE hm = GetModuleHandle( "USER32.DLL" );
static PFN pfn = (PFN)GetProcAddress( hm, "SetLayeredWindowAttributes" );
if( pfn )
{
SetWindowLong( hwnd,GWL_EXSTYLE, GetWindowLong( hwnd,GWL_EXSTYLE)|WS_EX_LAYERED );
pfn( hwnd, GetSysColor( COLOR_BTNFACE ), 0, LWA_COLORKEY );
UpdateWindow( hwnd );
}

ShowWindow( hwnd, iCmdShow );
UpdateWindow( hwnd );

while( GetMessage (&msg, NULL, 0, 0) )
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}

return (int)msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
switch (iMsg)
{

case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint( hwnd, &ps );
FillRect( hdc, &ps.rcPaint, GetSysColorBrush( COLOR_BTNFACE ) );
EndPaint( hwnd, &ps );
return 0;
}
case WM_DESTROY:
PostQuitMessage( 0 );
return 0;
}

return DefWindowProc( hwnd, iMsg, wParam, lParam );
}
Re: Смаргивает черный фон в прозрачном окне
От: Danchik Украина  
Дата: 20.10.06 13:38
Оценка:
Здравствуйте, Денис Фадин, Вы писали:

ДФ>Доброго времени суток!

ДФ>Использую стиль WS_EX_LAYERED и ф-цию SetLayeredWindowAttributes для создания прозрачного окна. Все работает, вот только есть один неприятный эффект: когда окно появляется на экран, сначала отрисовывается черный фон, а потом само окно. Кто нибудь может помочь?

[Skip]

Попробуйте обработать кроме WM_PAINT также WM_ERASEBACKGROUND и ничего там не делать.
Re[2]: Смаргивает черный фон в прозрачном окне
От: Денис Фадин Россия  
Дата: 20.10.06 13:58
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Попробуйте обработать кроме WM_PAINT также WM_ERASEBACKGROUND и ничего там не делать.


Пробовал, не помогает!
Re: Смаргивает черный фон в прозрачном окне
От: Денис Фадин Россия  
Дата: 30.10.06 07:06
Оценка:
Получается что никто не знает как решить эту проблему!

Может кто подскажет как другим способом сделать прозрачное POPUP окно?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.