《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);
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值