我想在C#中直接在桌面上绘图.从搜索一下,我最终使用Desktop HDC中的Graphics对象(null).然后,我正常使用这个Graphics对象绘制.
问题是当重绘屏幕的任何部分时,我的形状会丢失.我尝试了一个While循环,但它实际上最终绘制的速度与应用程序一样快,这不是桌面的更新速率.
通常,我需要将我的绘图代码放在"OnPaint"事件中,但桌面上不存在这样的事情.
我该怎么办?
示例代码:https://stackoverflow.com/questions/1536141/how-to-draw-directly-on-the-windows-desktop-c
我试图截取一个应用程序的屏幕截图,我想使不属于应用程序区域的矩形部分透明.因此,例如在标准的Windows应用程序上,我想使圆角透明.
我写了一个快速测试应用程序,适用于XP(或关闭aero的vista/windows 7):
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics g = e.Graphics;
// Just find a window to test with
IntPtr hwnd = FindWindowByCaption(IntPtr.Zero, "Calculator");
WINDOWINFO info = new WINDOWINFO();
info.cbSize = (uint)Marshal.SizeOf(info);
GetWindowInfo(hwnd, ref info);
Rectangle r = Rectangle.FromLTRB(info.rcWindow.Left, info.rcWindow.Top, info.rcWindow.Right, info.rcWindow.Bottom);
IntPtr hrgn = CreateRectRgn(info.rcWindow.Left, info.rcWindow.Top, info.rcWindow.Right, info.rcWindow.Bottom);
GetWindowRgn(hwnd, hrgn);
// fill a rectangle which would be where I would probably
// write some mask color
g.FillRectangle(Brushes.Red, r);
// fill the region over the …Run Code Online (Sandbox Code Playgroud) 我创建了ac#windows应用程序并编写了75%的代码.该程序允许用户创建流程图,并根据状态对流程图形状进行着色.我希望它们成为像3d一样的按钮
来自网站Webdesign.org
我不想为每个按钮创建一个PNG,而是希望使用画笔或其他技术在C#中创建它们,例如:
// Create solid brush.
SolidBrush blueBrush = new SolidBrush(Color.Blue);
// Create points that define polygon.
PointF point1 = new PointF(50.0F, 50.0F);
PointF point2 = new PointF(100.0F, 25.0F);
PointF point3 = new PointF(200.0F, 5.0F);
PointF point4 = new PointF(250.0F, 50.0F);
PointF point5 = new PointF(300.0F, 100.0F);
PointF point6 = new PointF(350.0F, 200.0F);
PointF point7 = new PointF(250.0F, 250.0F);
PointF[] curvePoints = {point1, point2, point3, point4, point5, point6, point7};
// Define fill mode.
FillMode newFillMode = FillMode.Winding;
// …Run Code Online (Sandbox Code Playgroud) GDI +非常慢,几乎完全是软件,而GDI是高度硬件加速的.GDI +是Graphics类在WinForms上使用的,它太慢了.
有没有人创建.NET GDI库,所以我们可以有速度?
[编辑]很多人都在推荐OpenGL/DirectX.我的要求是客户端兼容性,尤其是远程桌面.AFAIK远程桌面不支持开箱即用的OGL/DirectX.[/ EDIT]
在Windows中,CreateFontIndirect()如果未请求所请求的字体,则调用可以静默替换兼容字体.该GetObject()调用不反映这一替代; 它返回相同的LOGFONT传入.如何找到实际创建的字体?或者,如何强制Windows仅返回所请求的确切字体?
有一个GDI泄漏的应用程序最终将达到10,000个分配的GDI对象并崩溃.我尝试将GDIProcessHandleQuota增加到20,000,但程序在达到10,000个对象时仍然崩溃.我们目前正在努力修补此漏洞,但出于好奇 - 是否有办法增加单个流程的GDI限制?或者10k个人应用程序的硬限制?
我在窗口上,在启用了DWM组合的系统上使用双缓冲GDI绘制动画,并在屏幕上看到清晰可见的撕裂.有办法防止这种情况吗?
动画采用相同的图像,并在屏幕上从右向左移动; 像素跨越由当前时间和动画开始时的时间和时间,以端之间的差确定的数量,以便获得完整的一小部分被施加到整个窗口宽度,使用timeGetTime具有1毫秒的分辨率.动画绘制循环而不处理应用程序消息; 它调用Repaint内部无效的(VCL库)方法,然后调用UpdateWindow有问题的窗口,直接调用消息过程WM_PAINT.绘图处理程序的VCL实现使用BeginBufferedPaint.绘画本身是双重缓冲的.
这样做的目的是使帧速率尽可能高,以在屏幕上获得平滑的动画效果.(该图使用双缓冲来消除闪烁并确保整个图像或帧在任何时间都在屏幕上.它通过调用消息过程直接无效和更新,而不进行其他消息处理.绘画使用现代技术实现(例如,BeginAfferedPaint)用于Aero组合.)在此之内,绘画是在几个BitBlt调用中完成的(一个用于动画的左侧,即在屏幕外移动,一个用于动画的右侧,即在屏幕上移动的内容). )
观看动画时,会有明显的撕裂现象.这种情况发生在具有不同图形卡的多个系统上的Windows Vista,7和8.1上.
我处理这个问题的方法是降低绘图速度,或者在再次绘制之前尝试等待VSync.这可能是错误的方法,所以这个问题的答案可能是"完全做其他事情:X".如果是这样,很棒:)
(我真正喜欢的是一种让DWM为这个特定窗口组成/仅使用完全绘制的帧的方法.)
我尝试了以下方法,其中没有一个删除所有可见的撕裂.因此问题是,在使用DWM组合时是否可以避免撕裂,如果是这样的话?
获取显示器刷新率GetDeviceCaps(Application.MainForm.Handle, VREFRESH); 睡眠1 /刷新率毫秒.尽可能快地改善绘画,但可能是一厢情愿的想法.感觉上动画率稍微不那么平滑.(调整:正常Sleep和高分辨率旋转等待使用timeGetTime.)
使用DwmSetPresentParameters尝试更新限制到该代码绘制相同的速度.(变化:大量缓冲区(cBuffer = 8)(无可见效果);使用上面的代码指定监视器刷新率/ 1和睡眠的源速率(与尝试休眠方法相同);指定每帧的刷新次数1,10等(无可见效果);更改源帧覆盖范围(无可见效果)
使用DwmGetCompositionTimingInfo在多种方式:
cFramesPending> 0时,旋转;cFrame(框架组合)并旋转,而这个数字不会改变;cFrameDisplayed并旋转,而这不会改变;qpcVBlank + qpcRefreshPeriod,然后在QueryPerformanceCounter返回时间小于此时旋转所有这些方法也通过绘画,然后在再次绘画之前旋转/睡觉而变化; 或者相反:睡觉然后画画.
似乎没有任何可见效果,并且有什么效果很难获得资格,可能只是帧率较低的结果.没有防止撕裂,即没有人使DWM用窗口DC内容的"整体"副本组成窗口.
建议赞赏:)
每当我在Windows 2003服务器上安装新字体时,我都无法在我的asp.net Web应用程序中立即使用它.应用程序通过CreateFontIndirectgdi32.dll win api 获取字体,然后使用此字体在我的asp.net应用程序中创建动态文本图像.看起来字体会被缓存到某个地方,因为我只会返回返回的默认字体.
字体缓存在重新启动后得到更新,然后我得到了正确的字体,但显然我不想在生产服务器上重新启动只是为了让新字体工作.
有没有办法刷新字体缓存?