Articles of gdi +

即使使用双缓冲,屏幕也会闪烁

我在编程方面是全新的。 对于我的第一个程序,我试图用c#做一个小型的游戏。 下面的代码是一个几乎工作的蛇,(一些错误尚未修复),但我找不到一个工作的解决scheme,以解决闪烁。 (我不知道双缓冲,所以我只是从这里拿走:[ http://www.codeguru.com/forum/archive/index.php/t-272723.html] [1 ] // snake1.02.cpp : Defines the entry point for the application. // #include "stdafx.h" #include "snake1.02.h" #include "stdio.h" #define ID_MYTIMER 1234567 #define ID_BERRY 1 #define SEGMENTSIZE 10 const WCHAR szClassName[] = L"Snake1.02"; HWND hWnd; UINT myTimer; struct point { int x, y; }; point snake[500]; int dx = SEGMENTSIZE; […]

使非客户区域失效

我有一个自定义边框/标题的窗口,为了做到这一点我处理WM_NCPAINT消息。 我的标题有两个背景,一个是活动窗口,另一个是背景窗口。 但是在某些情况下,例如当窗口失去/获得焦点时,我的标题不会更新,因此我以错误的背景结束。 直到现在我已经处理WM_NCACTIVATE,并发送RedrawWindow(hwnd,NULL,NULL,RDW_FRAME | RDW_INVALIDATE),但是这会导致整个窗口重新绘制。 你有什么build议吗?

奇怪的错误与CreateCompatibleDC

也许这是一个愚蠢的问题,我不明白为什么我不能得到在下面的代码中创build一个DC: HBITMAP COcrDlg::LoadClippedBitmap(LPCTSTR pathName,UINT maxWidth,UINT maxHeight) { HBITMAP hBmp = (HBITMAP)::LoadImage(NULL, pathName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); if (!hBmp) return NULL; HDC hdc = (HDC)GetDC(); HDC hdcMem = CreateCompatibleDC(hdc); if (!hdcMem) { DWORD err = GetLastError(); } … … … 位图hBmp加载正常,hdc有一个有效的值。 但是对CreateCompatibleDC()的调用返回一个NULL指针。 然后,GetLastError()返回0! 任何人都可以猜到这是怎么回事? PS:在这之前没有调用内存分配或GDI例程…所以我认为应该排除内存泄漏。

StretchBlt HALFTONE == BILINEAR是否适用于所有缩放?

任何人都可以澄清,如果工作站Win32 API的GDI StretchBlt函数执行双线性插值缩放到24/32位彩色图像的更大和更小的图像? 如果没有,是否有一个GDI( 而不是 GDI +)函数呢? SetStretchBltMode fn有一个HALFTONE设置,logging如下: HALFTONE将源矩形中的像素映射到目标矩形中的像素块。 目标像素块上的平均颜色接近源像素的颜色。 我已经看过参考文献(请参阅第一个答案的后续内容) ,这是在缩小图像时执行双线性插值,但没有清楚地说明放大时会发生什么。 我注意到, Windows Mobile CE SDK确实支持BILINEAR标志 – 这与HALFTONE注释完全相反(仅适用于扩展)。 请注意,对于这个问题的范围,我没有兴趣追求GDI +(有许多插值选项),OpenGL,DirectX等作为替代品,所以请不要打扰后续关于这些其他API或替代图像库。 我真正希望find的是一些明确的MS / MSDN或其他高质量的文档,清楚地logging了Win32(桌面)GDI行为的这种行为。 同时,我会尝试一些比较GDI和Direct2D(它有一个明确的标志来控制这个)并发布我的发现的实验。 谢谢!

不应该Gdiplus :: Image :: GetWidth()和一堆其他获得者是“常量”?

他们为什么不是常量? 我相信这是有缺陷的APIdevise。 还是我错过了什么? UINT GetWidth(); UINT GetHeight(); … 与 UINT GetWidth() const; UINT GetHeight() const; …

在图像析构函数中访问冲突

我可能会说一个非常简单的程序 #include <windows.h> #include <gdiplus.h> using namespace Gdiplus; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR cmdLine, int nShow){ // Gdiplus variables GdiplusStartupInput mGdiplusStartupInput; ULONG_PTR mGdiplusToken; GdiplusStartup(&mGdiplusToken, &mGdiplusStartupInput, NULL); Bitmap bitmap(L"left.bmp"); GdiplusShutdown(mGdiplusToken); return 0; } 在运行这个例子时,我在这个函数中得到了GdiplusBitmap.h中的访问冲突 inline Image::~Image() { DllExports::GdipDisposeImage(nativeImage); } 通过去除对Bitmap bitmap(L"left.bmp");的调用Bitmap bitmap(L"left.bmp"); 一切工作正常..我试图find一个简单的例子在msdn(例如某处附近的位图构造函数 ,但没有find任何东西。) 我错过了什么?

从剪辑区域排除圆形的矩形?

用Delphi / GDI从剪贴簿格雷格排除圆形矩形的正确方法是什么? 有ExcludeClipRect排除一个矩形区域,并有CreateRoundRectRgn与SelectClipRgn一起设置剪切区域为一个圆形的矩形。 但是,我怎样才能从裁剪区域排除一个圆形的rectange(如ExcludeClipRoundRect或ExcludeClipRgn)? 我用CombineRgn进行了实验,但没有得到它的工作。

如何在C ++中使用WinApi(GDI)在GUI窗口中单击鼠标单击像素?

我试图通过点击鼠标来设置像素,但是当我点击时没有任何反应。 这是我的代码的一部分。 首先,我在WM_SIZE中控制窗口大小的变化。 与第一次当我想通过鼠标设置像素时,我得到窗口的宽度和高度,然后将窗口的内容复制到内存HDC和HBITMAP(在存储窗口中)(HBITMAP大小等于(宽度,高度))。 其实我只复制到内存清除窗口。 和任何情况下,我把像素设置为内存DC。 在下一个WM_PAINT消息处理我正在绘制内存DC屏幕。 ….. case WM_SIZE: { CheckWidthHeight(); break; } case WM_MBUTTONDOWN: { if (firstTimeDraw) { CheckWidthHeight(); StoreWindow(); firstTimeDraw = false; } SetPixel(memoryDC, LOWORD(lParam), HIWORD(lParam), RGB(0,0,0)); break; } case WM_PAINT: { RestoreWindow(); break; } ….. 我的职能和变数是: HDC memoryDC; HBITMAP memoryBitmap; int width = 0, height = 0; bool firstTimeDraw = true; […]

什么是Windows DIB?

我只是在讨论是否有一个替代的Windowsgraphics库到GDI和Direct X在论坛。 有人提到WinDIB 。 可悲的是,他没有更多的解释。 现在我search了谷歌。 在Windows DIB上似乎没有Wikipedia文章。 看来,一些graphics库(如SDL)使用WinDIB后端 。 那么WinDIB究竟是什么 ? 有没有任何文件? 我可以在哪里了解更多?

什么时候应该在位图上调用DeleteObject()

我正在检查一些传统的Win32 / MFC项目。 我发现了以下(伪代码): HDC hDC = ::CreateCompatibleDC(hDCWnd); HANDLE hFileMap = ::CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, dwSize, FileMapName); HBITMAP hBmp = ::CreateDIBSection(hDCWnd, &zBI, DIB_RGB_COLORS, &pvNull, hFileMap, 0); ::SelectObject(hDC, hBmp); ::DeleteObject(hBmp); ::CloseHandle(hFileMap); // .. do something with hDC .. ::DeleteDC(hDC); 这对我来说很奇怪。 任何人都可以请解释是否正确的删除位图和/或closures文件句柄之前,我做了一些与DC? 谢谢。