编辑
2025-09-22
C#
00

摘要

GDI+是GDI(Windows Graphics Device Interface)的后继者,它是.NET Framework为操作图形提供的应用程序编程接口,主要用在窗体上绘制各种图形图像,可以用于绘制各种数据图像、数学仿真等。

Graphics类是GDI+的核心,它提供将对象绘制到显式设备的方法。Graphics类封装了绘制直线、曲线、圆形、图像和文本的方法,是一切GDI+操作的基础类。在绘图之前,必须在指定的窗体上创建一个Graphics对象,才能调用Graphics类的方法画图。

正文

Paint事件
在窗体或控件的Paint事件中创建,将其作为PaintEventArgs的一部分。在为控件创建绘制代码时,通常会使用此方法。

在Paint事件中创建Graphics对象

C#
protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); Graphics g = e.Graphics; Pen myPen = new Pen(Color.Blue, 2);//申明一个画笔,蓝色,宽度为2 g.DrawLine(myPen, 10, 30, 10, 300);//划一条线 }
编辑
2025-09-22
C#
00

在C#中处理数据时,语言集成查询(LINQ)是一个强大的工具,它允许我们以类似于数据库查询的方式查询集合。本文将介绍如何使用LINQ进行多表查询,包括内连接、组连接、左连接和交叉连接,并提供详细的代码示例和解释。

基础数据模型

为了演示多表查询,我们首先定义几个基础的数据模型类:

C#
//学生 public class Student { public int StudentId { get; set; } public string Name { get; set; } } //班级 public class Classroom { public int ClassroomId { get; set; } public string Name { get; set; } } //选课 public class Enrollment { public int StudentId { get; set; } public int ClassroomId { get; set; } }
编辑
2025-09-22
C#
00

SendMessage简介

SendMessage是Windows API中的一个重要函数,用于在Windows应用程序中发送消息。在C#的Winform应用中,我们可以通过P/Invoke机制调用SendMessage函数来实现一些特殊的功能。

SendMessage函数的原型如下:

C#
[DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

其中:

  • hWnd: 接收消息的窗口句柄
  • Msg: 消息ID
  • wParam: 消息的附加参数
  • lParam: 消息的附加参数

常见应用场景

设置文本框内容

C#
[DllImport("user32.dll", EntryPoint = "SendMessage")] private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, string lParam); private void SetTextBoxText() { const int WM_SETTEXT = 0x000C; SendMessage(textBox1.Handle, WM_SETTEXT, 0, "Hello, SendMessage!"); }
编辑
2025-09-22
C#
00

在Windows Forms应用程序开发中,我们经常需要处理多线程操作。然而,直接从后台线程更新UI元素可能会导致异常,因为UI控件通常只能由创建它们的线程进行操作。为了安全地从其他线程更新UI,WinForms提供了三个重要的方法:InvokeBeginInvokeEndInvoke。本文将详细介绍这三个方法的用法及其在实际开发中的应用。

Invoke方法

Invoke方法用于在创建控件的线程上同步执行指定的委托。这意味着调用线程将等待直到委托执行完成。

语法

C#
public object Invoke(Delegate method)

示例

假设我们有一个后台线程需要更新主窗体上的一个Label控件:

C#
public partial class FrmMain : Form { public FrmMain() { InitializeComponent(); } private void btnInvoke_Click(object sender, EventArgs e) { Thread backgroundThread = new Thread(new ThreadStart(BackgroundTask)); backgroundThread.Start(); } private void BackgroundTask() { // 模拟耗时操作 Thread.Sleep(2000); // 使用Invoke更新UI this.Invoke((MethodInvoker)delegate { lblTitle.Text = "任务完成!"; }); } }

image.png

编辑
2025-09-22
C#
00

在.NET中,性能优化是一个永恒的话题,尤其是在处理大量数据或高并发场景下。ArrayPool<T>作为.NET的一个高性能特性,能够显著减少数组的创建和销毁对内存和垃圾回收(GC)的影响,从而提高应用程序的性能。本文将探讨ArrayPool<T>的应用场景,并通过具体示例展示如何在实际开发中使用它。

ArrayPool简介

ArrayPool<T>是.NET中用于数组重用的对象池。它允许开发者从池中租用数组,使用完毕后再将其归还,以便于数组可以被后续操作重用。这种机制减少了数组创建的次数,降低了GC的压力,特别是在处理大型数组或频繁操作数组的场景中。