如何将 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# 中的调用者的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 中的存储过程返回多个记录集

c#如何获得返回json数组中的数组

C#如何生成JSON字符串提交给接口(服务器)

如何将结构数组从 c++ 传递到 c#?

如何将值收集到数组中并将集合传递给 C# 中的 datagridview?

如何将C#数据表传递给mysql的存储过程参数