主页C++ Builder 资料C++ Builder 编程技巧图片处理屏幕截图
C++ Builder 串口控件
C++ Builder 编程技巧
字符串及文字处理
多媒体处理
图片处理
 • 显示 gif 图片和动画
 • bmp 转 gif 图片和动画
 • gif 的每一帧都提取出来
 • jpg,gif,png,bmp之间转换
 • 屏幕截图
 • 生成二维码
 • 识别二维码和条码
文件处理
界面处理
C++ Builder 操作指南
C++ Builder 参考手册
网友留言/技术支持
屏幕截图
 • 简单屏幕截图,存为 png 图片
 • 屏幕截图时隐藏窗口,屏幕截图存为 png 图片
 • 使用快捷键屏幕截图,屏幕截图存为 png 图片

本文内容用到的头文件:

类/模板 描述 头文件 (XE2 之后) 头文件 (XE 之前)
TPngImage .png 图片 #include <Vcl.Imaging.pngimage.hpp> #include <pngimage.hpp>
TBitmap .bmp 图片/位图 #include <Vcl.Graphics.hpp> #include <Graphics.hpp>
std::auto_ptr 自动指针 #include <memory> #include <memory>

简单屏幕截图,存为 png 图片

void __fastcall TForm1::Button16Click(TObject *Sender)
{
  std::auto_ptr<TBitmap>bmp(new TBitmap);

  HDC hdcScreen = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
  if(hdcScreen)
   {
     try
      {
        bmp->PixelFormat = pf32bit;
        bmp->SetSize(GetDeviceCaps(hdcScreen, HORZRES),
                     GetDeviceCaps(hdcScreen, VERTRES));
        ::BitBlt(bmp->Canvas->Handle, 0,0,bmp->Width,bmp->Height,
                 hdcScreen, 0,0, SRCCOPY);
      }
     __finally
      {
        DeleteDC(hdcScreen);
      }
   }

  std::auto_ptr<TPngImage>png(new TPngImage);
  png->Assign(bmp.get());
  png->SaveToFile(L"d:\\snapshot.png");
}

 

屏幕截图时隐藏窗口,屏幕截图存为 png 图片

void __fastcall TForm1::Button17Click(TObject *Sender)
{
  std::auto_ptr<TBitmap>bmp(new TBitmap);

  HDC hdcScreen = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
  if(hdcScreen)
   {
     try
      {
        bmp->PixelFormat = pf32bit;
        bmp->SetSize(GetDeviceCaps(hdcScreen, HORZRES),
                     GetDeviceCaps(hdcScreen, VERTRES));

        WindowState = wsMinimized;
        Visible = false;

        ::BitBlt(bmp->Canvas->Handle, 0,0,bmp->Width,bmp->Height,
                 hdcScreen, 0,0, SRCCOPY);

        Visible = true;
        WindowState = wsNormal;
        SetForegroundWindow(Handle);
      }
     __finally
      {
        DeleteDC(hdcScreen);
      }
   }

  std::auto_ptr<TPngImage>png(new TPngImage);
  png->Assign(bmp.get());
  png->SaveToFile(L"d:\\snapshot.png");
}

 

使用快捷键屏幕截图,屏幕截图存为 png 图片

.h 文件增加的内容
private:
    int iHotKeyID;
    unsigned short uSnapIndex;
protected:
    void __fastcall WndProc(Messages::TMessage &Message);

 

.cpp 文件增加的内容
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
  iHotKeyID = 1; // 快捷键的 ID:1 【注1】
  uSnapIndex = 0; // 屏幕截图保存的文件名的序号【注2】
  RegisterHotKey(Handle, iHotKeyID, MOD_CONTROL|MOD_ALT, L'P'); // ID:1 注册的快捷键为 Ctrl + Alt + P
}
//---------------------------------------------------------------------------
__fastcall TForm1::~TForm1()
{
  UnregisterHotKey(Handle, iHotKeyID); // 注销 ID:1 的快捷键
}
//---------------------------------------------------------------------------
void __fastcall TForm1::WndProc(Messages::TMessage &Message)
{
  if(Message.Msg == WM_HOTKEY) // 如果 Windows 消息为快捷键
   {
     WORD wMod = Message.LParamLo; // Ctrl, Alt, Shift 和 Win 键的状态
     WORD wKey = Message.LParamHi; // 快捷键的虚拟按键码

     if(wMod==(MOD_CONTROL|MOD_ALT) && wKey==L'P') // Ctrl + Alt + P
      {
        std::auto_ptr<TBitmap>bmp(new TBitmap); // 创建内存位图 bmp,先把屏幕截图放在内存位图里面
        // Copyright © Victor Chen, http://www.cppfans.com/
        HDC hdcScreen = CreateDC(_T("DISPLAY"), NULL, NULL, NULL); // 这是所有的显示器拼接在一起的整体的 DC 【注3】
        if(hdcScreen)
         {
           try
            {
              bmp->PixelFormat = pf32bit; // bmp 的像素格式为 32 位
              bmp->SetSize(GetDeviceCaps(hdcScreen, HORZRES), // bmp 的宽度 = DC 的宽度
                           GetDeviceCaps(hdcScreen, VERTRES)); // bmp 的高度 = DC 的高度
              ::BitBlt(bmp->Canvas->Handle, 0,0,bmp->Width,bmp->Height, // 显示内容复制到这个 DC 的这个位置
                       hdcScreen, 0,0, SRCCOPY); // 从这个 DC 的这个位置复制显示内容
            }
           __finally
            {
              DeleteDC(hdcScreen); // 释放屏幕 DC 占用的资源
            }
         }

        std::auto_ptr<TPngImage>png(new TPngImage); // 新创建一个 png 图片
        png->Assign(bmp.get()); // bmp 转为 png
        png->SaveToFile(String().sprintf(L"d:\\Snapshot%05u.png",uSnapIndex++)); // 保存截图为 png 图片
      }
   }
  TForm::WndProc(Message); // 必须调用默认的 Windows 消息处理
}
//---------------------------------------------------------------------------

注:
1. 快捷键的 ID, 对于 exe 文件,可以在 0x0000 ~ 0xBFFF 之间随意选择一个整数值,但是必须保证注册的每个快捷键对应不同的 ID
2. 屏幕截图保存的文件名为 "Snapshot00000.png", "Snapshot00001.png", "Snapshot00002.png", ……这样的格式
3. 这是所有显示器拼接在一起的整体的 DC,如果需要单个显示器的内容,需要用 EnumDisplayDevices 函数枚举所有的显示设备

◤上一页:jpg,gif,png,bmp之间转换下一页:生成二维码

C++ 爱好者 -- Victor Chen 的个人网站 www.cppfans.com 辽ICP备11016859号