代码改变世界

位图和位块传输(1)BitBlt与PatBlt

2012-08-10 20:05  java线程例子  阅读(755)  评论(1编辑  收藏  举报

BitBlt读作"bit blit"表示位块传输,BitBlt函数是像素移动者,或者,更生动的说,点阵撞击者,下面是一个简单的BitBlt

#include<windows.h>

LRESULT CALLBACK WindowProc(
							HWND hwnd,      // handle to window
							UINT uMsg,      // message identifier
							WPARAM wParam,  // first message parameter
							LPARAM lParam   // second message parameter
							);

int WINAPI WinMain(
				   HINSTANCE hInstance,      // handle to current instance
				   HINSTANCE hPrevInstance,  // handle to previous instance
				   LPSTR lpCmdLine,          // command line
				   int nCmdShow              // show state
				   )
{
		static TCHAR szAppName[]=TEXT("leidemingzi");
		HWND hwnd;
		MSG msg;
		WNDCLASS wndclass;

		wndclass.cbClsExtra=0;
		wndclass.cbWndExtra=0;
		wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
		wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
		wndclass.hIcon=LoadIcon(NULL,IDI_ERROR);
		wndclass.hInstance=hInstance;
		wndclass.lpfnWndProc=WindowProc;
		wndclass.lpszClassName=szAppName;
		wndclass.lpszMenuName=NULL;
		wndclass.style=CS_HREDRAW|CS_VREDRAW;

		if(!RegisterClass(&wndclass))
		{
			MessageBox(NULL,TEXT("the program requrie the window nt"),TEXT("tips"),MB_ICONERROR);
			return 0;
		}

		hwnd=CreateWindow(
			szAppName,  // registered class name
			TEXT("this is title"), // window name
			WS_OVERLAPPEDWINDOW,        // window style
			CW_USEDEFAULT,                // horizontal position of window
			CW_USEDEFAULT,                // vertical position of window
			CW_USEDEFAULT,           // window width
			CW_USEDEFAULT,          // window height
			NULL,      // handle to parent or owner window
			NULL,          // menu handle or child identifier
			hInstance,  // handle to application instance
			NULL		// window-creation data
			);

		ShowWindow(hwnd,nCmdShow);
		UpdateWindow(hwnd);

		while(GetMessage(&msg,NULL,0,0))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}

		return msg.wParam;
}

LRESULT CALLBACK WindowProc(
							HWND hwnd,      // handle to window
							UINT uMsg,      // message identifier
							WPARAM wParam,  // first message parameter
							LPARAM lParam   // second message parameter
							)
{
	static int cxClient,cyClient,cxSource,cySource;
	HDC hdcClient,hdcWindow;
	int x,y;
	PAINTSTRUCT ps;


	switch(uMsg)
	{
	case WM_CREATE:
		cxSource=GetSystemMetrics(SM_CXSIZEFRAME)+GetSystemMetrics(SM_CXSIZE);
		cySource=GetSystemMetrics(SM_CYSIZEFRAME)+GetSystemMetrics(SM_CYCAPTION);
		return 0;

	case WM_SIZE:
		cxClient=LOWORD(lParam);
		cyClient=HIWORD(lParam);
		return 0;


	case WM_PAINT:
		hdcClient=BeginPaint(hwnd,&ps);
		hdcWindow=GetWindowDC(hwnd);

		for(y=0;y<cyClient;y+=cySource)
			for(x=0;x<cxClient;x+=cxSource)
			{
				BitBlt(hdcClient,x,y,cxSource,cySource,hdcWindow,0,0,NOTSRCCOPY);//SRCCOPY
			}

		ReleaseDC(hwnd,hdcWindow);
		EndPaint(hwnd,&ps);
		return 0;

	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd,uMsg,wParam,lParam);
}


 

BitBlt函数把像素从一个设备环境(源)的矩形区域,传输到另一个设备环境(目标)中的一个同样大小的矩形区域,这个函数的语法如下

BitBlt(hdcDst,xDst,yDst,cx,cy,hdcSrc,xSrc,ySrc,dwRop);


其中dwRop的值可以取下面的值:

 

这里的BitBlt是两个设备环境作为参数。

Windows函数有个称为PatBlt图案块传输函数,只是需要一个设备环境即可,它的作用相当于一个Rectangle

LRESULT CALLBACK WindowProc(
					   HWND hwnd,      // handle to window
					   UINT uMsg,      // message identifier
					   WPARAM wParam,  // first message parameter
					   LPARAM lParam   // second message parameter
					   )
{
		HDC hdc;
		PAINTSTRUCT ps;
		HBRUSH hbrush;
		RECT rect;

	  switch(uMsg)
	  {
	  case WM_CREATE:
		  return 0;

	  case WM_PAINT:
		  hdc=BeginPaint(hwnd,&ps);
		  PatBlt(hdc,0,0,100,200,BLACKNESS);
		  hbrush=CreateSolidBrush(RGB(255,0,0));
		  hbrush=(HBRUSH)SelectObject(hdc,hbrush);
		  Rectangle(hdc,200,200,300,300);
		  DeleteObject(hbrush);
		  SelectObject(hdc,hbrush);
		  Rectangle(hdc,400,400,500,500);

		  SetRect(&rect,500,500,600,600);
		  FillRect(hdc,&rect,CreateSolidBrush(RGB(100,100,100)));
		  EndPaint(hwnd,&ps);
		  return 0;

	  case WM_DESTROY:
		  PostQuitMessage(0);
		  return 0;
	  }
	  return DefWindowProc(hwnd,uMsg,wParam,lParam);
}

 

这里的的dwRop只能取

BLACKNESS,DSTINVERT,PAINVERT,PATCOPY,WHITENESS等