标签: gdi

如何使用Win32 AlphaBlend函数绘制32bppargb图像?

我一直在为这个夜晚的大部分时间而烦恼,所以也许你们其中一个人可以帮我一臂之力.

我发现DrawImageC#中的GDI + 对于我想要呈现的内容来说太慢了,从论坛的外观来看,对其他人来说也是如此.

我决定尝试使用AlphaBlendBitBlt从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_OVER0x00AC_SRC_ALPHA0x01这是什么MSDN说,他们应该是一致的.

你们中的任何一个人都能很好地解决这个问题,或者知道一个更好(但仍然很快)的方法吗?

c# graphics winapi gdi+ gdi

0
推荐指数
1
解决办法
2557
查看次数

0
推荐指数
1
解决办法
252
查看次数

GDI - 如何创建和填充位图?

有人可以给我简短的解释如何使用GDI/GDI +创建位图运行时并用颜色填充它?

提前致谢.

c++ windows gdi+ gdi bitmap

0
推荐指数
1
解决办法
2275
查看次数

Windows 8上的Tahoma字体渲染

有没有办法像以前的Windows版本一样在Windows 8上呈现Tahoma字体文本?我们在WinForms应用程序中使用GDI Graphics.DrawString()来绘制它,但结果看起来有很大不同.人物间隔很差.

谢谢.

c# fonts gdi windows-8

0
推荐指数
1
解决办法
798
查看次数

Win32:在缓冲区中存储多行文本

如何在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)

c++ winapi gdi

0
推荐指数
1
解决办法
579
查看次数

如何在GDI中播放元文件

我对如何在GDI中实际播放元文件感兴趣.首先,当创建元文件时,它实际上是否包含函数调用和参数值,因此可以绘制基元?我知道它用于矢量绘图,所以这是有道理的......其次,元文件是如何播放的?实际的元数据是否被绘制,然后它以某种方式BitBlitted到DC,或立即被吸引到DC?如果我,让我们说,使用FloodFill来填充图元文件中的内容,如果元中的对象与DC中绘制的对象相交,是否可以导出问题?每个示例,如果DC中的对象填充了FloodField中使用的颜色.谢谢.

c++ mfc gdi

0
推荐指数
1
解决办法
159
查看次数

窗口调整大小时MFC程序崩溃,错误"找不到所需的资源".

我正在开发一个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)

c++ mfc gdi

0
推荐指数
1
解决办法
1499
查看次数

使用GDI和GDI +绘制旋转多行文本

在我的Delphi应用程序中,我需要使用GDI和GDI +绘制多行文本.我有这些物品:

  1. 要绘制的文字;
  2. 旋转角度(文字可能旋转);
  3. 最大宽度(想象一下包含文本的矩形,我有矩形宽度的限制但不是矩形高度);
  4. 字体名称和文字高度;

有没有一种简单的方法可以用GDI和GDI +绘制这个文本?我无法找到关于它的GDI和GDI +功能.

delphi text gdi+ gdi multiline

0
推荐指数
1
解决办法
2452
查看次数

GDI对象计数跨越10k

我们在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处理?

GDIView的屏幕截图

.net windows user-interface gdi winforms

0
推荐指数
1
解决办法
788
查看次数

在2个点之间绘制一个具有指定"胖度"的椭圆

我有一个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)

c# graphics gdi

0
推荐指数
1
解决办法
956
查看次数

标签 统计

gdi ×10

c++ ×5

c# ×3

gdi+ ×3

winapi ×3

windows ×3

graphics ×2

mfc ×2

user-interface ×2

.net ×1

bitmap ×1

delphi ×1

fonts ×1

multiline ×1

text ×1

windows-8 ×1

winforms ×1