Программирование на C++ глазами хакера


Безбашенные окна - часть 3


Листинг 3.4. Создание окна произвольной формы на основе маски
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { // TODO: Place code here. MSG msg; HACCEL hAccelTable;

// Initialize global strings LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_MASKWINDOW, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance);

// Perform application initialization: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; }

hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_MASKWINDOW);

// Следующий код вы должны добавить // Сначала убираем обрамление int Style; Style = GetWindowLong(hWnd, GWL_STYLE); Style=Style || WS_CAPTION; Style=Style || WS_SYSMENU; SetWindowLong(hWnd, GWL_STYLE, Style); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd);

// Загружаем картинку maskBitmap = (HBITMAP)LoadImage(NULL, "mask.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

if (!maskBitmap) return NULL;

// Описание необходимых переменных BITMAP bi; BYTE bpp; DWORD TransPixel; DWORD pixel; int startx; INT i, j;

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); //Конец добавляемого кода




Начало  Назад  Вперед



Книжный магазин