yufeicau 2022-07-31 18:48 采纳率: 100%
浏览 77
已结题

C#调用gdi32.dll函数绘制Rectangle填充颜色不起作用什么原因?

C#调用gdi32.dll函数绘制Rectangle填充颜色不起作用什么原因?
大家好,通过搜索代码在Winform C#下调用gdi32.dll做带填充色的矩形橡皮筋,已实现但填充色只能是默认的黑白色,经分析是Brush颜色设定无效,涉及代码如下:
[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
private static extern IntPtr CreateSolidBrush(BrushStyles enBrushStyle, int crColor);
private static extern bool Rectangle(IntPtr hdc, int X1, int Y1, int X2, int Y2);
void Draw(Graphiics g)
{
hdc = g.GetHdc();
gdiPen = CreatePen(penStyle, lineWidth, GetRGBFromColor(Color.FromArgb(255, 255, 255, 232)));// Pen颜色有效
gdiBrush = CreateSolidBrush(brushStyle, GetRGBFromColor(Color.FromArgb(255, 255, 255, 232))); // Brush颜色无论怎么改结果都不变
SelectObject(hdc, gdiPen);
SelectObject(hdc, gdiBrush);
Rectangle(hdc, p1.X, p1.Y, p2.X, p2.Y);
}
如何让设定的Rectangle填充色生效?暂只想用GDI32函数实现,基于效率考虑,不想用别的。

  • 写回答

1条回答 默认 最新

  • 浪客 2022-08-01 09:29
    关注
    
     [System.Runtime.InteropServices.DllImport("gdi32.dll")]
            private static extern IntPtr CreateSolidBrush(int crColor);
    
            [System.Runtime.InteropServices.DllImport("gdi32.dll")]
            private static extern bool Rectangle(IntPtr hdc, int X1, int Y1, int X2, int Y2);
    
            [System.Runtime.InteropServices.DllImport("gdi32.dll")]
            public static extern IntPtr CreatePen(int nPenStyle, int nWidth, int crColor);
    
            [System.Runtime.InteropServices.DllImport("gdi32.dll")]
            public static extern IntPtr SelectObject(IntPtr hdc, IntPtr pen);
    
    
            Point p1 = new Point(10, 10), p2 = new Point(200, 100);
            void Draw(Graphics g)
            {
                IntPtr hdc = g.GetHdc();
                IntPtr gdiPen = CreatePen(0, 5, GetRGBFromColor(Color.FromArgb(255, 255, 232)));// Pen颜色有效
                IntPtr gdiBrush = CreateSolidBrush(GetRGBFromColor(Color.FromArgb(255, 0, 0))); // Brush颜色无论怎么改结果都不变
                SelectObject(hdc, gdiPen);
                SelectObject(hdc, gdiBrush);
                Rectangle(hdc, p1.X, p1.Y, p2.X, p2.Y);
            }
            private int GetRGBFromColor(Color color)
            {
                byte r = color.R;
                byte g = color.G;
                byte b = color.B;
                //转化为32bit RGB值:
                int rgb = (r & 0xff) | ((g & 0xff) << 8) | ((b & 0xff) << 16);
                return rgb;
            }
            private void button1_Click(object sender, System.EventArgs e)
            {
                System.Drawing.Graphics gs = pictureBox1.CreateGraphics();
                Draw(gs);
            }
    
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏

报告相同问题?

问题事件

  • 系统已结题 8月9日
  • 已采纳回答 8月1日
  • 创建了问题 7月31日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改