《Windows程序设计》之BITMASK

对位图中的掩码图,或图片合成还需要做进一步的了解,继续熟悉了内存中图片处理的相应过程。


LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	static HBITMAP hBitmapImag,hBitmapMask;
	static HINSTANCE hInstance;
	static int cxClient,cyClient,cxBitmap,cyBitmap;
	BITMAP bitmap;
	HDC hdc,hdcMemImag,hdcMemMask;
	int x,y;
	PAINTSTRUCT ps;

	switch(message)
	{
	case WM_CREATE:
		//实例句柄
		hInstance=((LPCREATESTRUCT)lParam)->hInstance;
		//图片句柄
		hBitmapImag=LoadBitmap(hInstance,TEXT("Matthew"));
		//图片相关信息
		GetObject(hBitmapImag,sizeof(BITMAP),&bitmap);
		cxBitmap=bitmap.bmWidth;
		cyBitmap=bitmap.bmHeight;
		//创建内存设备上下文
		hdcMemImag=CreateCompatibleDC(NULL);
		//图片选入内存设备
		SelectObject(hdcMemImag,hBitmapImag);
		//创建一个图片
		hBitmapMask=CreateBitmap(cxBitmap,cyBitmap,1,1,NULL);
		//创建内存设备上下文
		hdcMemMask=CreateCompatibleDC(NULL);
		//选入设备上下文
		SelectObject(hdcMemMask,hBitmapMask);
		//对内存设备选入黑色画刷
		SelectObject(hdcMemMask,GetStockObject(BLACK_BRUSH));
		//画矩形
		Rectangle(hdcMemMask,0,0,cxBitmap,cyBitmap);
		//选入白色画刷
		SelectObject(hdcMemMask,GetStockObject(WHITE_BRUSH));
		//画椭圆
		Ellipse(hdcMemMask,0,0,cxBitmap,cyBitmap);
		//由hdcMemImag中的位图移动到hdcMemMask中,与原位图做AND运算
		BitBlt(hdcMemImag,0,0,cxBitmap,cyBitmap,hdcMemMask,0,0,SRCAND);

		DeleteDC(hdcMemImag);
		DeleteDC(hdcMemMask);
		return 0;
	case WM_SIZE:
		cxClient=LOWORD(lParam);
		cyClient=HIWORD(lParam);
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hwnd,&ps);
		//要显示了,创建与显示相关的内存设备上下文
		hdcMemImag=CreateCompatibleDC(hdc);
		//hBitmapImag这个句柄是不会变的,创建时的相当操作改变了hBitmapImag的内容,但没有改变句柄
		SelectObject(hdcMemImag,hBitmapImag);

		hdcMemMask=CreateCompatibleDC(hdc);
		SelectObject(hdcMemMask,hBitmapMask);

		x=(cxClient-cxBitmap)/2;
		y=(cyClient-cyBitmap)/2;

		//下面这一行,使得椭圆内部为黑色,其它地方为浅色
		BitBlt(hdc,x,y,cxBitmap,cyBitmap,hdcMemMask,0,0,0x220326);
		//做或运算,合成图像
		BitBlt(hdc,x,y,cxBitmap,cyBitmap,hdcMemImag,0,0,SRCPAINT);

		DeleteDC(hdcMemImag);
		DeleteDC(hdcMemMask);
		EndPaint(hwnd,&ps);
		return 0;
	case WM_DESTROY:
		DeleteObject(hBitmapImag);
		DeleteObject(hBitmapMask);
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd,message,wParam,lParam);
}



你可能感兴趣的:(《Windows程序设计》之BITMASK)