Articles of gdi +

如何链接要从本地目录加载的库?

我正在尝试编译和捆绑一个Linux版本的应用程序,这个应用程序需要libgdiplus这样的外部库文件。 当我尝试在没有安装GDIPlus的环境中运行应用程序时,无法findlibgdiplus.so的本地副本,我将其作为我的应用程序在下一个目录中。 如果我使用strace来查看正在发生的事情,我清楚地看到它检查了许多位置,例如/ lib / / usr / lib / etc,但从来不是本地目录。 我如何告诉我的应用程序在本地目录中search外部库?

用存储器像素数据的多个图像构buildHICON

有没有一个Win32 API来构build一个HICON句柄,其中包含存储在内存中的像素数据的多种尺寸的图标? 我知道我可以使用CreateIconIndirect()从内存像素数据构造单个图标,但是这些图标总是只包含一个尺寸,但是我想要构造一个包含16×16,24×24,32×32,48×48和256×256图标的HICON句柄, RegisterClassEx()。 我知道我可以简单地使用一个资源图标或加载一个外部的* .ico但是这一切都不可能为我的具体情况。 我需要能够从内存像素数据构造这个多图像HICON。 我唯一想到的解决scheme是在磁盘上创build一个临时的.ico文件,然后使用LoadIcon()加载,但这不是一个好的解决scheme。 这就是为什么我想问一下,是否有一个API来从内存像素数据构build一个多图像HICON? 谢谢!

在GDI +中删除某行的某一部分

我有一个类似于箭头的行。我在该行的顶部绘制了一个文本。现在,我想删除与文本重叠的部分行 我目前的代码是这样的: SolidBrush *brush1=new SolidBrush(Color::Color(0,167,255)); StringFormat format; format.SetAlignment(StringAlignmentCenter); format.SetLineAlignment(StringAlignmentCenter); graph->DrawLine(myPen,point2,point1); graph->DrawString(strdata,wcslen(strdata),&font,point2,&format,brush1); 我也试过了 AdjustableArrowCap *cap1 = new AdjustableArrowCap(5, 5, true); Pen *myPen1 = new Pen(Color::Color(0,255,255), width); myPen->SetCustomEndCap(cap1); GraphicsPath path; path.AddLine(point1,point2); Font font(&FontFamily(L"arial"), 21); Brush *brush=new SolidBrush(Color::Color(0,255,255,255)); SolidBrush solidBrush(Color(255, 255, 0, 0)); StringFormat format; format.SetAlignment(StringAlignmentCenter); format.SetLineAlignment(StringAlignmentCenter); RectF rectbo; graph->MeasureString(strdata,wcslen(strdata),&font,PointF::PointF(point2),&rectbo); graph->DrawLine(myPen,point2,point1); Region pathRegion(&path); sta=pathRegion.Intersect(rectbo); graph->fillRegion(pathRegion,&brush); graph->DrawString(strdata,wcslen(strdata),&font,point2,&format,brush1);

用Windows GDI绘制点

我对Windows GDIgraphicsAPI非常熟悉,并且有一个我一直想念的function:如何绘制一个点? 一个点,我的意思是一个小图案的像素,比如3×3或5×5的正方形(可能省略了angular落),都是相同的颜色。 我的限制是,我想尽可能有效地做到这一点,尽可能less的资源。 我可以根据需要多次使用SetPixel函数(25个5×5方块的调用)。 我可以使用MoveTo / LineTo调用粗笔在相同的坐标上两次。 但我不确定这会产生一个完整的点,我不喜欢创build一个专用笔的想法。 我也可以使用Rectangle或Ellipse函数,但是这些绘制轮廓并填充内部,并且必须是这样一个微小形状的矫枉过正。 (不包括他们需要专用笔和专用笔刷的事实。) 你有什么洞察力什么可以是一个有效和方便的方法? 你会怎么做?

C#中隐藏的“GDI +钩子窗口”是什么?

每当任何C#应用程序在进程中打开包含控件的第一个窗体时,将打开一个名为“G”的隐藏窗口,其类名称为“GDI + Hook窗口类” ,如下面的应用程序所示: 这里是使用的代码: using System; using System.Text; using System.Diagnostics; using System.Drawing; using System.Runtime.InteropServices; using System.Windows.Forms; namespace WindowsFormsApplication1 { public class Form1 : Form { private delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam); private EnumThreadDelegate showWindowName; private Button button1; private string windowList = string.Empty; private Button button2; private int increment; [DllImport("user32.dll")] private static extern bool […]

在内核级别loggingWindows Syscalls

Windows Syscall从内核login 你好。 我正在尝试loggingWindows 7中调用的特定系统调用(win32k)。我已经尝试了几种方法。 我尝试的第一件事是drstrace 。 这是我需要的输出的确切types(函数名称,参数和返回值),但不是所有的系统调用都被logging下来。 我不是100%确定为什么会发生这种情况,但像NtGdiSettypes的系统调用一次使用NtGdiFlush调用,所以这些系统调用不能在用户级捕获。 接下来,我尝试了logman和xperf,这些似乎logging了那些函数drstrace不能,但他们不解决系统调用名称(实际上这并不是什么大不了的),他们不logging参数。 而且它也logging了系统调用的返回值,但是它不匹配返回值来自哪个调用,这是一个大问题。 我曾经想过构build一个在内核级别挂钩函数的驱动程序,但是我从来没有开发过一个驱动程序,但是效果并不好。 所以我想问问,如果已经有可以做到这一点的程序,或者我如何build立一个可以logging我想要的驱动程序?

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" […]

像素精确的string测量

我尝试计算给定文本的确切像素大小(例如对于InvalidateRect或稍后创build一个足够大的位图)。 在测量时我没有设备上下文,所以我不得不求助于内存设备上下文。 我发现DT_CALCRECT DrawText显然返回“advance width”,而不是绘制时像素占用的实际宽度。 用GetCharABCWidths补偿这个( 这里是ABC宽度的解释)最好是另一个近似值,因为如果第一个字形非常窄(如果它看起来“给出了好的结果”,那么第二个字形的ABC宽度可能是决定性的我的例子),更不用说字体平滑。 因此,我尝试使用SetBoundsRect / GetBoundsRect : auto MeasureTest = [](int x, int y) { auto dc = CreateCompatibleDC(nullptr); SetBoundsRect(dc, nullptr, DCB_ENABLE | DCB_RESET); auto const text = L"Test"; RECT rect{x, y, x, y}; DrawText(dc, text, 4, &rect, DT_NOCLIP); GetBoundsRect(dc, &rect, 0); return rect; }; (请忽略内存泄漏,我确认所有这些函数都返回了我在MSDN中读到的内容。) 使用这个例程,我得到以下结果: MeasureTest(0, 0); // returns […]

使用不受支持的Win32 GDI笔模式的问题?

MSDN 文档 (有点)清楚下面关于GDI笔的两个事实: 一个化妆笔(通过CreatePen或ExtCreatePen w / PS_COSMETIC创build)必须是1 单位宽(好,<= 1,但我们不要去那里)。 几何(ExtCreatePen w / PS_GEOMETRIC)笔必须固定(仅PS_SOLID,无PS_DASH等)。 但是,他们可以画粗线。 这在我上面提到的链接中只有9倍的限制(我是愚蠢的)。 我的辩护(坏)评论和(破碎)的逻辑在我的代码导致我相信,否则。 其他一些Googlesearch的文章一定是只写了Windows 9x。 为什么我可以说这些规则,并让GDI愉快地画这些笔? 我可以创build脂肪(例如宽度= 10)化妆笔和虚线几何笔。 哎呀,我可以创build一个虚的几何笔! 这些钢笔似乎通常工作得很好。 我看到的唯一问题是在Polyline中,当我传递非常大的点数组时 – 它渲染的线条非常缓慢。 然而,Polyline在大型数组中的performance总是奇怪 – 它只是与坏笔的行为不同。 (我的其他折线问题可能是另一个问题…) 使用广泛的化妆笔或宽几何图案是否安全?

使用GDIPlusresize的模糊顶端

我使用下面的代码来使用C中的GDI +来调整位图的大小。即使对于那些区域应该是白色的图像,我也会得到顶边的灰度值。 当插值是最近的邻居时问题消失。 但是,我试图用ImageMagick的双三次插值,似乎很好。 任何限制问题我应该知道的? 我的方法缩放错了吗? 谢谢! (input:destSize:目的地Gdiplus ::大小m_pBitmap:源位图) Rect destRect(Point(0,0), destSize); Bitmap *pBitmap24BPP = new Bitmap(destSize.Width, destSize.Height, PixelFormat24bppRGB); pBitmap24BPP->SetResolution(m_pBitmap->GetHorizontalResolution(), m_pBitmap->GetVerticalResolution()); Graphics *pGraphics = Graphics::FromImage(pBitmap24BPP); pGraphics->SetInterpolationMode(InterpolationModeHighQualityBilinear); pGraphics->DrawImage(m_pBitmap, destRect, 0, 0, m_pBitmap->GetWidth(), m_pBitmap->GetHeight() , UnitPixel, NULL); //cleanup