如何将 COLORREF 中的所有数据返回给 C# 中的调用者
Posted
技术标签:
【中文标题】如何将 COLORREF 中的所有数据返回给 C# 中的调用者【英文标题】:How to return all of the data in a COLORREF to the caller in C# 【发布时间】:2020-07-22 18:19:18 【问题描述】:我正在尝试编写 .dll
,然后在 C# 中调用此 .dll
。我关注了这篇文章:
https://blog.quickbird.uk/calling-c-from-net-core-759563bab75d
现在,我的问题是如何将 COLORREF
中的所有数据返回给 C# 中的调用者,然后才能区分这些值。
这是来自.dll
的来源:
#pragma once
#include <windows.h>
extern "C"
__declspec(dllexport) COLORREF __stdcall getColor(int X, int Y)
HDC _hdc = GetDC(NULL);
COLORREF _result = 0;
if (_hdc)
_result = GetPixel(_hdc, X, Y);
/* int _red = GetRValue(_result);
int _green = GetGValue(_result);
int _blue = GetBValue(_result); */
ReleaseDC(NULL, _hdc);
return _result;
return _result;
这里有一些来自 C# 源代码的部分:
public partial class Main_Window : Form
[DllImport(@"test.dll", EntryPoint = "getColor", CallingConvention = CallingConvention.StdCall)]
private static extern UInt32 getColor(int X, int Y);
private void ColB_Click(object sender, EventArgs e)
UInt32 result = getColor(500, 500);
MessageBox.Show(Convert.ToString(result)); //<--- just to show what pops up.
//ColB.BackColor = result; //<--- that didnt work.
【问题讨论】:
【参考方案1】:COLORREF
只是DWORD
的别名,在C# 中确实是UInt32
。因此,就在 C# 中调用 getColor()
函数而言,您的代码看起来不错。不过,我建议让函数在失败时返回 CLR_INVALID
(0xFFFFFFFF
) 而不是返回 0(黑色),尤其是因为 GetPixel()
在失败时返回 CLR_INVALID
,例如:
COLORREF __stdcall getColor(int X, int Y)
COLORREF _result = CLR_INVALID;
HDC _hdc = GetDC(NULL);
if (_hdc)
_result = GetPixel(_hdc, X, Y);
ReleaseDC(NULL, _hdc);
return _result;
话虽如此,控件的BackColor
属性需要System.Drawing.Color
,而不是UInt32
。您可以使用Color.FromArgb()
方法之一从COLORREF
获取Color
,例如:
UInt32 result = getColor(500, 500);
if (result != 0xFFFFFFFF)
int red = (int) (byte) (result & 0xFF);
int green = (int) (byte) ((result >> 8) & 0xFF);
int blue = (int) (byte) ((result >> 16) & 0xFF);
ColB.BackColor = Color.FromArgb(red, green, blue);
或者,System.Drawing.ColorTranslator.FromWin32()
方法:
UInt32 result = getColor(500, 500);
if (result != 0xFFFFFFFF)
ColB.BackColor = ColorTranslator.FromWin32( (int) result );
【讨论】:
以上是关于如何将 COLORREF 中的所有数据返回给 C# 中的调用者的主要内容,如果未能解决你的问题,请参考以下文章