Tag: gdi +

用C ++ Win32创build一个透明的窗口

我创build的应该是一个非常简单的Win32 C ++应用程序,仅用于显示半透明的PNG。 该窗口不应该有任何铬,所有的不透明度应该在PNG本身进行控制。 我的问题是,当窗口下的内容改变时,窗口不会重新绘制,所以当应用程序最初启动时,PNG的透明区域与“窗口”下的内容“卡住”。 这里是我设置新窗口的那一行: hWnd = CreateWindowEx(WS_EX_TOPMOST, szWindowClass, szTitle, WS_POPUP, 0, height/2 – 20, 40, 102, NULL, NULL, hInstance, 0); 对于RegisterClassEx的调用,我有这样的背景设置: wcex.hbrBackground = (HBRUSH)0; 这是我的WM_PAINT消息处理程序: case WM_PAINT: { hdc = BeginPaint(hWnd, &ps); Gdiplus::Graphics graphics(hdc); graphics.DrawImage(*m_pBitmap, 0, 0); EndPaint(hWnd, &ps); break; } 有一件事要注意的是,应用程序总是停靠在屏幕的左侧,不移动。 但是,当用户打开,closures或移动窗口时,应用程序下面的内容可能会改变。 应用程序首次启动时,看起来很完美。 透明(和simi透明)的PNG部分显示完美。 但是,当应用程序下面的背景发生变化时,背景不会更新,只是应用程序首次启动时保持不变。 实际上,WM_PAINT(或WM_ERASEBKGND在后台更改时不会被调用)。 我已经玩了很长一段时间,已经接近100%的权利,但不是那样。 例如,我试图设置背景(HBRUSH)NULL_BRUSH,我试着处理WM_ERASEBKGND。 当它下面的内容改变时,可以做些什么来重新绘制窗口?

测量一个string,而不使用graphics对象?

我使用像素作为我的字体的单位。 在一个地方,我正在执行一个命中testing,以检查用户是否在屏幕上某些文本的边界矩形内单击了。 我需要使用像MeasureString这样的东西。 不幸的是,执行命中testing的代码深藏在一个无法访问Graphics对象甚至Control 。 如何获得给定字体的string的边界框而不使用Graphics类? 为什么我甚至需要一个Graphics对象,当我的字体是像素?

C# – 输出图像到响应输出stream给GDI +错误

将图像输出到输出stream时,是否需要临时存储? 将图像保存到文件时,出现通常与文件夹权限错误相关的“通用GDI +”错误。 我正在做的唯一的事情是添加一些文字。 即使在不修改的情况下直接输出图像,仍然会出现错误。 例如,这样做会给我错误: using (Bitmap image = new Bitmap(context.Server.MapPath("images/stars_5.png"))) { image.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Png); } 一切工作正常我的本地机器运行与IIS 7.5和ASP.NET 2.0的Windows 7。 在运行带有IIS 6和ASP.NET 2.0的Windows Server 2003的QA服务器上发生此问题。 发生错误的行是: image.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Png); 这是堆栈跟踪: [ExternalException (0x80004005): A generic error occurred in GDI+.] System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams) +378002 System.Drawing.Image.Save(Stream stream, ImageFormat format) +36 GetRating.ProcessRequest(HttpContext context) in d:\inetpub\wwwroot\SymInfoQA\Apps\tools\Rating\GetRating.ashx:54 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181 […]

枚举计算机上的监视器

我find了7种不同的方法来枚举连接到电脑的显示器。 但是所有的解决scheme都会给出不同的结果(监视器数量和每个监视器上的信息)。 这些解决scheme是: 使用着名的EnumDisplayDevices 使用EnumDisplayMonitors 使用Windows Management Instrumentation(WMI) : 使用以下查询:在root\\WMI名称空间中SELECT * FROM WmiMonitorID 。 再次使用WMI : 使用新的查询: SELECT * FROM Win32_DesktopMonitor位于root\\CIMV2命名空间中。 使用安装程序API : 通过首先调用SetupDiGetClassDevs来检索设备信息集,然后使用SetupDiEnumDeviceInfo 使用DirectXgraphics基础结构(DXGI) 首先使用IDXGIFactory::EnumAdapters ,然后使用IDXGIAdapter::EnumOutput 使用连接和configuration显示(CCD)API : QueryDisplayConfig (QDC_ALL_PATHS, &numPathArrayElements, pathInfoArray, &numModeInfoArrayElements, modeInfoArray, nullptr); 我试图正确地理解所有这些方法与MSDN参考之间的区别。 意见 从我观察到的情况来看: WmiMonitorID和Setup API查询返回已连接(不一定是活动)显示的列表。 Win32_DesktopMonitor WMI查询返回错误 (至less意外)结果(即使在非活动状态下,也只能枚举1个监视器,而在另一个监视器上的桌面上)。 EnumDisplayDevices返回活动设备列表(当连接其他监视器时只有1个监视器处于活动状态时除外) EnumDisplayMonitors和DXGI查询返回活动监视器的列表。 CCD似乎是最可靠的方法(提供目标和来源之间的所有可能path)。 问题 当使用这些方法时(连接显示列表,已安装显示列表,活动显示列表),我应该得到什么结果? 如果我使用镜像显示器或扩展显示器怎么办? 如果电脑有多个显卡没有多个输出? 奖金:一些方法( DXGI , EnumDisplayDevices […]

读取JPEG元数据时的问题(方向)

我有一个在iPhone上拍摄的JPEG图像。 在我的台式电脑(Windows照片查看器,谷歌浏览器等)方向是不正确的。 我正在一个ASP.NET MVC 3 Web应用程序,我需要上传照片(目前正在使用plupload)。 我有一些服务器端代码来处理图像,包括读取EXIF数据。 我已经尝试读取EXIF元数据中的PropertyTagOrientation字段(使用GDI – Image.PropertyItems ),但该字段不存在。 所以它是一些特定的iPhone元数据,或者其他元数据。 我已经使用了像Aurigma Photo Uploader这样的工具,它正确地读取元数据并旋转图像。 这是怎么做到的? 有没有人知道其他JPEG元数据可能包含所需的信息,以便知道它需要旋转,这是由Aurigma使用? 这里是我用来读取EXIF数据的代码: var image = Image.FromStream(fileStream); foreach (var prop in image.PropertyItems) { if (prop.Id == 112 || prop.Id == 5029) { // do my rotate code – eg "RotateFlip" // Never get's in here – can't find these properties. […]

玻璃上的渲染控制:find解决scheme,需要双缓冲/完善

我(终于!)find了一种方法来渲染Windows.Forms控件的玻璃上,似乎没有任何主要的缺点,也没有任何大的执行时间。 它的灵感来自Coded的这篇文章 ,它基本上解释了如何在本地重写绘制控件来绘制它们。 我使用这种方法将控件渲染到位图,并使用GDI +和适当的Alpha通道在NativeWindow的绘制区域上绘制。 实现很简单,但可以完善的可用性,但这不是这个问题的重点。 结果是相当令人满意的: 但是,有两个方面需要修改才能真正使用。 双缓冲 ,因为这个叠加图像和真正的控制之间的闪烁频繁和可怕(用自己的代码testing自己)。 将基本控件设置为使用SetStyles(this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true)进行双缓冲SetStyles(this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true)不起作用,但是我怀疑我们可以使它稍微试用一下。 一些控件不起作用 。 我已经能够做出以下工作: 文本框 MaskedComboBox combobox(DropDownStyle == DropDownList) 列表框 CheckedListBox 列表显示 树视图 的DateTimePicker 的MonthCalendar 但我不能让这些工作,虽然我不明白为什么不。 我的教育猜测是,我引用整个控件的实际NativeWindow句柄,而我需要引用它的“input”(文本)部分,可能是一个孩子。 欢迎来自WinAPI专家的关于如何获得input窗口句柄的任何帮助。 combobox(DropDownStyle!= DropDownList) 的NumericUpDown RichTextBox的 但是修复双缓冲将是可用性的主要焦点 。 以下是一个示例用法: new GlassControlRenderer(textBox1); 代码如下: public class GlassControlRenderer : NativeWindow { private Control Control; private Bitmap Bitmap; private Graphics ControlGraphics; […]

在Windows窗体上绘制一个像素

我被困在试图打开Windows窗体上的一个像素。 graphics.DrawLine(Pens.Black, 50, 50, 51, 50); // draws two pixels graphics.DrawLine(Pens.Black, 50, 50, 50, 50); // draws no pixels API真的应该有一个方法来设置一个像素的颜色,但我没有看到一个。 我正在使用C#。

如何find实际的可打印区域? (的PrintDocument)

为什么发现这个神奇的矩形如此困难? 在OnPrintPage事件中,我有PrintPageEventArgs,并试图在最大可打印区域的范围内使用graphics进行绘制。 我已经尝试过使用PageBounds,PrintableArea,Graphics.VisibleClipBounds等等。所有都无法一直得到绘图区域,特别是从横向切换到纵向布局时。 从横向切换到纵向时,PrintableArea似乎不会改变。 我也注意到,如何设置Graphics.VisibleClipBounds是有区别的,如果我正在做一个打印预览和一个实际的打印。 在预览中,它总是显示肖像的宽度/高度,所以我必须检查是否是预览,我必须手动交换宽度/高度时,它是一个景观。 我需要一个algorithm来计算与当前Graphics上下文相关的可打印区域,而不是在实际绘图中不使用的任意理论打印区域。 我关心的是处理graphicsmatrix偏移。 到目前为止,我已经注意到graphics上下文是如何根据如下因素使用硬边缘进行预翻译的严重不一致: 如果OriginAtMargins是真的或假的(不像我想象的那样) 如果我正在打印到打印机,或使用PrintPreviewControl(我必须检查这是预览打印还是打印到页面以正确处理翻译) 如果我在家中使用我的打印机,或者我的打印机在工作(两者行为不同) 有没有一个标准的方法来处理这个? 我应该重置matrix吗? 当我将OriginAtMargins设置为true时,graphics预先翻译为84,84,但我的边际是100,100。 硬边缘是16,16。 不应该把它翻译成100,100吗? 由于0,0应该在页面边界,而不是硬边缘。 基本上我的方法应该总是在获得最好的可打印的矩形。 我只需要一个一致的,独立于设备的方法来确保我的绘图原点(0,0)位于页面的左上angular,以便上面的Rectangle对我有任何用处。

在自定义控件中隐藏不需要的属性

这是隐藏派生控件中的属性的方法吗? public class NewButton : Button … [Browsable ( false )] public new ContentAlignment TextAlign { get; set; } 此外,这隐藏在devise器的属性窗口中的属性,但我怎样才能隐藏代码中的属性?

为什么Image.FromFile有时会保持文件句柄打开?

我在ASP.NET应用程序中使用.NET中的GDI +进行大量image processing。 我经常发现Image.FromFile()保持打开文件句柄。 为什么是这样? 没有保留文件句柄的情况下打开图像的最佳方法是什么? 注意:我没有做任何愚蠢的事情,比如让Image对象留在周围 – 即使我不想让文件句柄保持活动状态