Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在winapi中保存位图问题_C++_Winapi_Bitmap_Corrupt - Fatal编程技术网

C++ 在winapi中保存位图问题

C++ 在winapi中保存位图问题,c++,winapi,bitmap,corrupt,C++,Winapi,Bitmap,Corrupt,它会写入位图.bmp文件,但当我尝试在Windows照片查看器中查看它时,它会显示“Windows照片查看器无法打开此图片,因为该文件似乎已损坏、损坏或太大。”我知道我可能应该把函数放在头文件中,但我从来没有真正深入地研究过一个项目来真正制作头文件,所以我忘了怎么做。如果有人知道Windows Photo Viewer中图片的大小限制,我将非常感激。我从MSDN(无愧)那里得到了一些函数。错误处理可能会更好,但我没有errorhandler.h。我不完全确定所有函数是如何工作的,因为正如我所说,

它会写入位图.bmp文件,但当我尝试在Windows照片查看器中查看它时,它会显示“Windows照片查看器无法打开此图片,因为该文件似乎已损坏、损坏或太大。”我知道我可能应该把函数放在头文件中,但我从来没有真正深入地研究过一个项目来真正制作头文件,所以我忘了怎么做。如果有人知道Windows Photo Viewer中图片的大小限制,我将非常感激。我从MSDN(无愧)那里得到了一些函数。错误处理可能会更好,但我没有
errorhandler.h
。我不完全确定所有函数是如何工作的,因为正如我所说,我使用了MSDN中的一些代码。 我将非常感谢任何能帮助我的人。:)

#包括
#包括
#包括
使用名称空间std;
名称空间全局变量{
HBITMAP HBITMAP;
HDC-hScreen;
}
使用名称空间全局变量;
void获取屏幕截图(void)
{
int-x1,y1,x2,y2,w,h;
LPSIZE-LPSIZE;
LPVOID-lpvBits;
//获取屏幕尺寸
x1=GetSystemMetrics(SM_XVIRTUALSCREEN);
x2=GetSystemMetrics(SM_CXVIRTUALSCREEN);
y1=GetSystemMetrics(SM_YVIRTUALSCREEN);
y2=GetSystemMetrics(SM_CYVIRTUALSCREEN);
w=x2-x1;
h=y2-y1;
//将屏幕复制到位图
hsscreen=GetDC(空);
HDC HDC=CreateCompatibleDC(hs屏幕);
hBitmap=CreateCompatibleBitmap(hsscreen,w,h);
hgdobj old_obj=选择对象(hDC、hBitmap);
BOOL-bRet=BitBlt(hDC,0,0,w,h,hScreen,x1,y1,srcopy);
GetBitmapDimensionEx(hBitmap,lpSize);
GetBitmapBits(hBitmap,(LONG)lpSize,lpvBits);
//将位图保存到剪贴板
OpenClipboard(空);
清空电路板();
SetClipboardData(CF_位图,hBitmap);
CloseClipboard();
//清理
选择对象(hDC、旧对象);
/*DeleteDC(hDC);
释放DC(空,hs屏幕);
删除对象(hBitmap)*/
}
PBITMAPINFO CreateBitmapInfoStruct(/*HWND-HWND,*/HBITMAP-hBmp)
{
位图bmp;
PBITMAPINFO pbmi;
字cClrBits;
//检索位图颜色格式、宽度和高度。
if(!GetObject(hBmp、sizeof(位图)、(LPSTR)和bmp))
//errhandler(“GetObject”,hwnd);
cout bmiHeader.biWidth*cClrBits+31)和~31)/8
*pbmi->bmi header.biHeight;
//将biClrImportant设置为0,表示所有
//设备颜色很重要。
pbmi->bmiHeader.biClrImportant=0;
返回pbmi;
}
void CreateBMPFile(/*HWND-HWND,*/LPTSTR-pszFile,PBITMAPINFO-pbi,
HBITMAP hBMP,HDC HDC)
{
HANDLE hf;//文件句柄
BITMAPFILEHEADER hdr;//位图文件头
PBITMAPINFOHEADER pbih;//位图信息头
LPBYTE lpBits;//内存指针
DWORD dwTotal;//字节总数
DWORD cb;//字节的增量计数
BYTE*hp;//字节指针
DWORD dwTmp;
pbih=(PBITMAPINFOHEADER)pbi;
lpBits=(LPBYTE)GlobalAlloc(GMEM_固定,pbih->biSizeImage);
if(!lpBits)
//errhandler(“GlobalAlloc”,hwnd);
cout-biSizeImage);
hdr.bfReserved1=0;
hdr.bfserved2=0;
//计算颜色索引数组的偏移量。
hdr.bOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+
pbih->biSize+pbih->BICLRUSE
*sizeof(RGBguad);
//将BITMAPFILEHEADER复制到.BMP文件中。
如果(!WriteFile(hf,(LPVOID)&hdr,sizeof(BITMAPFILEHEADER),
(LPDWORD)和dwTmp,空)
{
//errhandler(“WriteFile”,hwnd);

cout将未初始化的值传递给
GetBitmapDimensionEx
GetBitmapBits
似乎不好,所以删除它们,因为它们似乎没有被使用

void GetScreenShot(void)
{
    int x1, y1, x2, y2, w, h;
    // get screen dimensions
    x1  = GetSystemMetrics(SM_XVIRTUALSCREEN);
    x2  = GetSystemMetrics(SM_CXVIRTUALSCREEN);
    y1  = GetSystemMetrics(SM_YVIRTUALSCREEN);
    y2  = GetSystemMetrics(SM_CYVIRTUALSCREEN);
    w   = x2-x1;
    h   = y2-y1;

    // copy screen to bitmap
    hScreen = GetDC(NULL);
    HDC     hDC     = CreateCompatibleDC(hScreen);
    hBitmap = CreateCompatibleBitmap(hScreen, w, h);
    HGDIOBJ old_obj = SelectObject(hDC, hBitmap);
    BOOL    bRet    = BitBlt(hDC, 0, 0, w, h, hScreen, x1, y1, SRCCOPY);
    // save bitmap to clipboard
    OpenClipboard(NULL);
    EmptyClipboard();
    SetClipboardData(CF_BITMAP, hBitmap);
    CloseClipboard();
    // clean up
    SelectObject(hDC, old_obj);
    /*DeleteDC(hDC);
    ReleaseDC(NULL, hScreen);
    DeleteObject(hBitmap);*/
}
然后,设置
hdr.bfType
,即使
hf!=无效的句柄值

改变

    if (hf == INVALID_HANDLE_VALUE)
        //errhandler("CreateFile", hwnd);
    hdr.bfType = 0x4d42;        // 0x42 = "B" 0x4d = "M"

(添加大括号)

对于
pszFile
的类型,使用
LPCTSTR
而不是
LPTSTR
,这是
CreateBMPFile
的一个参数,也很好
为避免传递字符串文字时出现编译器警告。

将未初始化的值传递给
GetBitmapDimensionEx
GetBitmapBits
似乎不太好,因此请删除它们,因为它们似乎未被使用

void GetScreenShot(void)
{
    int x1, y1, x2, y2, w, h;
    // get screen dimensions
    x1  = GetSystemMetrics(SM_XVIRTUALSCREEN);
    x2  = GetSystemMetrics(SM_CXVIRTUALSCREEN);
    y1  = GetSystemMetrics(SM_YVIRTUALSCREEN);
    y2  = GetSystemMetrics(SM_CYVIRTUALSCREEN);
    w   = x2-x1;
    h   = y2-y1;

    // copy screen to bitmap
    hScreen = GetDC(NULL);
    HDC     hDC     = CreateCompatibleDC(hScreen);
    hBitmap = CreateCompatibleBitmap(hScreen, w, h);
    HGDIOBJ old_obj = SelectObject(hDC, hBitmap);
    BOOL    bRet    = BitBlt(hDC, 0, 0, w, h, hScreen, x1, y1, SRCCOPY);
    // save bitmap to clipboard
    OpenClipboard(NULL);
    EmptyClipboard();
    SetClipboardData(CF_BITMAP, hBitmap);
    CloseClipboard();
    // clean up
    SelectObject(hDC, old_obj);
    /*DeleteDC(hDC);
    ReleaseDC(NULL, hScreen);
    DeleteObject(hBitmap);*/
}
然后,设置
hdr.bfType
,即使
hf!=无效的句柄值

改变

    if (hf == INVALID_HANDLE_VALUE)
        //errhandler("CreateFile", hwnd);
    hdr.bfType = 0x4d42;        // 0x42 = "B" 0x4d = "M"

(添加大括号)

对于
pszFile
的类型,使用
LPCTSTR
而不是
LPTSTR
,这是
CreateBMPFile
的一个参数,也很好
为避免传递字符串文字时出现编译器警告。

将未初始化的值传递给
GetBitmapDimensionEx
GetBitmapBits
似乎不太好,因此请删除它们,因为它们似乎未被使用

void GetScreenShot(void)
{
    int x1, y1, x2, y2, w, h;
    // get screen dimensions
    x1  = GetSystemMetrics(SM_XVIRTUALSCREEN);
    x2  = GetSystemMetrics(SM_CXVIRTUALSCREEN);
    y1  = GetSystemMetrics(SM_YVIRTUALSCREEN);
    y2  = GetSystemMetrics(SM_CYVIRTUALSCREEN);
    w   = x2-x1;
    h   = y2-y1;

    // copy screen to bitmap
    hScreen = GetDC(NULL);
    HDC     hDC     = CreateCompatibleDC(hScreen);
    hBitmap = CreateCompatibleBitmap(hScreen, w, h);
    HGDIOBJ old_obj = SelectObject(hDC, hBitmap);
    BOOL    bRet    = BitBlt(hDC, 0, 0, w, h, hScreen, x1, y1, SRCCOPY);
    // save bitmap to clipboard
    OpenClipboard(NULL);
    EmptyClipboard();
    SetClipboardData(CF_BITMAP, hBitmap);
    CloseClipboard();
    // clean up
    SelectObject(hDC, old_obj);
    /*DeleteDC(hDC);
    ReleaseDC(NULL, hScreen);
    DeleteObject(hBitmap);*/
}
然后,设置
hdr.bfType
,即使
hf!=无效的句柄值

改变

    if (hf == INVALID_HANDLE_VALUE)
        //errhandler("CreateFile", hwnd);
    hdr.bfType = 0x4d42;        // 0x42 = "B" 0x4d = "M"

(添加大括号)

对于
pszFile
的类型,使用
LPCTSTR
而不是
LPTSTR
,这是
CreateBMPFile
的一个参数,也很好
为避免传递字符串文字时出现编译器警告。

将未初始化的值传递给
GetBitmapDimensionEx
GetBitmapBits
似乎不太好,因此请删除它们,因为它们似乎未被使用

void GetScreenShot(void)
{
    int x1, y1, x2, y2, w, h;
    // get screen dimensions
    x1  = GetSystemMetrics(SM_XVIRTUALSCREEN);
    x2  = GetSystemMetrics(SM_CXVIRTUALSCREEN);
    y1  = GetSystemMetrics(SM_YVIRTUALSCREEN);
    y2  = GetSystemMetrics(SM_CYVIRTUALSCREEN);
    w   = x2-x1;
    h   = y2-y1;

    // copy screen to bitmap
    hScreen = GetDC(NULL);
    HDC     hDC     = CreateCompatibleDC(hScreen);
    hBitmap = CreateCompatibleBitmap(hScreen, w, h);
    HGDIOBJ old_obj = SelectObject(hDC, hBitmap);
    BOOL    bRet    = BitBlt(hDC, 0, 0, w, h, hScreen, x1, y1, SRCCOPY);
    // save bitmap to clipboard
    OpenClipboard(NULL);
    EmptyClipboard();
    SetClipboardData(CF_BITMAP, hBitmap);
    CloseClipboard();
    // clean up
    SelectObject(hDC, old_obj);
    /*DeleteDC(hDC);
    ReleaseDC(NULL, hScreen);
    DeleteObject(hBitmap);*/
}
然后,设置
hdr.bfType
,即使
hf!=无效的句柄值

改变

    if (hf == INVALID_HANDLE_VALUE)
        //errhandler("CreateFile", hwnd);
    hdr.bfType = 0x4d42;        // 0x42 = "B" 0x4d = "M"

(添加大括号)

对于
pszFile
的类型,使用
LPCTSTR
而不是
LPTSTR
,这是
CreateBMPFile
的一个参数,也很好
传递字符串文字时避免编译器警告。

您的目标是什么?是否要截屏并保存到文件?是否要使用
HBITMAP
并保存到文件?是否要绘制并保存到文件?是否要操作位和t