编辑
2025-09-22
C#
00

摘要

在计算机图形学中,坐标系统是非常重要的概念,因为它们用于定义图形的位置和方向。在 C# GDI+ 中,有三种不同的坐标系统,分别是全局坐标系统、页面(Page)坐标系统和设备坐标系统。这三种坐标系统各有不同的定义和用途。

全局坐标系统是最基本的坐标系统,用于表示整个图形世界中的位置。在这个坐标系统中,所有的图形元素都可以通过唯一的坐标表示。例如,一个矩形可以表示为(0, 0)到(10, 10)的整数坐标。

页面(Page)坐标系统是默认的坐标系统,它以页面左上角为原点,横向x轴向右为正方向,纵向y轴向下为正方向。在这个坐标系统中,图形元素的位置可以通过页面上的坐标来表示。例如,一个矩形可以表示为(10, 10)到(20, 30)的坐标。

设备坐标系统是可以指定特定测量单位的页面(Page)坐标系统。它与页面(Page)坐标系统相同,但是可以指定不同的测量单位。例如,可以将测量单位设置为厘米,以便在不同的屏幕上显示相同的图形元素。

GDI+ 还提供了三种不同的坐标转换方法,分别是 Graphics.TransformPoints()、Graphics.TransformRotation() 和 Graphics.TransformScale()。这些方法可以用来转换图形元素的位置、旋转和缩放,以便在不同的坐标系统中显示和操作它们。

坐标系统和坐标转换是 C# GDI+ 中非常重要的概念,它们可以帮助我们在图形世界中准确地表示和操作图形元素。通过熟练掌握这些概念和方法,我们可以更加高效地创建和操作图形,实现更加丰富多彩的应用程序。

正文

点结构:Point和PointF

C#
Point p1 = new Point(0, 0); this.Location = p1; PointF p2 = new PointF(0, 0);
编辑
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