Articles of gdi +

用GDI +和C ++减less闪烁

我在C ++ / MFC应用程序中使用GDI +,而且我无法避免在窗口大小调整的情况下闪烁。 我已经尝试了这些步骤: OnEraseBkGnd()返回TRUE; 在OnCtlColor()上返回NULL; 根据这个代码使用双缓冲: void vwView::OnDraw(CDC* pDC) { CRect rcClient; GetClientRect(rcClient); Bitmap bmp(rcClient.Width(), rcClient.Height()); Graphics graphics(&bmp); graphics.DrawImage(m_image, rcClient.left, rcClient.top); Graphics grph(pDC->m_hDC); grph.DrawImage(&bmp, 0, 0); } 难道我做错了什么? 或者有另一种方法来实现这一目标?

使用UpdateLayeredWindow将部分透明的GDI +位图绘制到无边框窗口

我正在尝试创build一个半透明像素的非矩形窗口。 该图像不是来自PNG,而是使用GDI +调用即时绘制的。 我创build窗口如下: WNDCLASSEX wc = WNDCLASSEX(); wc.cbSize = sizeof(wc); HINSTANCE instance = GetModuleHandle(nullptr); std::wstring classname(L"gditest ui window class"); if (!GetClassInfoEx(instance, classname.c_str(), &wc)) { //wc.cbSize; //wc.style = CS_DROPSHADOW; wc.lpfnWndProc = process_messages; //wc.cbClsExtra; //wc.cbWndExtra; wc.hInstance = instance; wc.hIcon; wc.hCursor = LoadCursor(0, IDC_ARROW); //wc.hbrBackground; //wc.lpszMenuName; wc.lpszClassName = classname.c_str(); wc.hIconSm; if (!RegisterClassEx(&wc)) throw GetLastError(); } m_window = […]

使用GDI +和C ++将JPEG编码的屏幕截图转换为缓冲区

我已经从SO的另一篇文章中修改了这段代码。 它将桌面截图并将其写入名为“test.jpg”的文件。 我有兴趣将JPEG数据直接保存到要通过networking发送的缓冲区中。 我很确定GdipSaveImageToStream是我所需要的,但我无法弄清楚它是如何工作的。 GpImage参数特别混乱。 我感谢您可以提供的任何帮助。 #include "stdafx.h" #include "windows.h" #include "gdiplus.h" using namespace Gdiplus; using namespace Gdiplus::DllExports; int GetEncoderClsid(WCHAR *format, CLSID *pClsid) { unsigned int num = 0, size = 0; GetImageEncodersSize(&num, &size); if(size == 0) return -1; ImageCodecInfo *pImageCodecInfo = (ImageCodecInfo *)(malloc(size)); if(pImageCodecInfo == NULL) return -1; GetImageEncoders(num, size, pImageCodecInfo); for(unsigned int j […]

Gdiplus :: Bitmap :: FromHICON是否正确处理“黑白图标”?

如MSDN ICONINFO中所述 ,根据结构是否定义黑白图标, hbmMask和hbmColor的格式不同。 hbmMask types:HBITMAP 图标位掩码位图。 如果此结构定义了黑白图标,则此位掩码将被格式化,以使上半部分为图标AND位掩码,下半部分为图标XOR位掩码。 在这种情况下, 高度应该是两倍的偶数 。 如果这个结构定义了一个颜色图标,这个掩码只定义了图标的AND位掩码。 这意味着我们需要检测hbmColor的存在来正确计算图标的高度。 但是,后来我注意到Gdiplus::Bitmap::FromHICON() ,它接受HICON并将其转换为Gdiplus::Bitmap 。 由于我没有看到有关GDI +中“黑白”图标的任何材料,这种方法是否在内部处理这种情况? (不幸的是,我没有一个方便的testing图标,我也不知道如何创build一个正确的testing用例。)

使用Win32 API查找图标资源中的图标数量

我有一个* .ico文件,其中包含与我的可执行文件链接的不同大小的多个图标作为资源。 我使用这个资源来设置我的应用程序的图标与RegisterClassEx() , 即 wcx.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)); 除此之外,我还想将这个资源中的所有单个图标转换为ARGB像素数组。 这应该可以通过使用GetIconInfo()返回的位图上的GetDIBits() GetIconInfo() 。 但是,有一个问题:我需要找出LoadIcon()返回的HICON句柄中的图标数量及其大小。 我似乎没有find需要HICON句柄的API,并告诉我在那里有多less图标,以及它们的大小是多less。 这是否有可能以某种方式,或者我需要去困难的方式和parsing* .ico资源我自己?

有更快的替代GDI GetPixel()?

我在.NET应用程序中使用gdi32.dll中的GetPixel()来对屏幕上任意位置的像素进行采样。 它工作正常,但它是我的主要性能瓶颈。 有没有更快的方法呢?

以编程方式将CFF字体转换为OpenType字体

有没有人有任何指针,我可以find额外的信息,如何创buildCFF字体的opentype包装? 目前我有一个CFF文件的parsing器,所以我可以从中获得各种信息(cmap,字形名称,宽度,名称等)。 鉴于此信息,我无法创build一个Opentype(truetype格式)包装,所以我可以使用GDI Windows上的字体; GDI不会加载Opentype字体,我唯一知道的是它无法加载字体。 有谁知道任何额外的信息,validation应用程序,示例代码,获取额外的信息,为什么不从Windows等加载字体? 注:我正在寻找信息如何做,而不是公用事业和/或转换工具。

C ++ / Win32:如何从HBITMAP获取alpha通道?

我有一个包含alpha通道数据的HBITMAP 。 我可以成功地使用::AlphaBlend GDI函数来渲染。 但是,当我调用::GetPixel GDI函数时,我永远不会用alpha组件返回值。 该文件确实说它返回像素的RGB值。 有没有办法检索HBITMAP像素的alpha通道值? 我希望能够检测何时使用:: AlphaBlend,以及何时使用旧式方法将源HBITMAP中的特定颜色视为透明。 HDC sourceHdc = ::CreateCompatibleDC(hdcDraw); ::SelectObject(sourceHdc, m_hbmp); // This pixel has partial transparency, but ::GetPixel returns just RGB. COLORREF c = ::GetPixel(sourceHdc, 20, 20); // Draw the bitmap to hdcDraw BLENDFUNCTION bf1; bf1.BlendOp = AC_SRC_OVER; bf1.BlendFlags = 0; bf1.SourceConstantAlpha = 0xff; bf1.AlphaFormat = AC_SRC_ALPHA; ::AlphaBlend(di.hdcDraw, x, […]

添加了AddFontResourceEx的字体在GDI +中不起作用

AddFontResourceEx为每种字体返回1,但字体在GDI +中不可访问(使用VS2015和Windows 10testing,也在Windows 2008 R2服务器上testing)。 如果我用Windows Fonts Explorer手动安装字体,一切正常。 看来,GDI +无法find与AddFontResourceEx或AddFontResource添加的字体,任何想法我怎么能得到这个工作? 我使用CodeJock库,它使用GDI +字体来渲染XAMLgraphics,所以我无法控制如何创build字体。 int n = 0; CPathW pw; pw.Combine(theApp.m_strMyAppFolder, _T("Roboto-Light.ttf")); n =AddFontResourceEx(pw, FR_PRIVATE, nullptr); pw.Combine(theApp.m_strMyAppFolder, _T("Roboto-Thin.ttf")); AddFontResourceEx(pw, FR_PRIVATE, nullptr); pw.Combine(theApp.m_strMyAppFolder, _T("Roboto-Regular.ttf")); AddFontResourceEx(pw, FR_PRIVATE, nullptr); pw.Combine(theApp.m_strMyAppFolder, _T("Ubuntu-R.ttf")); AddFontResourceEx(pw, FR_PRIVATE, nullptr); pw.Combine(theApp.m_strMyAppFolder, _T("Ubuntu-L.ttf")); AddFontResourceEx(pw, FR_PRIVATE, nullptr); ::SendNotifyMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);

关于GDI / GDI +的协调兼容性?

在使用GDI和GDI +进行交互绘图时遇到问题。 页面转换(特别是缩放)似乎在两者之间稍微偏离了一点点。 GDI上下文的哪些属性影响除SetViewportExt和SetWindowExt之外的输出的缩放? 该代码几乎只使用GDI绘制graphics,但在less数需要使用GDI +function(半透明)的情况下使用GDI +。 它使用SetViewportExt , SetWindowExt和SetViewportOrg来启用缩放和滚动。 当需要GDI +时,我会在HDC周围构build一个Gdiplus::Graphics对象并进行绘制。 我假设这使得graphics上下文包装设备上下文,并将其渲染中继到设备上下文。 如果我提取GDI +graphics上下文的变换matrix,我看到它是单位matrix,所以缩放是在其他地方完成的(在我猜的设备上下文中)。 我devise了一个简单的testing,用GDI和GDI +绘制相同的矩形数组,以确保所有的转换在两种情况下都是相同的。 代码片段如下: CRect rect = …; // Draw the rectangle using GDI CPen cpen(PS_DASH, 0, RGB(0,0,255)); pDC->SelectObject(&cpen); pDC->Rectangle(rect); { // Draw the rectangle using GDI+ Gdiplus::Graphics graphics(pDC->m_hDC); Gdiplus::Pen pen(Gdiplus::Color(180,180,180)); graphics.DrawRectangle( &pen, Gdiplus::Rect(rect.left, rect.top, rect.Width(), rect.Height())); } 其结果是:(蓝色虚线由GDI绘制,灰色由GDI +绘制) 我可以清楚地看到这两个坐标系是不同的。 […]