类ID(GUID)通常用由破折号分隔的十六进制数字序列指定,例如{557cf406-1a04-11d3-9a73-0000f81ef32e}.这不是可用于直接初始化CLSID结构的文字.
我发现了两种初始化结构的方法,但它们都很尴尬.第一个不允许声明它const,必须在运行时完成,而第二个需要大量重新格式化十六进制常量.
CLSID clsid1;
CLSIDFromString(CComBSTR("{557cf406-1a04-11d3-9a73-0000f81ef32e}"), &clsid1);
const CLSID clsid2 = { 0x557cf406, 0x1a04, 0x11d3, { 0x9a,0x73,0x00,0x00,0xf8,0x1e,0xf3,0x2e } };
Run Code Online (Sandbox Code Playgroud)
我知道如果你有一个与UUID相关联的类型,Visual Studio可以使用__uuidof运算符自动生成一个.如果你只有十六进制字符串,有没有办法做到这一点?
我在网上找到这个代码打印屏幕(截图),但我不知道如何修改它以将结果保存到PNG文件。
我可以将位图保存到剪贴板,但我现在需要保存到 PNG 文件。
到目前为止我的代码是:
#include <iostream>
#include <windows.h>
#include <gdiplus.h>
#include <stdexcept>
using namespace std;
using namespace Gdiplus;
using namespace Gdiplus::DllExports;
using std::runtime_error;
void screenshot(POINT a, POINT b)
{
HDC hScreen = GetDC(NULL);
HDC hDc = CreateCompatibleDC(hScreen);
HBITMAP hBitmap = CreateCompatibleBitmap(hScreen, abs(b.x-a.x), abs(b.y-a.y));
HGDIOBJ old_obj = SelectObject(hDc, hBitmap);
BOOL bRet = BitBlt(hDc, 0, 0, abs(b.x-a.y), abs(b.y-a.y), hScreen, a.x, a.y, SRCCOPY);
OpenClipboard(NULL);
EmptyClipboard();
SetClipboardData(CF_BITMAP, hBitmap);
CloseClipboard();
SelectObject(hDc, old_obj);
DeleteDC(hDc);
ReleaseDC(NULL, hScreen);
DeleteObject(hBitmap);
}
int main() …Run Code Online (Sandbox Code Playgroud)