16,471
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
//#define MASK_USE_DIB
int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
HDC hMemDC = CreateCompatibleDC(NULL);
if (hMemDC != NULL)
{
BITMAPINFOHEADER bih = {0};
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biWidth = bih.biHeight = 32;
bih.biPlanes = 1;
bih.biBitCount = 24;
bih.biSizeImage = 32 * 32 * 3;
void* lpBits = NULL;
HBITMAP hMem = CreateDIBSection(NULL, (BITMAPINFO*)&bih, DIB_RGB_COLORS, &lpBits, NULL, 0);
if (hMem)
{
HBITMAP hTempMem = (HBITMAP)SelectObject(hMemDC, hMem);
//填一个全红图
SetBkColor(hMemDC, RGB(255, 0, 0));
RECT rc = {0, 0, 32, 32};
ExtTextOut(hMemDC, 0, 0, ETO_OPAQUE, &rc, NULL, 0, NULL);
//创建单色掩码图
HDC hMaskDC = CreateCompatibleDC(NULL);
if (hMaskDC != NULL)
{
#ifdef MASK_USE_DIB
char chBif[sizeof(BITMAPINFOHEADER) + 2 * sizeof(RGBQUAD)] = {0};
BITMAPINFO& bif = (BITMAPINFO&)chBif;
bif.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bif.bmiHeader.biWidth = bif.bmiHeader.biHeight = 32;
bif.bmiHeader.biPlanes = 1;
bif.bmiHeader.biBitCount = 1;
bif.bmiHeader.biSizeImage = 32 / 8 * 32;
((DWORD&)bif.bmiColors[1]) = 0xFFFFFF;
void* lpMaskBits = NULL;
HBITMAP hMask = CreateDIBSection(NULL, &bif, DIB_RGB_COLORS, &lpMaskBits, NULL, 0);
#else
HBITMAP hMask = CreateBitmap(32, 32, 1, 1, NULL); //创建一个DDB单色HBITMAP
#endif
if (hMask)
{
HBITMAP hTempMask = (HBITMAP)SelectObject(hMaskDC, hMask);
//填一个全白图
SetBkColor(hMaskDC, RGB(255, 255, 255));
RECT rc = {0, 0, 32, 32};
ExtTextOut(hMaskDC, 0, 0, ETO_OPAQUE, &rc, NULL, 0, NULL);
//画一个圆
SelectObject(hMaskDC, GetStockObject(BLACK_PEN));
SelectObject(hMaskDC, GetStockObject(BLACK_BRUSH));
Ellipse(hMaskDC, 0, 0, 32, 32);
//SRCAND一下
#ifdef MASK_USE_DIB
RGBQUAD ct[2] = {0};
GetDIBColorTable(hMaskDC, 0, 2, ct);
const RGBQUAD t = ct[0];
ct[0] = ct[1];
ct[1] = t;
SetDIBColorTable(hMaskDC, 0, 2, ct);
#else
SetBkColor(hMemDC, RGB(0, 0, 0));
SetTextColor(hMemDC, RGB(255, 255, 255));
#endif
if (BitBlt(hMemDC, 0, 0, 32, 32, hMaskDC, 0, 0, SRCAND))
{
BITMAPFILEHEADER bfh = {0};
bfh.bfType = 'MB';
bfh.bfOffBits = sizeof(bfh) + sizeof(bih);
bfh.bfSize = bfh.bfOffBits + bih.biSizeImage;
HANDLE hFile = CreateFile("a.bmp", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, NULL);
if (hFile != NULL)
{
DWORD dwUseless = 0;
WriteFile(hFile, &bfh, sizeof(bfh), &dwUseless, NULL);
WriteFile(hFile, &bih, sizeof(bih), &dwUseless, NULL);
WriteFile(hFile, lpBits, bih.biSizeImage, &dwUseless, NULL);
CloseHandle(hFile);
}
}
//结束
SelectObject(hMaskDC, hTempMask);
DeleteObject(hMask);
}
DeleteDC(hMaskDC);
}
SelectObject(hMemDC, hTempMem);
DeleteObject(hMem);
}
DeleteDC(hMemDC);
}
return 0;
}