Articles of gdi +

为什么GetObject返回空bmBits的BITMAP?

上下文:我试图把另一个窗口的截图提供给OpenCV。 我发现在networking上的一些代码应该能够将BITMAP转换为OpenCV可以使用的东西。 不幸的是我遇到了一些麻烦。 问题:为什么bmBits属性/成员始终为空? (我也试过用PrintWindow代替BitBlt,结果是一样的) #include <iostream> #include <string> #include <Windows.h> int main(int argc, char* argv[]) { std::wstring windowName = L"Calculator"; RECT rect; HWND hwnd = FindWindow(NULL, windowName.c_str()); if (hwnd == NULL) { return 0; } GetClientRect(hwnd, &rect); HDC hdcScreen = GetDC(NULL); HDC hdc = CreateCompatibleDC(hdcScreen); HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen, rect.right – rect.left, rect.bottom – […]

Windows Aero:绘制“玻璃”的颜色是什么颜色?

我必须在客户区涂上什么颜色才能使玻璃出现? 我已经把我的表单框架扩展到客户区使用: DwmExtendFrameIntoClientArea(self.Handle, margins); 我找不到任何官方文档从微软的DWM将寻找什么颜色和/或阿尔法replace玻璃。 DwmExtendFrameInClientArea文档甚至没有提到自定义颜色是必需的。 只有传闻和神话,甚至需要特殊的颜色。 我能find的最接近MSDN的话题是: 使用DWM自定义窗口框架 为了使扩展帧可见,每个扩展帧边下的区域必须具有α值为0的像素数据。 更新:和一个博客文章: 面向开发人员的Windows Vista – 第3部分 – 桌面窗口pipe理器 偶尔,RGB黑色(0x00000000)的位模式与100%透明ARGB的位模式相同,因此您可以使用“黑色”GDI笔刷进行绘制,并假设您已经指示DWM模糊绘制区域,结果将是所需的玻璃效果。 如果我从字面上理解( alpha值为零的像素数据 ),我构build一个零alpha的颜色,并在扩展区域绘制: Color fillColor = Color.FromArgb(0, 0, 0, 0); //(a, r, g, b) e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle); 但玻璃效果不会出现: 替代文字sof/windows/anlmd4.png 如果我忽略引用的MSDN主题,而是使用完全不透明的黑色(而不是完全透明的黑色): Color fillColor = Color.FromArgb(255, 0, 0, 0); //(a, r, g, b) e.Graphics.FillRectangle(new SolidBrush(fillColor), e.ClipRectangle); 玻璃效果确实出现: 替代文字sof/windows/2ug2ias.png 那么我就会相信不透明的黑色是DWM将用玻璃代替的像素值。 […]

(Windows API)WM_PAINT鼠标问题

我创build了一个包含以下标志的窗口来覆盖一个d3d应用程序:WS_EX_TOPMOST | WS_EX_COMPOSITED | WS_EX_TRANSPARENT | WS_EX_LAYERED我继续着色转换的窗口,一切运作良好。 但是一旦我开始使用GDI进行绘图,就会出现一个无法预料的问题: 出于某种原因,当WM_PAINT正在进行时,鼠标事件(特别是运动)不能正确地通过窗口传递,所以看起来好像鼠标和键盘相对滞后。 FPS是好的,这是一些API的问题,我怀疑由于某种原因,键盘/鼠标消息没有处理,因为他们应该在WM_PAINT正在进行,因为计时器设置得越慢,那就是。 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_DESTROY: { KillTimer(hwnd, ID_TIMER); PostQuitMessage(0); break; } case WM_CREATE: { SetTimer(hwnd, ID_TIMER, 10, NULL); break; } case WM_TIMER: { InvalidateRect(hwnd, 0, 1); break; } case WM_PAINT: { paint(hwnd); break; } } […]

如何在Windows对话框中处理WM_ERASEBKGND时避免闪烁

我有一个resize的对话框。 它也有一个自定义的背景,我为响应WM_ERASEBKGND调用而绘制(当前是对FillSolidRect的简单调用)。 当对话框resize时,会出现巨大的闪烁。 为了尝试减less闪烁,我枚举所有的子窗口,并将其添加到剪辑区域。 这似乎有一点帮助 – 现在,闪烁现象在所有的儿童控制中都是显而易见的,因为它们被重新绘制。 如何在resize的同时使对话框无闪烁? 我怀疑双缓冲必须发挥一部分,但我不知道如何做到这一点与儿童控制的对话(没有使所有的孩子控制所有者绘制或类似的东西)。 我应该注意到,我正在使用C ++(不是.NET)和MFC,但是欢迎使用纯粹的基于Win32的解决scheme:) 注:有一件事我尝试了,但没有奏效(不知道为什么)是: CDC memDC; memDC.CreateCompatibleDC(pDC); memDC.FillSolidRect(rect, backgroundColor); pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);

DirectDraw比GDI更快地截图吗?

只是为了节省一些时间,可能有人试过这个或看到相关的信息。 询问DirectDraw而不是DirectX,因为我需要支持Win2000以上,而且我无法在目标PC上安装DirectX

如何获取GDI句柄的列表

我试图写,使用DLL注入方法,显示另一个程序使用的位图的应用程序,我想要得到它正在使用的GDI句柄(如GDIView.exe实用程序中的列表)的特定进程列表。 我find了关于NtQuerySystemInformation函数的文章,但是这个描述只适用于内核对象的句柄。 有人可以帮忙吗?

高效地获取Windows桌面的屏幕截图

有没有比下面的代码更有效的方式获得Windows桌面(使用GDI或任何其他库)的副本 HDC dcDesktop; HDC dcMem; HBITMAP hbmpMem; HBITMAP hOriginal; BITMAP bmpDesktopCopy; dcDesktop = GetDC( GetDesktopWindow() ); dcMem = CreateCompatibleDC( dcDesktop ); hbmpMem = CreateCompatibleBitmap( dcMem, m_lWidth, m_lHeight ); BitBlt( dcMem, 0, 0, m_lWidth, m_lHeight, dcDesktop, 0, 0, SRCCOPY ); // Copy the hbmpMem to the desktop copy GetObject(hbmpMem, sizeof(BITMAP), (LPSTR)&bmpDesktopCopy);

如何将Windows屏幕坐标转换为屏幕截图像​​素坐标?

我需要find截图的控制。 我有它的屏幕坐标。 如何将它们转换为截图上的坐标?

绘制鼠标指针图标?

我正在编写有趣的小工具。 我想能够在原始鼠标的不同位置绘制第二个(或更多)鼠标指针图标,但要根据原始鼠标的移动来移动它。 我知道如何跟踪鼠标的移动,但我不知道如何绘制/重绘鼠标指针; 谁能帮忙?

捕获隐藏桌面的屏幕截图

我正在Windows上使用虚拟桌面使用简单的应用程序,我用C ++编码自己,我想知道是否有方法来捕获次要/隐藏桌面的屏幕截图? 我知道我可以做SwitchDesktop – >截图截图 – > SwitchDesktop,但它听起来不是很好的解决scheme…. 也许我在隐藏的桌面上运行一些窗口,以获得其hwnd和有人用它来捕捉整个屏幕? 我运行Spy ++,但似乎没有find不属于当前活动桌面的窗口。 提前致谢。