Не, ребят вот гляньте код создаёт окно в виде рисунка, только вот кнопку тоже в виде рисунка поместить на это окно неправильной формы - неудалось, а так ведь по идеи на этом окне подобным способом можно сделать неправильную кнопку.
#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;
}
Ну что думаете по этому поводу? Есть варианты приаттачить кнопку неправилной формы к етому окошку?