C++ 如何使用C++;建设者

C++ 如何使用C++;建设者,c++,screenshot,c++builder,firemonkey,vcl,C++,Screenshot,C++builder,Firemonkey,Vcl,我知道关于我的问题有很多答案,但我从来不知道我会做什么 我只需要在任何操作系统中截取我表单的一部分,例如: void __fastcall TMyForm::GrabScreenshot() { TRect r(30, 30, 80, 200); TBitmap *bmp1 = new TBitmap; bmp1->SetSize(ClientWidth, ClientHeight); PaintTo(bmp1->Canvas); TBit

我知道关于我的问题有很多答案,但我从来不知道我会做什么

我只需要在任何操作系统中截取我表单的一部分,例如:

void __fastcall TMyForm::GrabScreenshot()
{
    TRect r(30, 30, 80, 200);

    TBitmap *bmp1 = new TBitmap;
    bmp1->SetSize(ClientWidth, ClientHeight);
    PaintTo(bmp1->Canvas);

    TBitmap *bmp2 = new TBitmap;
    bmp2->SetSize(r.Width, r.Height);
    bmp2->CopyFromBitmap(bmp1, r, 0, 0);
    delete bmp1;

    // use bmp2 as needed...
    delete bmp2;
}
从X=30到X=80,Y=30到Y=200的位置截图,因此,在这种情况下,图像应该有50x170px,但我想要一个任何分辨率的解决方案

图像的格式可以是JPEG、GIF、PNG或BMP(位图)。 只是

目前我正在使用FMX库,但如果您有一个与VCL一起工作的代码,我可以根据需要尝试更改它。 如果还有这样的问题,请不要把我的问题当成“坏问题”,我还是一个新手,想多学一点

注:我正在尝试使用任何设备/操作系统,所以我希望避免使用API


非常感谢

FireMonkey的
TForm
类有一个方法。创建两个对象,将第一个位图传递到
PaintTo()
,然后调用第二个位图指定所需的坐标,然后根据需要使用第二个位图。例如:

void __fastcall TMyForm::GrabScreenshot()
{
    TRect r(30, 30, 80, 200);

    TBitmap *bmp1 = new TBitmap;
    bmp1->SetSize(ClientWidth, ClientHeight);
    PaintTo(bmp1->Canvas);

    TBitmap *bmp2 = new TBitmap;
    bmp2->SetSize(r.Width, r.Height);
    bmp2->CopyFromBitmap(bmp1, r, 0, 0);
    delete bmp1;

    // use bmp2 as needed...
    delete bmp2;
}

如果答案中有某些特定部分您不理解/无法使用,请展示您所掌握的内容,必要时链接到该答案的上下文,并准确解释错误所在。屏幕截图通常需要API调用,例如BitBlt。