Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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 使用BitBlt无法正确显示图像_C_Winapi - Fatal编程技术网

C 使用BitBlt无法正确显示图像

C 使用BitBlt无法正确显示图像,c,winapi,C,Winapi,所以我昨天才开始写c。我尽可能的新鲜,尝试了一个相当简单的任务,在桌面上显示一个图像。首先,我尝试使用像素: #include <stdio.h> #include <stdlib.h> #include <windows.h> int main() { int a; int b; int x = 0; COLORREF clr = RGB(200,100,30); HDC dc = GetDC(NULL)

所以我昨天才开始写c。我尽可能的新鲜,尝试了一个相当简单的任务,在桌面上显示一个图像。首先,我尝试使用像素:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main() {
    
    int a;
    int b;
    int x = 0;
    COLORREF clr =  RGB(200,100,30);
    HDC dc = GetDC(NULL);
    while (x != 1){
        for (a=0; a<20; a++){
            for (b=0; b<20; b++){
                SetPixel(dc,b,a, clr);
            }
        }
    }

    return 0;
}
它成功了。现在我尝试对整个图像执行此操作,但失败了:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main() {
    
    int x = 0;
    HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, "neco.bmp", IMAGE_BITMAP, 487, 456, LR_LOADFROMFILE); 
    HDC dc = GetDC(NULL);
    
    while (x != 1){
        BitBlt(dc,0,0,487,456,hBitmap,0,0,SRCPAINT);
    }

    return 0;
}
我假设它读取图像就像我使用BLACKNESS作为BitBlt的最后一个参数一样,它确实显示给定尺寸的黑色矩形。但通常情况下,不会发生其他情况。此外,脚本编译时不会引发任何错误

BitBltdc,0,0487456,位图,0,0,SRCPAINT

在这一行,您尝试将位图句柄传递给设备上下文句柄参数

请注意,BitBlt将位从一个设备上下文传输到另一个设备上下文。您可以为位图创建另一个单设备上下文,在其中选择位图,然后执行所需操作。例如:

#include <windows.h>

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
  HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, "neco.bmp", IMAGE_BITMAP,
      487, 456, LR_LOADFROMFILE);

  HDC hDC = GetDC(NULL);
  HDC hBitmapDC = CreateCompatibleDC(hDC);
  HBITMAP hOldBitmap = (HBITMAP)SelectObject(hBitmapDC, hBitmap);

  BitBlt(hDC, 0, 0, 487, 456, hBitmapDC, 0, 0, SRCCOPY);

  /* Don't forget to release resources that you've acquired */
  SelectObject(hBitmapDC, hOldBitmap)
  DeleteObject(hBitmap);
  DeleteDC(hBitmapDC);
  ReleaseDC(HWND_DESKTOP, hDC);

  return 0;
}

编辑:感谢@IInspectable纠正我关于GDI资源发布的错误。

图像文件在哪里,您如何运行程序?IIRC,您不能只是从位图到DC的BitBlt,您必须创建一个MemoryDC,在其中选择位图,然后从那里开始BitBlt。请参见,例如,您需要备份并获得Petzold的书,或类似内容。在你可以走路之前,你已经在跑步了。@user253751我确实使用plato ide中的SCC来运行它,我的图像文件的格式与我们以前要求询问者证明基本熟悉问题域的格式相同。我不知道为什么会被取消像这样的问题不再有适当的理由关闭它们,尽管它们应该关闭。当GDI资源仍被选择到设备上下文中时删除它是不受支持的操作。在设备上下文中仍选择了它不拥有的对象时删除该设备上下文同样是不受支持的操作。@IInspectable,感谢您的启发!我编辑了我的答案。现在正确吗?我不知道如何从设备上下文中释放所选对象。我应该向SelectObject的第二个参数传递什么?空的还是以前严格保存的对象?