标签: gdi

Windows GDI 上下文 - LoadImage 和 GetLastError()

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 是有效的位图资源。

c++ winapi gdi

1
推荐指数
1
解决办法
1651
查看次数

在 WM_PAINT 中绘制(太慢)会导致闪烁?

我想使用以下代码在 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)

winapi gdi+ gdi

1
推荐指数
1
解决办法
4622
查看次数

DirectShow 过滤器以抓取特定窗口

我看到了另一个听起来几乎相同的问题,但答案似乎与整个桌面屏幕截图有关:DirectShow Source filter using Dekstop window as source

我已经查看了 PushSource,是的,它完成了它的目的,但是我希望虚拟网络摄像头抓取特定窗口(类似于您可以选择在 Skype 的共享屏幕中共享窗口的方式)。

我将如何选择特定窗口作为虚拟网络摄像头的捕获?DirectShow API 中是否有我不知道的特定方法?

winapi directshow gdi screen-capture

1
推荐指数
1
解决办法
1216
查看次数

CreateCompatibleBitmap()返回黑色HBITMAP

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().我正确使用此功能吗?有没有我不应该做的事我应该这样做?

c++ winapi gdi

1
推荐指数
1
解决办法
3549
查看次数

winapi:从HDC到HBITMAP

我想做一些我认为相当简单的事情,但由于我是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)

c++ winapi gdi bitmap

1
推荐指数
1
解决办法
1155
查看次数

初学者在 MFC C++ 中,为什么设备上下文需要创建一个旧的 Font/Bitmap/etc 指针,然后在最后选择对象()?

案例:

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 指针然后 …

mfc gdi visual-c++ cbitmap

1
推荐指数
1
解决办法
877
查看次数

Gdi+ 截屏多台显示器

我有一个例行程序,可以使用 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)

c++ gdi+ screenshot gdi

1
推荐指数
1
解决办法
1965
查看次数

与 directX/openGL 相比,windows gdi 的工作原理如何?

我知道 DirectX 和 OpenGL 都内置于显卡中,您可以在需要时访问它们,因此所有渲染都将基于硬件加速。

我找不到任何有关 GDI 的信息,但我确信它不是基于显卡的加速。这些技术有何不同,我在这里缺少什么?

opengl directx graphics rendering gdi

1
推荐指数
1
解决办法
5130
查看次数

带缩放功能的 Windows 屏幕截图

我正在尝试截取 Windows 10 计算机上每个屏幕的屏幕截图。我的系统有 2 个具有多个 DPI 的显示器。

  • 我的主显示器将“比例和布局”设置为 200%。
  • 我的辅助将“比例和布局”设置为 100%。 在此输入图像描述

我正在尝试使用 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)

.net c# windows gdi

1
推荐指数
1
解决办法
3432
查看次数

在 C++ 中查找像素 RGB 数据的最快方法是什么?

我想查看屏幕上 100 X 100 正方形中每个像素的 RGB 数据并将其存储在数组中。我在 for 循环中使用 GetPixel() 得到了这个概念,然后将输出转换为十六进制并将 RGB 数据存储在数组中,但这种方法需要的时间比我想要的要长得多。用 C++ 读取像素 RGB 数据的最快方法是什么?

c++ windows gdi

1
推荐指数
1
解决办法
258
查看次数