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

---

下载

  

C++实现的屏幕截图软件 v1.0的更多相关文章

  1. 【转】寻找最好的笔记软件:三强篇(EverNote、Mybase、Surfulater) (v1.0) (

    原文网址:http://blog.sina.com.cn/s/blog_46dac66f01000b57.html 寻找最好的笔记软件:三强篇(EverNote.Mybase.Surfulater) ...

  2. 【转】寻找最好的笔记软件:海选篇 (v1.0)

    原文网址:http://blog.sina.com.cn/s/blog_46dac66f01000b55.html   序言: 我见过的多数软件爱好者,无论是资深用户,还是初级用户,都有一个梦想:找到 ...

  3. VisualCom软件仿真平台V1.0发布(附安装包下载链接)

    自我们借助VisualCom(暂定名称,后续可能会变更)软件平台撰写技术文章以来,有不少粉丝发私信询问该软件哪里来的,以及哪里有安装包,这里回复一下:VisualCom软件平台是由本微信公众号组织开发 ...

  4. 【iCore4 双核心板】DEMO V1.0 测试程序发布

    iCore4 Demo V1.0程序说明 一.概要 本资料包含5个文件夹: 1.“arm”里是iCore4上arm的程序包,开发环境为KEIL5.17: 2.“fpga”里是iCore4上FPGA的程 ...

  5. 【iCore1S 双核心板】DEMO V1.0 测试程序发布

    iCore1S Demo V1.0程序说明 一.概要 本资料包含5个文件夹: 1.“ARM”里是iCore1S上ARM的程序包,开发环境为KEIL5.17: 2.“FPGA”里是iCore1S上FPG ...

  6. 屏幕监视专家 v1.0 定时录制屏幕动画发送到指定邮箱

    ScreenWatcher v1.0功能:定时录制屏幕动画发送到指定邮箱,录制的动画为gif,可指定录制多长时间.指定几点直接开始录制,完全后台运行.作者:Bluefish 下载链接: http:// ...

  7. 基于Qt5.5.0的sql数据库、SDK_tts文本语音朗读的CET四六级单词背诵系统软件的编写V1.0

    作者:小波 QQ:463431476 请关注我的博客园:http://www.cnblogs.com/xiaobo-Linux/ 我的第二款软件:CET四六级单词背诵软件.基于QT5.5.0.sql数 ...

  8. Windows环境下Android Studio v1.0安装教程

    Windows环境下Android Studio v1.0安装教程 准备工具 JDK安装包. 要求:JDK 7以及以上版本. Android Studio安装文件. Windows: exe(包含SD ...

  9. [苏飞开发助手V1.0测试版]官方教程与升级报告

           [苏飞开发助手V1.0测试版]官方教程与升级报告导读部分----------------------------------------------------------------- ...

随机推荐

  1. Android -- 背景虚化

    1,在项目中我们常有这样的需求,就是在个人中心的时候,当用户登录后,要显示用户登陆后的头像,然后背景是用户头像的虚化 ,接下来就来实现一下这个功能,先看一下效果 2,实现起来也挺简单的,没什么难度 , ...

  2. Spark on Mesos部署

    一.Mesos的安装和部署 1.下载mesos源码和依赖包 部署环境 centOS 6.6 mesos-0.21.0 spark-1.4.1 因为mesos官方只提供源码,所以必须要自己进行编译安装使 ...

  3. input type=file 标签禁止让用户手动输入

    常规的Web应用程序中涉及到文件上传的部分都不可避免地会使用到<input type="file"/>控件,在上传文件的时候通过点击“浏览”按钮,在弹出的文件选择对话框 ...

  4. 夺命雷公狗ThinkPHP项目之----企业网站4之数据库连接

    我们众所周知,我们在开发的时候网站是需要连接上我们的数据库的,毕竟数据库是网站的最核心之一嘛,废话不多说直接开干.... 我们先找到:config.php文件对她进行修改,因为我们网站前后台都用到数据 ...

  5. 把Nodepad++添加进右键菜单

    1.运行注册表编辑器:开始->运行->regedit 2.找到HKEY_CLASSES_ROOT/*/shell 3.右击shell,选择 新建->项 4.项的名字为Edit wit ...

  6. C语言初学者代码中的常见错误与瑕疵(4)

    问题 小学生数学 很多小学生在学习加法时,发现“进位”特别容易出错.你的任务是计算两个数在相加时需要多少次进位.你编制的程序应当可以连续处理多组数据,直到读到两个0(这是输入结束标记). 样例: 输入 ...

  7. js捕捉IE窗口失去焦点事件,判断离开页面刷新或关闭的方法

    js捕捉IE窗口失去焦点事件,判断离开页面刷新或关闭的方法 javascript如何捕捉IE窗口失去焦点事件window.onblur = function(e) { //you code}; 弹框的 ...

  8. PHP将多张小图拼接成一张大图

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> < ...

  9. 微信支付 APP 支付方式的服务器端处理程序

    对于微信的APP的支付,客户服务说只能通过微信开放平台申请.后来在公众帐号确实发现了证据:  微信支付在申请的时候就比较严(麻烦),对服务类的一些支付,本来商品就是虚拟的,所以需要将商品描述的比较详细 ...

  10. java UUID

    UUID是Universally Unique Identifier的缩写,它是在一定的范围内(从特定的名字空间到全球)唯一的机器生成的标识符.UUID具有以下涵义: 经由一定的算法机器生成 为了保证 ...