之前用win32做的屏幕截图软件V1,非常方便好用。
在V2版本中增加了屏幕尺和颜色拾取功能,并且改用屏幕和内存DC双缓冲,彻底消灭了闪屏,可惜代码丢失了
这是V1的代码:
//create by luangeng 2011/11/11 //baseed on win32 #include <windows.h> #pragma comment (lib,"User32.lib") LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); HDC hdc; PAINTSTRUCT ps; HPEN hPen,hOldpen; HBRUSH hBrush,hOldbrush; RECT rt; int ox,oy,nx,ny,sx,sy,bx,by,ax,ay; bool down=0; int Min(int x,int y) { if(x>y) return y; else return x; } int Max(int x,int y) { if(x>y) return x; else return y; } int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { HWND hwnd; MSG messages; WNDCLASSEX wincl; wincl.hInstance = hThisInstance; wincl.lpszClassName = "ScreenCapture by LG"; wincl.lpfnWndProc = WindowProcedure; wincl.style = CS_NOCLOSE; wincl.cbSize = sizeof (WNDCLASSEX); wincl.hIcon = NULL; wincl.hIconSm = NULL; wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; wincl.cbClsExtra = 0; wincl.cbWndExtra = 0; wincl.hbrBackground = (HBRUSH)COLOR_WINDOWTEXT; if (!RegisterClassEx (&wincl)) return 0; hwnd = CreateWindowEx (WS_EX_TOPMOST | WS_EX_LAYERED | WS_EX_NOACTIVATE, "ScreenCapture by LG", "ScreenCapture",WS_POPUP | WS_MAXIMIZE,0,0,GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN),HWND_DESKTOP,NULL,hThisInstance,NULL); typedef BOOL (WINAPI *lpfn)(HWND hWnd,COLORREF cr,BYTE bAlpha,DWORD dwFlags); lpfn g_pSetLayeredWindowAttributes; HMODULE hUser32 = GetModuleHandle("USER32.DLL"); g_pSetLayeredWindowAttributes = (lpfn)GetProcAddress(hUser32, "SetLayeredWindowAttributes"); // (*g_pSetLayeredWindowAttributes)(hwnd,RGB(255,255,255),200,0x01|0x02); for(int i=10;i<200;i+=10) { (*g_pSetLayeredWindowAttributes)(hwnd,RGB(255,255,255),i,0x01|0x02); Sleep(10); ShowWindow (hwnd, nFunsterStil); } hdc=BeginPaint(hwnd,&ps); while (GetMessage (&messages, NULL, 0, 0)) { TranslateMessage(&messages); DispatchMessage(&messages); } return messages.wParam; } LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_LBUTTONDOWN: down=1; ox=LOWORD(lParam); oy=HIWORD(lParam); hPen=CreatePen(PS_SOLID,1,RGB(0,250,154)); hOldpen=(HPEN)SelectObject(hdc,hPen); hBrush=(HBRUSH)GetStockObject(BLACK_BRUSH); hOldbrush=(HBRUSH)SelectObject(hdc,hBrush); GetClientRect(hwnd,&rt); break; case WM_MOUSEMOVE: if(down) { Sleep(30); nx=LOWORD(lParam); ny=HIWORD(lParam); sx=Min(ox,nx); sy=Min(oy,ny); bx=Max(ox,nx); by=Max(oy,ny); ax=bx-sx; ay=by-sy; FillRect(hdc,&rt,hBrush); MoveToEx(hdc,sx,oy,NULL); LineTo(hdc,(ox + nx)/2-ax/6,oy); MoveToEx(hdc,(ox + nx)/2+ax/6,oy,NULL); LineTo(hdc, bx, oy); MoveToEx(hdc,sx, ny,NULL); LineTo(hdc,(ox + nx)/2-ax/6,ny); MoveToEx(hdc,(ox + nx)/2+ax/6,ny,NULL); LineTo(hdc,bx, ny); MoveToEx(hdc,ox, sy,NULL); LineTo(hdc,ox, (oy + ny) / 2 - ay / 6); MoveToEx(hdc,ox,(oy+ny)/2+ay/6,NULL); LineTo(hdc,ox, by); MoveToEx(hdc,nx,sy,NULL); LineTo(hdc,nx,(oy+ny)/2-ay/6); MoveToEx(hdc,nx,(oy+ny)/2+ay/6,NULL); LineTo(hdc,nx, by); MoveToEx(hdc,(ox + nx)/2,0,NULL); LineTo(hdc,(ox+nx)/2,sy-ay/6); MoveToEx(hdc,0,(oy+ny)/2,NULL); LineTo(hdc,sx - ax / 6, (oy + ny) / 2); MoveToEx(hdc,bx + ax/6,(oy + ny)/2,NULL); LineTo(hdc, rt.right,(oy+ny)/2); MoveToEx(hdc,(ox + nx)/2,by+ay/6,NULL); LineTo(hdc,(ox + nx)/2,rt.bottom); MoveToEx(hdc,ax/2+sx-Min(ax,ay)/12,ay/2+sy,NULL); LineTo(hdc,ax/2+sx+Min(ax,ay)/12+1,ay/2+sy); MoveToEx(hdc,ax/2+sx,ay/2+sy-Min(ax,ay)/12,NULL); LineTo(hdc,ax/2+sx,ay/2+sy+Min(ax,ay)/12+1); } break; case WM_LBUTTONUP: // down=0; if(ax!=0 && ay!=0) { hBrush=(HBRUSH)GetStockObject(WHITE_BRUSH); SelectObject(hdc,hBrush); Rectangle(hdc,sx-1,sy-1,bx+1,by+1); HDC hScrDC=GetDC(NULL); HDC hMemDC=CreateCompatibleDC(NULL); HBITMAP hBitmap=CreateCompatibleBitmap(hScrDC,ax,ay); HBITMAP hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap); BitBlt(hMemDC,0,0,ax,ay,hScrDC,sx,sy,SRCCOPY); hBitmap=(HBITMAP)SelectObject(hMemDC,hOldBitmap); if( OpenClipboard(hwnd) ) { EmptyClipboard(); SetClipboardData(CF_BITMAP,hBitmap); CloseClipboard(); } ReleaseDC(NULL,hScrDC); DeleteDC(hMemDC); DeleteObject(hBitmap); DeleteObject(hOldBitmap); MessageBeep(MB_ICONASTERISK); EndPaint(hwnd,&ps); SelectObject(hdc,hOldpen); SelectObject(hdc,hOldbrush); DeleteObject(hPen); DeleteObject(hBrush); ReleaseDC(hwnd,hdc); PostQuitMessage (0); } else PostQuitMessage (0); break; case WM_RBUTTONUP: PostQuitMessage (0); break; case WM_KEYDOWN: if(wParam==VK_ESCAPE) PostQuitMessage (0); break; default: return DefWindowProc (hwnd, message, wParam, lParam); } return 0; }
---