typedef void (CALLBACK*DLLFUNC2)(HWND,int,int,int);
DLLFUNC2 SetLayeredWindowAttributes;
SetWindowLongA(hWnd,GWL_EXSTYLE,WS_EX_LAYERED | GetWindowLongA(hWnd,GWL_EXSTYLE));
SetLayeredWindowAttributes=(DLLFUNC2)GetProcAddress(GetModuleHandleA("User32.dll"),"SetLayeredWindowAttributes");
while(Alpha!=255)
{
if(Alpha==45)
{
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
}
Sleep(15);
SetLayeredWindowAttributes(hWnd,Alpha,Alpha,LMA_COLORKEY | LMA_ALPHA);
Alpha=Alpha+15;
}
ShowWindow(hWnd, SW_SHOW);
Alpha=240
Плавное появление окна используя SetLayeredWindowAttributes()?
for (i = 1; i < 100; i++)
{
SetLayeredWindowAttributes();
...
}
Спасибо всем за "добрые" советы!
Код:
правда ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd); особо и ненужны если у тебя простое окно, а я их использовал для плавного появления картинки.
Мой первоначальный код:
Код:
#include "stdafx.h"
#include <windows.h>
LRESULT CALLBACK WindowFunc(HWND, UINT,WPARAM,LPARAM);
char szWinName[] = "MyApp";
HINSTANCE hInst;
HBITMAP maskBitmap;
HWND hwnd;
bool dragging=false;
POINT MousePnt;
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode)
{
HWND hwnd;
MSG msg;
WNDCLASSEX wcl;
BITMAP bi;
BYTE bpp;
DWORD TransPixel;
DWORD pixel;
int startx;
INT i, j;
wcl.hInstance = hThisInst;
wcl.lpszClassName = szWinName;
wcl.lpfnWndProc = WindowFunc;
wcl.style = CS_HREDRAW | CS_VREDRAW;
wcl.cbSize = sizeof(WNDCLASSEX);
wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wcl.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
wcl.hCursor = LoadCursor(NULL, IDC_ARROW);
wcl.lpszMenuName = NULL;
wcl.cbClsExtra = 0;
wcl.cbWndExtra = 0;
wcl.hbrBackground = (HBRUSH) GetStockObject(3);
if(!RegisterClassEx(&wcl)) return 0;
hwnd = CreateWindow(szWinName, szWinName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, 200, 200, NULL, NULL, hThisInst, NULL);
int Style;
Style = GetWindowLong(hwnd, GWL_STYLE);
Style=Style || WS_CAPTION;
Style=Style || WS_SYSMENU;
SetWindowLong(hwnd, GWL_STYLE, Style);
ShowWindow(hwnd, nWinMode);
UpdateWindow(hwnd);
maskBitmap = (HBITMAP)LoadImage(NULL, "mask.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
if (!maskBitmap) return NULL;
HRGN Rgn, ResRgn = CreateRectRgn(0, 0, 0, 0);
GetObject(maskBitmap, sizeof( BITMAP ), &bi);
bpp = bi.bmBitsPixel >> 3;
BYTE *pBits = new BYTE[ bi.bmWidth * bi.bmHeight * bpp ];
int p = GetBitmapBits( maskBitmap, bi.bmWidth * bi.bmHeight * bpp, pBits );
TransPixel = *(DWORD*)pBits;
TransPixel <<= 32 - bi.bmBitsPixel;
for (i = 0; i < bi.bmHeight; i++)
{
startx=-1;
for (j = 0; j < bi.bmWidth; j++)
{
pixel = *(DWORD*)(pBits + (i * bi.bmWidth + j) * bpp) << (32 - bi.bmBitsPixel);
if (pixel != TransPixel)
{
if (startx<0)
{
startx = j;
} else if (j == (bi.bmWidth - 1))
{
Rgn = CreateRectRgn( startx, i, j, i + 1 );
CombineRgn( ResRgn, ResRgn, Rgn, RGN_OR);
startx=-1;
}
} else if (startx>=0)
{
Rgn = CreateRectRgn(startx, i, j, i + 1);
CombineRgn(ResRgn, ResRgn, Rgn, RGN_OR);
startx=-1;
}
}
}
delete pBits;
SetWindowRgn(hwnd, ResRgn, TRUE);
InvalidateRect(hwnd, 0, false);
while(GetMessage(&msg, NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
HDC hdcBits;
RECT wndrect;
POINT point;
switch (message)
{
/*case WM_CLOSE:
AnimateWindow(hwnd, 1000, AW_BLEND | AW_HIDE);
return DefWindowProc(hwnd, message, wParam, lParam);
//вот здесь и есть косяк с AnimateWindow() сначала медлено
//появляется окно, а потом мгновенно изображение!
case WM_CREATE:
AnimateWindow(hwnd, 1000, AW_BLEND | AW_SLIDE);
break;*/
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
hdcBits = CreateCompatibleDC(hdc);
SelectObject(hdcBits, maskBitmap);
BitBlt(hdc, 0, 0, 200, 200, hdcBits, 0, 0, SRCCOPY);
DeleteDC(hdcBits);
EndPaint(hwnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_LBUTTONDOWN:
GetCursorPos(&MousePnt);
dragging = true;
SetCapture(hwnd);
break;
case WM_MOUSEMOVE:
if (dragging)
{
GetCursorPos(&point);
GetWindowRect(hwnd, &wndrect);
wndrect.left = wndrect.left+(point.x - MousePnt.x);
wndrect.top = wndrect.top +(point.y - MousePnt.y);
SetWindowPos(hwnd, NULL, wndrect.left, wndrect.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
MousePnt=point;
}
break;
case WM_LBUTTONUP:
if (dragging)
{
dragging=false;
ReleaseCapture();
}
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}
#include <windows.h>
LRESULT CALLBACK WindowFunc(HWND, UINT,WPARAM,LPARAM);
char szWinName[] = "MyApp";
HINSTANCE hInst;
HBITMAP maskBitmap;
HWND hwnd;
bool dragging=false;
POINT MousePnt;
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode)
{
HWND hwnd;
MSG msg;
WNDCLASSEX wcl;
BITMAP bi;
BYTE bpp;
DWORD TransPixel;
DWORD pixel;
int startx;
INT i, j;
wcl.hInstance = hThisInst;
wcl.lpszClassName = szWinName;
wcl.lpfnWndProc = WindowFunc;
wcl.style = CS_HREDRAW | CS_VREDRAW;
wcl.cbSize = sizeof(WNDCLASSEX);
wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wcl.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
wcl.hCursor = LoadCursor(NULL, IDC_ARROW);
wcl.lpszMenuName = NULL;
wcl.cbClsExtra = 0;
wcl.cbWndExtra = 0;
wcl.hbrBackground = (HBRUSH) GetStockObject(3);
if(!RegisterClassEx(&wcl)) return 0;
hwnd = CreateWindow(szWinName, szWinName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, 200, 200, NULL, NULL, hThisInst, NULL);
int Style;
Style = GetWindowLong(hwnd, GWL_STYLE);
Style=Style || WS_CAPTION;
Style=Style || WS_SYSMENU;
SetWindowLong(hwnd, GWL_STYLE, Style);
ShowWindow(hwnd, nWinMode);
UpdateWindow(hwnd);
maskBitmap = (HBITMAP)LoadImage(NULL, "mask.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
if (!maskBitmap) return NULL;
HRGN Rgn, ResRgn = CreateRectRgn(0, 0, 0, 0);
GetObject(maskBitmap, sizeof( BITMAP ), &bi);
bpp = bi.bmBitsPixel >> 3;
BYTE *pBits = new BYTE[ bi.bmWidth * bi.bmHeight * bpp ];
int p = GetBitmapBits( maskBitmap, bi.bmWidth * bi.bmHeight * bpp, pBits );
TransPixel = *(DWORD*)pBits;
TransPixel <<= 32 - bi.bmBitsPixel;
for (i = 0; i < bi.bmHeight; i++)
{
startx=-1;
for (j = 0; j < bi.bmWidth; j++)
{
pixel = *(DWORD*)(pBits + (i * bi.bmWidth + j) * bpp) << (32 - bi.bmBitsPixel);
if (pixel != TransPixel)
{
if (startx<0)
{
startx = j;
} else if (j == (bi.bmWidth - 1))
{
Rgn = CreateRectRgn( startx, i, j, i + 1 );
CombineRgn( ResRgn, ResRgn, Rgn, RGN_OR);
startx=-1;
}
} else if (startx>=0)
{
Rgn = CreateRectRgn(startx, i, j, i + 1);
CombineRgn(ResRgn, ResRgn, Rgn, RGN_OR);
startx=-1;
}
}
}
delete pBits;
SetWindowRgn(hwnd, ResRgn, TRUE);
InvalidateRect(hwnd, 0, false);
while(GetMessage(&msg, NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
HDC hdcBits;
RECT wndrect;
POINT point;
switch (message)
{
/*case WM_CLOSE:
AnimateWindow(hwnd, 1000, AW_BLEND | AW_HIDE);
return DefWindowProc(hwnd, message, wParam, lParam);
//вот здесь и есть косяк с AnimateWindow() сначала медлено
//появляется окно, а потом мгновенно изображение!
case WM_CREATE:
AnimateWindow(hwnd, 1000, AW_BLEND | AW_SLIDE);
break;*/
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
hdcBits = CreateCompatibleDC(hdc);
SelectObject(hdcBits, maskBitmap);
BitBlt(hdc, 0, 0, 200, 200, hdcBits, 0, 0, SRCCOPY);
DeleteDC(hdcBits);
EndPaint(hwnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_LBUTTONDOWN:
GetCursorPos(&MousePnt);
dragging = true;
SetCapture(hwnd);
break;
case WM_MOUSEMOVE:
if (dragging)
{
GetCursorPos(&point);
GetWindowRect(hwnd, &wndrect);
wndrect.left = wndrect.left+(point.x - MousePnt.x);
wndrect.top = wndrect.top +(point.y - MousePnt.y);
SetWindowPos(hwnd, NULL, wndrect.left, wndrect.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
MousePnt=point;
}
break;
case WM_LBUTTONUP:
if (dragging)
{
dragging=false;
ReleaseCapture();
}
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}
Библиотеки отключишь некоторые.
Огромное спасибо Scaiman, код конечно хороший, но это уж точно для таких как Вы - Специалистов, нельзя бы показать на моём более простом и понятном, пожалуйста?
void __fastcall TForm1::ButtonClick(TObject *Sender)
{
Form1->AlphaBlend=true;
for(int i=0; i<=255; ++i)
{
Form1->AlphaBlendValue=i;
Sleep(500);
}
Form1->AlphaBlend=false;
}
Спасибо nuqta. Вот обработал код Scaiman, чтоб BMP-ха вместо PNG образовавало нестандартное окно, которое медленно появляется, но что-то не так... Люди добрые помогите найти неисправность! Please...
Область окна появляется плавно, но оно не нестандартное, а обычное квадратное и BMP не появляется, зато появляется и исчезает плавно!
Заюзай GDI+ и в цикле через тот же sleep показывай окно. Что тут сложного?! А еще лучше запусти таймер... Что значит "Не появляется BMP"? Оно у тебя без извращений с плавным появлением окна отображалось? И вообще- объясни толком- ЧЕГО ТЫ ХОЧЕШЬ ДОБИТЬСЯ?! А то, что- то я не уяснил.