Привет Всем! Пытаюсь написать прогу, цель получить при создании нестандартного(в виде картинки) окна и его закрытии плавное появление и исчезновение. Помогите пожалуйста. Буду очень благодарен за помощь.
В "помощь" пример моего неработающего кода (окно плавно появляется но не обрезается по картинке) и компилированная прога какого-то автора кейгена.
#define _WIN32_WINNT 0x0500
#include "stdafx.h"
#include <windows.h>
#include <shlwapi.h>
#include <commctrl.h>
#include <resource.h>
#pragma comment(lib, "comctl32.lib")
#pragma comment(lib, "gdi32.lib")
#pragma comment(lib, "shlwapi.lib")
typedef void (CALLBACK*MY_FUNC)(HWND,int,int,int);
const int LMA_ALPHA = 2, LMA_COLORKEY = 1, WS_EX_LAYERED = 0x80000;
int WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
HINSTANCE hInstance;
WNDCLASS wc;
MSG msg;
RECT Rects;
PAINTSTRUCT ps;
HDC hDc;
HDC hMemDC;
HRGN hRng;
HDC myDC;
HBITMAP hBitmap;
MY_FUNC SetLayeredWindowAttributes;
int Alpha;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HWND hWnd;
hInstance = GetModuleHandle(0);
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc = (WNDPROC) WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = 0;
wc.lpszMenuName = NULL;
wc.lpszClassName = "Test";
if(!RegisterClass(&wc))
{
MessageBox(0,"Невозможно зарегестрировать класс.","Error",MB_OK|MB_ICONERROR);
ExitProcess(0);
};
hWnd = CreateWindow("Test", "TestWindow", CW_USEDEFAULT, 0, 0, 357, 595, NULL, NULL, hInstance, NULL);
if(!hWnd)
{
MessageBox(0, "Возникла ошибка при создании окна.", "Error", MB_OK|MB_ICONERROR);
ExitProcess(0);
};
SetFocus(hWnd);
while (msg.message != WM_QUIT)
{
GetMessage(&msg, NULL, 0, 0);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
int WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
{
SetWindowLongA(hWnd, GWL_EXSTYLE, WS_EX_LAYERED | GetWindowLongA(hWnd, GWL_EXSTYLE));
SetLayeredWindowAttributes = (MY_FUNC)GetProcAddress(GetModuleHandleA("User32.dll"), "SetLayeredWindowAttributes");
//hBitmap=LoadBitmap(hInstance,"bitmap3.bmp");
//hBitmap = (HBITMAP)LoadImage (hInstance, MAKEINTRESOURCE (IDB_BITMAP3),IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
hDc = GetWindowDC(hWnd);
hMemDC = CreateCompatibleDC(hDc);
SelectObject(hMemDC, hBitmap);
GetWindowRect(hWnd, &Rects);
GetClientRect(hWnd, &Rects);
myDC = hMemDC;
//hRng=Region(hMemDC,Rects.right,Rects.bottom);
hRng = CreateRectRgn(0, 0, Rects.right, Rects.bottom);
SetWindowRgn(hWnd, hRng, TRUE);
Alpha = 0;
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;
ReleaseDC(hWnd, hDc);
DeleteDC(hMemDC);
break;
}
case WM_DESTROY:
{
DeleteObject(hBitmap);
PostQuitMessage(0);
break;
}
case WM_PAINT:
{
GetClientRect(hWnd, &Rects);
hDc = BeginPaint(hWnd, &ps);
//Rectangle (hDc,0,0,100,100);
hMemDC = CreateCompatibleDC(hDc);
SelectObject(hMemDC, hBitmap);
BitBlt(hDc, 0, 0, Rects.right, Rects.bottom, hMemDC, 0, 0, SRCCOPY);
DeleteDC(hMemDC);
EndPaint(hWnd, &ps);
SetLayeredWindowAttributes(hWnd, Alpha, Alpha, LMA_COLORKEY | LMA_ALPHA);
break;
}
case WM_LBUTTONDOWN:
{
ReleaseCapture();
SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);
break;
}
case WM_CLOSE:
{
Alpha = 255;
while(Alpha != 0)
{
Sleep(15);
SetLayeredWindowAttributes(hWnd, Alpha, Alpha, LMA_COLORKEY | LMA_ALPHA);
Alpha = Alpha - 15;
};
PostQuitMessage(0);
break;
}
default:
{
return (DefWindowProc(hWnd, message, wParam, lParam));
break;
}
break;
}
return 0;
}