LoadImage()在我的程序的第一步中调用返回 NULL。就在它之后,GetLastError()被调用,它出人意料地返回 0。我想知道为什么LoadImage()失败,因为GetLastError()清楚地表明在失败的函数之后没有设置错误代码。这是代码片段:
if ( (hbitmap = (HBITMAP) LoadImage(hThisInstance, MAKEINTRESOURCE(MY_BITMAP),
IMAGE_BITMAP, 0, 0,
LR_CREATEDIBSECTION)) == NULL)
printf("Last error: %d\n", GetLastError());
Run Code Online (Sandbox Code Playgroud)
使用 HBITMAP hbitmap、HINSTANCE hThisInstance(WinMain 的参数)和 MY_BITMAP 是有效的位图资源。
我想使用以下代码在 WM_PAINT 消息处理程序中绘制很多行。
//DrawLine with double buffering
LRESULT CALLBACK CMyDoc::OnPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
std::vector<Gdiplus::Point> points;
std::vector<Gdiplus::Point>::iterator iter1, iter2;
HDC hdc, hdcMem;
HBITMAP hbmScreen, hbmOldBitmap;
PAINTSTRUCT ps;
RECT rect;
hdc = BeginPaint(hWnd, &ps);
//Create memory dc
hdcMem = CreateCompatibleDC(hdc);
GetClientRect(hWnd, &rect);
hbmScreen = CreateCompatibleBitmap(hdc, rect.right, rect.bottom);
hbmOldBitmap = (HBITMAP)SelectObject(hdcMem, hbmScreen);
//Fill the rect with white
FillRect(hdcMem, &rect, (HBRUSH)GetStockObject(WHITE_BRUSH));
//Draw the lines
Gdiplus::Graphics graphics(hdcMem);
Gdiplus::Pen blackPen(Gdiplus::Color(255, 0, 0));
points = m_pPolyLine->GetPoints();
for (iter1 = points.begin(); iter1 != points.end(); iter1++) …Run Code Online (Sandbox Code Playgroud) 我看到了另一个听起来几乎相同的问题,但答案似乎与整个桌面屏幕截图有关:DirectShow Source filter using Dekstop window as source。
我已经查看了 PushSource,是的,它完成了它的目的,但是我希望虚拟网络摄像头抓取特定窗口(类似于您可以选择在 Skype 的共享屏幕中共享窗口的方式)。
我将如何选择特定窗口作为虚拟网络摄像头的捕获?DirectShow API 中是否有我不知道的特定方法?
Hello Stack Overflow用户.我似乎没有在以下代码中正确使用CreateCompatibleBitmap():
#include <windows.h>
using namespace std;
int main() {HDC hdc=GetDC(HWND_DESKTOP); HDC MemDC=CreateCompatibleDC(hdc);
HBITMAP hBit=CreateCompatibleBitmap(hdc,1366,768);
SelectObject(MemDC,hBit);
BitBlt(hdc,0,0,1366,768,MemDC,0,0,SRCCOPY); //Screen turns black
DeleteObject(hBit);
ReleaseDC(HWND_DESKTOP,hdc);
ReleaseDC(NULL,MemDC);
DeleteDC(MemDC);
DeleteDC(hdc);
}
Run Code Online (Sandbox Code Playgroud)
我认为CreateCompatibleBitmap()是返回Desktop DC的1366x768部分,但在BitBlt()之后会显示黑屏.而不是使用CreateCompatibleBitmap我将位图文件加载到hBit,一切都是所希望的,所以我猜问题只在于CreateCompatibleBitmap().我正确使用此功能吗?有没有我不应该做的事我应该这样做?
我想做一些我认为相当简单的事情,但由于我是winapi的新手,我发现了很多问题.基本上我有一个HDC(我从一个加载的位图BitBlitting),我正在绘制一个矩形.然后我想将HDC BitBlt放到一个新的HBITMAP对象上,但唉现在无济于事.
这是我的代码,我一直试图开始工作几个小时
BITMAPINFO info;
Bitmap *tempbmp = Bitmap::FromFile(L"C:\\Users\\abelajc\\Pictures\\BackgroundImage.png", false);
HBITMAP loadedbackground;
tempbmp->GetHBITMAP(NULL, &loadedbackground);
HBRUSH hRed = CreateSolidBrush(RGB(255, 0, 0));
HDC pDC = GetDC(0);
HDC TmpDC = CreateCompatibleDC(pDC); //main DC on which we will paint on
HDC dcBmp = CreateCompatibleDC(TmpDC); //DC for the loadedbackground HBitmap
HGDIOBJ TmpObj2 = SelectObject(dcBmp , tempbmp); //Selecting Bitmap in DC
BitBlt(TmpDC, 0, 0, 512, 512, dcBmp, 0, 0, SRCCOPY);
SelectObject(dcBmp, TmpObj2); //Deselecting Bitmap from DC
DeleteDC(dcBmp);
RECT rectangle;
SetRect(&rectangle, 5, 5, 20, 20);
FillRect(TmpDC, &rectangle, …Run Code Online (Sandbox Code Playgroud) 案例:
void CMainWindow::OnPaint ()
{
CRect rect;
GetClientRect (&rect);
CPaintDC dc (this);
dc.SetViewportOrg (rect.Width () / 2, rect.Height () / 2);
dc.SetBkMode (TRANSPARENT);
for (int i=0; i<3600; i+=150) {
LOGFONT lf;
::ZeroMemory (&lf, sizeof (lf));
lf.lfHeight = 160;
lf.lfWeight = FW_BOLD;
lf.lfEscapement = i;
lf.lfOrientation = i;
::lstrcpy (lf.lfFaceName, _T ("Arial"));
CFont font;
font.CreatePointFontIndirect (&lf);
CFont* pOldFont = dc.SelectObject (&font);
dc.TextOut (0, 0, CString (_T (" Hello, MFC")));
//WHY THIS LINE?
dc.SelectObject (pOldFont);
}
}
Run Code Online (Sandbox Code Playgroud)
代码在围绕原点(移动到窗口中心)的圆圈中打印“Hello, MFC”。

为什么创建 CFont 指针然后 …
我有一个例行程序,可以使用 gdi plus 和 c++ 在 Windows 平台上截取屏幕截图,它仅适用于一台显示器,但当我在一台带有 2 台显示器的 VM 机器上运行它时,它只拍摄一张照片。
这就是我正在做的:
#include <stdlib.h>
#include <windows.h>
#include <iostream>
#include <GdiPlus.h>
#include <wingdi.h>
#include <fstream>
#include <unistd.h>
#pragma comment(lib, "gdiplus.lib")
#pragma comment(lib, "ws2_32.lib")
using namespace std;
// Se encarga de configurar, por asi decirlo, el formato
// de la imagen, este metodo es llamado en gdiscreen al
// momento de guardar la imagen.
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
using namespace Gdiplus;
UINT num = 0; // number of …Run Code Online (Sandbox Code Playgroud) 我知道 DirectX 和 OpenGL 都内置于显卡中,您可以在需要时访问它们,因此所有渲染都将基于硬件加速。
我找不到任何有关 GDI 的信息,但我确信它不是基于显卡的加速。这些技术有何不同,我在这里缺少什么?
我正在尝试截取 Windows 10 计算机上每个屏幕的屏幕截图。我的系统有 2 个具有多个 DPI 的显示器。
我正在尝试使用 C# 来截取每个监视器的屏幕截图。然而,我的缩放显示器报告了错误的坐标:一切都减半了。因此,主显示器的屏幕截图仅为屏幕面积的 1/4(宽度/2,高度/2)。
这是我的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Imaging;
namespace CsSourceClient
{
class Program
{
static void Main(string[] args)
{
Screen[] screens;
screens = Screen.AllScreens;
int i = 0;
foreach (var screen in System.Windows.Forms.Screen.AllScreens)
{
var savePath = "monitor" + i+".jpg";
var x = screen.Bounds.Location.X;
var y = screen.Bounds.Location.Y;
var w = screen.Bounds.Width;
var h = screen.Bounds.Height;
Console.Out.WriteLine("Monitor: …Run Code Online (Sandbox Code Playgroud) 我想查看屏幕上 100 X 100 正方形中每个像素的 RGB 数据并将其存储在数组中。我在 for 循环中使用 GetPixel() 得到了这个概念,然后将输出转换为十六进制并将 RGB 数据存储在数组中,但这种方法需要的时间比我想要的要长得多。用 C++ 读取像素 RGB 数据的最快方法是什么?