位图和位块传输(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等