Не, ребят вот гляньте код создаёт окно в виде рисунка, только вот кнопку тоже в виде рисунка поместить на это окно неправильной формы - неудалось, а так ведь по идеи на этом окне подобным способом можно сделать неправильную кнопку.
#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 hRgn, ResRgn;
HDC myDC;
HBITMAP hBitmap;
MY_FUNC SetLayeredWindowAttributes;
int Alpha;
BITMAP bi;
BYTE bpp;
DWORD TransPixel;
DWORD pixel;
int startx;
int i, j;
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);
};
int iWinX = 357;
int iWinY = 595;
hWnd = CreateWindow("Test", "TestWindow", CW_USEDEFAULT, GetSystemMetrics (SM_CXSCREEN)/2-iWinX/2,
GetSystemMetrics (SM_CYSCREEN)/2-iWinY/2,
iWinX, iWinY, 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");
hDc = GetWindowDC(hWnd);
hMemDC = CreateCompatibleDC(hDc);
SelectObject(hMemDC, hBitmap);
GetWindowRect(hWnd, &Rects);
GetClientRect(hWnd, &Rects);
myDC = hMemDC;
hBitmap = (HBITMAP)LoadImage(NULL, "bitmap3.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
if (!hBitmap) return NULL;
HRGN Rgn, ResRgn = CreateRectRgn(0, 0, 0, 0);
GetObject(hBitmap, sizeof(BITMAP), &bi);
bpp = bi.bmBitsPixel >> 3;
BYTE *pBits = new BYTE[ bi.bmWidth * bi.bmHeight * bpp ];
int p = GetBitmapBits( hBitmap, 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);
Alpha = 0;
while(Alpha != 255)
{
if(Alpha == 45)
{
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
}
Sleep(10);
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);
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;
}
Ну что думаете по этому поводу? Есть варианты приаттачить кнопку неправилной формы к етому окошку?