#include "stdafx.h" #include LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); HINSTANCE hInst; HBITMAP hBm, hMask; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; WNDCLASSEX wcex; HWND hWnd; hInst = hInstance; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.hInstance = hInstance; wcex.lpszClassName = L"Window"; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(113, 113, 113)); wcex.lpszMenuName = NULL; wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION); if (!RegisterClassEx(&wcex)) return 0; hWnd = CreateWindow(wcex.lpszClassName, L"Nepryakhin 3121", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 518, 545, NULL, NULL, hInstance, NULL); if (!hWnd) return false; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: hBm = (HBITMAP)LoadImage(hInst, L"image1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); hMask = (HBITMAP)LoadImage(hInst, L"mask.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); break; case WM_PAINT: PAINTSTRUCT ps; BITMAP bm, mask; HDC hdc, hdcSrc, hdcMask; hdc = BeginPaint(hWnd, &ps); GetObject(hBm, sizeof(bm), &bm); hdcSrc = CreateCompatibleDC(NULL); SelectObject(hdcSrc, hBm); GetObject(hMask, sizeof(mask), &mask); hdcMask = CreateCompatibleDC(NULL); SelectObject(hdcMask, hMask); StretchBlt(hdcMask, 0, 0, 50, 50, hdcMask, 0, 0, 250, 250, SRCCOPY); for (int i = 0; i < 50; i++) { for (int j = 0; j < 50; j++) { int xBmPixel = 450 + i; int yBmPixel = 450 + j; COLORREF maskPixel = GetPixel(hdcMask, i, j); COLORREF bmPixel = GetPixel(hdcSrc, xBmPixel, yBmPixel); if (maskPixel != 0x00FFFFFF) { int r = (BYTE)(bmPixel >> 0); int g = (BYTE)(bmPixel >> 8) * 2; int b = (BYTE)(bmPixel >> 16); if (g > 255) g = 255; COLORREF newBmPixel = RGB(r, g, b); SetPixel(hdcSrc, xBmPixel, yBmPixel, newBmPixel); } } } BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcSrc, 0, 0, SRCCOPY); DeleteDC(hdcSrc); DeleteDC(hdcMask); EndPaint(hWnd, &ps); break; case WM_DESTROY: DeleteObject(hBm); DeleteObject(hMask); PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }