Смаргивает черный фон в прозрачном окне
От: Денис Фадин Россия  
Дата: 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 );
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.