【问题标题】:Write bitmap to HWND (Clarion passes HWND to .NET DLL)?将位图写入 HWND(Clarion 将 HWND 传递给 .NET DLL)?
【发布时间】:2013-07-10 17:38:54
【问题描述】:

我正在为 Clarion(Clarion 是 C++ 类型语言)程序编写 .NET DLL。 Clarion 程序调用一个 .NET DLL 方法,将 Clarion 图像控件的 HWND 传递给它。在 .NET DLL 中,我可以从传入的 HWND 中获得正确的 RECT(上、右、下、左),所以我知道我有正确的 HWND。

我似乎无法发现在 .NET DLL 中将位图写入 HWND。在 Clarion 方面,我会这样做:

?myImageControl{PROP:ImageBits} = ImageBytes

其中 ImageBytes 是字节数组,例如文件或 Clarion STRING(固定长度,不以零结尾)。

提前致谢。

【问题讨论】:

  • HDC hdc = GetDC(hwnd);SetPixel(hdc, x, y, RGB(255,255,255));?这使用来自 C++ 的 Win32,但可能会有所帮助:falloutsoftware.com/tutorials/win/win3.htm 当然BitBlt() 可能会更快...
  • 谢谢,但我需要知道如何在 C# 中执行此操作。 C# 不识别 HDC、GetDC 等。也许有办法让 C# 识别它们,但我现在不知道该怎么做。如果我用 C++ 编写,那就很简单了。
  • 使用 P/Invoke 或 C++/CLI 互操作。见:msdn.microsoft.com/en-us/library/aa288468%28v=vs.71%29.aspx

标签: c# .net bitmap hwnd clarion


【解决方案1】:

我想你可以试试:Graphics.FromHwnd():

Image image = new Bitmap("somefile.bmp");
using (Graphics g = Graphics.FromHwnd(intptrHwnd))
{
    g.DrawImage(image, new Point(0, 0));
}

见:http://msdn.microsoft.com/en-us/library/system.drawing.graphics.fromhwnd.aspx

【讨论】:

  • 我尝试了上面的方法,当然替换了有效值,虽然所有行都执行没有错误,但我有一个 try-catch 围绕它,没有图像出现。该控件是一个 Clarion IMAGE 控件,从句柄中我可以确定它在 C# 中的大小。在那之后不起作用,我添加了 Clarion 代码 DISPLAY(?ImageControl) 并没有帮助。
  • @RFM 我试图记住点是相对于屏幕还是窗口。你能把窗口移到显示区域的最左上角,看看有什么不同吗?
  • 我将窗口移到左上角,然后让它绘制图像,没有图像出现。 Clarion 的 IMAGE 控件可能不是标准的 winforms 图像控件,但我没有找到任何关于它的文档。我目前正在使用回调 (stackoverflow.com/questions/17578527/…) 来获取在 Clarion 中显示的图像,但希望能够直接在 C# 中显示图像。
  • @RFM 有没有办法判断 Clarion 是否为您提供“顶级”窗口,而不是某种子控件?它可能是 .FromHwnd() 仅适用于顶级窗口。也许有一种方法可以在传递父 HWND 之前获取它?另外,我不能 100% 确定 .FromHwnd() 是否能成功地与不是 WinForms 控件的基本 win32 控件一起工作。
  • 我在这方面找不到任何东西。将只需要求助于回调方法,直到有人足够了解 Clarion IMAGE 控件的构成,以知道我正在尝试的内容是否可行,如果可以,它是如何完成的。感谢您的意见。
猜你喜欢
  • 1970-01-01
  • 2015-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
相关资源
最近更新 更多