之前用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;
}
---