我一直在为这个夜晚的大部分时间而烦恼,所以也许你们其中一个人可以帮我一臂之力.
我发现DrawImageC#中的GDI + 对于我想要呈现的内容来说太慢了,从论坛的外观来看,对其他人来说也是如此.
我决定尝试使用AlphaBlend或BitBlt从Win32 API获得更好的性能.无论如何,我已经让我的图像显示得很好,除了一个小细节 - 无论我使用什么图像格式,我都无法让白色背景从我的(透明)图形中消失.
到目前为止,我已经尝试过BMP和PNG格式,并验证它们在C#中加载为32bppargb图像.
这是我正在做的电话:
// Draw the tile to the screen.
Win32GraphicsInterop.AlphaBlend(graphicsCanvas, destination.X, destination.Y, this.TileSize, this.TileSize,
this.imageGraphicsPointer, tile.UpperLeftCorner.X, tile.UpperLeftCorner.Y,
this.TileSize, this.TileSize,
new Win32GraphicsInterop.BLENDFUNCTION(Win32GraphicsInterop.AC_SRC_OVER, 0,
Convert.ToByte(opacity * 255),
Win32GraphicsInterop.AC_SRC_ALPHA));
Run Code Online (Sandbox Code Playgroud)
为了记录在案,AC_SRC_OVER是0x00和AC_SRC_ALPHA是0x01这是什么MSDN说,他们应该是一致的.
你们中的任何一个人都能很好地解决这个问题,或者知道一个更好(但仍然很快)的方法吗?
或其他gdi手柄,如钢笔刷.我怎么知道它有效吗?
有人可以给我简短的解释如何使用GDI/GDI +创建位图运行时并用颜色填充它?
提前致谢.
有没有办法像以前的Windows版本一样在Windows 8上呈现Tahoma字体文本?我们在WinForms应用程序中使用GDI Graphics.DrawString()来绘制它,但结果看起来有很大不同.人物间隔很差.
谢谢.
如何在Win32中显示多行文本?这段代码在我的GamePaint()函数中,我想把前5个高分(存储在结构的属性中)写到屏幕上.我可以使用这种方法成功输出一行...如何制作TCHAR缓冲区,szText,存储多行?这是我到目前为止所做的尝试:
原始代码:
//draw rect for normal scores
ChangeTextFormat(hDC, hWnd, 1);
TCHAR szText[64];
RECT rcNormalScores = { 268, 122, 436, 330};
RECT rcHardScores = { 37, 122, 198, 330};
//stringstream ssTemp;
for(int i = 0; i < 5; i++)
{
//ssTemp << i;
//display nth Normal score
wsprintf(szText, "%d \n", g_scoreTop[i].num);
DrawText(hDC, szText, -1, &rcNormalScores, DT_LEFT | DT_WORDBREAK);
}
Run Code Online (Sandbox Code Playgroud)
编辑:感谢您的信息,但我仍然有一些难以在数据类型之间进行转换.这是我得到的错误:
无法从'std :: basic_string <_Elem,_Traits,_Ax>'转换为'std :: basic_string <_Elem,_Traits,_Ax>'
编辑2:谢谢你的帮助,queen3.我发布了以下工作代码:
工作守则:
ChangeTextFormat(hDC, hWnd, 1);
RECT rcNormalScores = { 37, 122, 198, …Run Code Online (Sandbox Code Playgroud) 我对如何在GDI中实际播放元文件感兴趣.首先,当创建元文件时,它实际上是否包含函数调用和参数值,因此可以绘制基元?我知道它用于矢量绘图,所以这是有道理的......其次,元文件是如何播放的?实际的元数据是否被绘制,然后它以某种方式BitBlitted到DC,或立即被吸引到DC?如果我,让我们说,使用FloodFill来填充图元文件中的内容,如果元中的对象与DC中绘制的对象相交,是否可以导出问题?每个示例,如果DC中的对象填充了FloodField中使用的颜色.谢谢.
我正在开发一个SDI MFC应用程序,其中有一些自定义按钮以自定义方式绘制或者图像加载在它们之上.当正在运行的应用程序连续重新调整大小约5到10分钟时,它会因错误"未找到所需资源"而崩溃.
我已经彻底检查了代码,所有的GetDC()呼叫都跟着ReleaseDC()电话.此外,每当我DC.SelectObject(&newBrush)打电话然后恢复旧笔时,我总是保存旧的GDI对象(例如,oldBrush)DC.SelectObject(&oldBrush).
什么其他可能导致此错误的任何提示?
编辑:我使用程序Deleaker来查找程序中的GDI泄漏并删除导致泄漏的那些GDI对象.
编辑:这是AfxThrowResourceException的调用堆栈:
mfc110ud.dll!AfxThrowResourceException() Line 1353 C++
mfc110ud.dll!CWindowDC::CWindowDC(CWnd * pWnd) Line 1022 C++
mfc110ud.dll!CMFCToolBarImages::PrepareDrawImage(tagAFXDrawState & ds, CSize sizeImageDest, int bFadeInactive) Line 1219 C++
mfc110ud.dll!CMFCToolBarImages::DrawEx(CDC * pDC, CRect rect, int iImageIndex, CMFCToolBarImages::ImageAlignHorz horzAlign, CMFCToolBarImages::ImageAlignVert vertAlign, CRect rectSrc, unsigned char alphaSrc) Line 1729 C++
mfc110ud.dll!CMFCControlRenderer::FillInterior(CDC * pDC, CRect rect, CMFCToolBarImages::ImageAlignHorz horz, CMFCToolBarImages::ImageAlignVert vert, unsigned int index, unsigned char alphaSrc) Line 470 C++
mfc110ud.dll!CMFCControlRenderer::FillInterior(CDC * pDC, CRect rect, …Run Code Online (Sandbox Code Playgroud) 在我的Delphi应用程序中,我需要使用GDI和GDI +绘制多行文本.我有这些物品:
有没有一种简单的方法可以用GDI和GDI +绘制这个文本?我无法找到关于它的GDI和GDI +功能.
我们在C#中有一个.net应用程序,它允许域中的用户映射到另一个域中的用户/角色.
在属性映射面板(它只是在主窗体上显示为对话框的简单窗体)中,有两个列表视图 - 1个用于源域,另一个用于所有先前选择的目标域.列表视图中填充了用户和组 - 每个用户/组一行.我们每行都有一个图标来区分用户和组.
一切都很好,直到最近我们的一个客户遇到了没有的情况.由我们的应用程序创建的GDI句柄超过10k - 这是可以由Windows系统上的进程创建的句柄的可能数量的上限.所以,现在我们正在考虑使用哪些方法来减少创建的句柄数量.以下是我们想要确保的几个问题.其中哪一个创建了一个新句柄(我们怀疑所有这些句柄):
1)
this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 14F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(177)));
Run Code Online (Sandbox Code Playgroud)
2)
this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
Run Code Online (Sandbox Code Playgroud)
3)
this.label2.Text = resources.GetString("label2.Text");
Run Code Online (Sandbox Code Playgroud)
请不要关心问题的格式,如果相关结论需要进一步的信息,请告诉我.
我们可以做些什么来减少号码.把手创建?避免这种情况的正确方法是什么?可以明确杀死句柄以减少计数(只是说)?任何建议或要照顾的事情都表示赞赏.谢谢.
另外,我们有这行代码:
this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream")));
Run Code Online (Sandbox Code Playgroud)
那么,我们如何释放DC和Bitmaps处理?

我有一个C#位图对象,我能够从A点到B点画一条线.
我在图的边缘有2个点,我想绘制一个从A到B的椭圆.基本的g.DrawEllipse()只能完美地水平或垂直绘制椭圆,但是我需要椭圆是一种从图像的一端到另一端的对角线.
My bitmap: 200 tall by 500 wide
Point A: Column 0, Row 20 (0,20)
Point B: Column 499, Row 60 (499, 60)
Widest Point: 30 - Narrow Radius of the ellipse
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止,绘制椭圆没有我需要的重载,所以请帮助那里:
using (Graphics g = Graphics.FromImage(bmp))
{
g.DrawLine(pen, new Point(20,0), new Point(499,60));
g.DrawEllipse(pen, 20, 0, someWidth, someHeight);
}
Run Code Online (Sandbox Code Playgroud)