WinForm技术
文章平均质量分 55
winform架构
luckyone906
这个作者很懒,什么都没留下…
展开
-
C# 中GDI绘制后不显示问题原因分析与解决,与控件重绘相关的方法区别
系统会在多个不同的时机发送WM_PAINT消息:当第一次创建一个窗口时,当改变窗口的大小时,当把窗口从另一个窗口背后移出时,当最大化或最小化窗口时,等等,这些动作都是由 系统管理的,应用只是被动地接收该消息,在消息处理函数中进行绘制操作;系统会在多个不同的时机发送WM_PAINT消息:当第一次创建一个窗口时,当改变窗口的大小时,当把窗口从另一个窗口背后移出时,当最大化或最小化窗口时,等等,这些动作都是由 系统管理的,应用只是被动地接收该消息,在消息处理函数中进行绘制操作;即在其显示之前画什么都是无用的。原创 2024-07-06 22:39:10 · 720 阅读 · 0 评论 -
c#中窗口句柄有关的问题详解
窗口创建时,窗口并没有创建句柄,只有Application.Run(form)或者form.Show()之后才有句柄,即窗口只有显示或者启动消息循环后才有句柄!如果创建form之后Form form = new Form(),主线程中调用form.Handle,如果句柄尚未创建,引用该属性将强制创建句柄,对系统内的逻辑将产生致命的影响。(7)、IsHandleCreated :指示控件是否有与他关联的句柄,如果已经为控件分配了句柄,则为 true;(2)、CreateHandle :为该控件创建句柄,原创 2024-07-06 22:22:19 · 500 阅读 · 0 评论 -
c#中子线程和主线程交叉引用阻塞问题解决办法
方案2: // info.BeginInvoke(new Action(() =>//此处阻塞原因是因为info的子线程和主线程在其他地方交叉使用了,此处造成了子线程阻塞,导致此处的主线程也阻塞了,而恰好其他地方又使用了主线程,陷入了死循环。方案1:// Task.Factory.StartNew(() => {//加入子线程来执行这块逻辑,如能通过则下面的猜想是对的,经验证与所述一致。(所以可以用多线程或BeginInvoke解决此阻塞问题)//注意:防止子线程和主线程交叉引用后的阻塞问题。原创 2024-05-14 19:49:22 · 199 阅读 · 0 评论 -
winform继承窗体后子窗体不能使用设计器显示的问题解决
第二点:屏蔽掉父窗体类的控件初始化方法,即//InitializeComponent();与网上百度到的跟平台有关系啊什么的毫无作用,目前使用的是VS2019。如果有抽象类即将抽象类改为普通类,需要实现的抽象方法改为虚方法。winform继承窗体后子窗体不能使用设计器显示的问题。第三点:注意前两点修改完成后,关闭所有窗体,重新编译。第一点:继承的父窗体类不能使用抽象类。原创 2024-04-27 11:47:23 · 203 阅读 · 0 评论 -
C# WinForm 绘制圆角窗体的方法实例
/ 左上角// 右上角// 右下角// 左下角。原创 2024-04-27 11:14:39 · 331 阅读 · 0 评论 -
c#中实体类和DataTable之间相互转换,实体反射动态遍历列详解
通过反射,你可以加载和检查程序集的信息,包括类型、成员、属性等。请注意,上述示例中的 Person 类只是一个示例,你可以根据自己的需求创建自定义的实体类,并根据 DataTable 的列名称和类型匹配属性。为了将列定义为可为空类型,我们使用了 typeof(object) 来定义列的类型,这样可以允许任意的对象,并且可以在需要时将其设置为 DBNull.Value 来表示空值。请注意,上述示例中的实体类 Person 只是一个示例,你可以根据自己的需求创建自定义的实体类,并使用相应的属性和类型。原创 2024-04-27 11:11:24 · 1165 阅读 · 0 评论 -
C#中操作快捷方式(获取快捷方式属性、创建快捷方式)的方法
右键“引用”,“添加引用”,选择“COM组件”,找到“Windows Script Host Object Model”,然后确定。13 // 设置快捷方式的图标,这里是取程序图标,如果希望指定一个ico文件,那么请写路径。10 shortcut.Description = "我的快捷方式--yeaicc";9 // 快捷方式描述,鼠标放到快捷方式上会显示出来哦。15 // 保存,创建就成功了。3 // 创建一个快捷方式。1 // 声明操作对象。5 // 关联的程序。11 // 全局热键。原创 2024-04-27 11:08:24 · 501 阅读 · 0 评论 -
C#/winform设置窗体自动缩放适应不同尺寸的电脑屏幕大小
如果希望控件或窗体根据操作系统中字体的大小进行拉伸或缩小,则按 Font 缩放十分有用,如果控件或窗体的绝对大小无关紧要,则应使用这种方式进行缩放。例如,对于显示图表或其他图形的控件,可能希望使用每英寸点数 (DPI) 缩放,以便该控件始终占据一定百分比的屏幕。MaximizeBox=true,可设置窗体最大化,当窗体超出屏幕时,用户可设置窗体最大化来让窗体尺寸贴合用户屏幕。如果不存在父类,则禁用自动缩放。Autosize=false,设置窗体不根据内容超出而调整窗体自身大小,以免窗体超出屏幕。转载 2023-12-13 16:34:46 · 5692 阅读 · 0 评论 -
C# 中delegate、event、Action、Func详解
因为delegate是很宽泛的,格式内容都不受限,俗话说没有规矩不成方圆,如果一人过于随意,那么他所做的事也规范不到哪去,这就会导致后期的维护很费劲,实际开发中也基本都用后面三种。Action<int,string,bool> 表示有传入参数int,string,bool无返回值的委托。Func<T1,T2,,T3,int> 表示传入参数为T1,T2,,T3(泛型)返回值为int的委托。Action<int,int,int,int> 表示有传入4个int型参数,无返回值的委托。而且只能+=和-=操作。原创 2023-03-18 21:23:59 · 2470 阅读 · 0 评论 -
C#-深入解析编程中泛型委托的使用及多播委托实例
c#原创 2023-02-14 20:49:52 · 558 阅读 · 0 评论 -
C#高级语法之泛型、泛型约束,类型安全、逆变和协变(思想原理)
c#转载 2023-02-14 20:37:29 · 626 阅读 · 0 评论 -
C#泛型委托的概念及实例解析
c#转载 2023-02-14 20:33:58 · 533 阅读 · 0 评论 -
C# 应用程序设置运行时自动获取管理员权限,不显示uac提升权限提示
c#转载 2023-02-11 21:19:52 · 2854 阅读 · 0 评论 -
C#中委托概念及使用方法详解
c#原创 2023-02-11 21:15:05 · 868 阅读 · 0 评论 -
控件中的Cliked事件和MouseDown事件执行优先级问题
c#原创 2022-11-01 20:41:29 · 385 阅读 · 0 评论 -
c#中子控件在父控件中显示的位置问题
c#原创 2022-11-01 20:35:11 · 554 阅读 · 0 评论 -
c#中动态加载及显示UserControl和Form在父控件中
c#原创 2022-10-29 11:35:51 · 3329 阅读 · 0 评论 -
c#中控件事件注册的几种方法
C原创 2022-10-27 21:57:19 · 1442 阅读 · 0 评论 -
C#中异步窗体的调用的几种方法
c#原创 2022-09-20 19:20:54 · 1385 阅读 · 0 评论 -
C#中隐藏窗体并执行窗体逻辑的方法
Winform原创 2022-09-17 08:28:09 · 953 阅读 · 0 评论 -
c#子线程和主线程创建窗体时顶层显示的区别
主线程1.设置TopLevel,Topmost,bringfront属性。子线程2.在可在Load事件里注册循环设置TopLevel,Topmost,bringfront属性的方法,如下frm.Load += new EventHandler((object ob, EventArgs ee) => { Task.Factory.StartNew(() => { ...原创 2022-03-06 16:04:44 · 601 阅读 · 0 评论 -
C#中4种深拷贝方法实例
1:利用反射实现 1 2 3 4 5 6 7 8 9 10 11 12 13 14 public static T DeepCopy<T>(T obj) { //如果是字符串或值类型则直接返回 if (obj is string || obj.GetType().IsValueType) return obj; ...原创 2022-03-05 16:38:46 · 1628 阅读 · 0 评论 -
c#中事件注册多个委托并获取委托列表
using System;namespace 委托和事件{ internal class Program { private static void Main(string[] args) { Action action = One; action += Two; action += Three; Delegate[] delegates = action.Ge...原创 2022-03-05 16:35:16 · 1445 阅读 · 1 评论 -
c#中使用Marshal手动在堆中创建非托管内存并使用
使用 Marshal 做出可以快速释放内存的大数组。需要不断申请一段大内存数组,然后就释放他,但是 C# 对于大内存不是立刻释放,所以就存在一定的性能问题。在博客园看到了一位大神使用 Marshal 做出快速申请的大数组,于是我就学他的方法来弄一个。本文告诉大家这个类是如何使用在使用的时候,先来看下原来的 C# 的大数组性能。可以看到在不停gc,性能不好 static void Main(string[] args) { for (int i = 0; i <转载 2022-02-12 13:23:02 · 1365 阅读 · 0 评论 -
C#截获其它窗口的WM_PAINT 消息
在C#底下如何截获其它窗口的WM_PAINT 消息啊?自己窗口可以这样截获protected override void WndProc( ref Message m ){switch(m.Msg){case WM_PAINT:{}}原创 2022-02-05 20:48:21 · 644 阅读 · 0 评论 -
c#实例-子线程查找另一线程模态对话框句柄(invoke测试)
private void button3_Click(object sender, EventArgs e) { Task.Factory.StartNew(() => { Form1form1 = new Form1(); form1.Name = "MyForm"; form1.Text = "子窗体"; form1....原创 2022-01-18 20:57:32 · 389 阅读 · 0 评论 -
c# Invoke和BeginInvoke 区别详解
Control.Invoke 方法 (Delegate):在拥有此控件的基础窗口句柄的线程上执行指定的委托。Control.BeginInvoke 方法 (Delegate) :在创建控件的基础句柄所在线程上异步执行指定委托。以下为实际应用中碰到的问题,在主线程中启动一个线程,然后在这个线程中启动serviceForm,然而在线程启动后,往serviceForm发送指令,serviceForm.IsHandleCreated老是报serviceForm = null,无法执行指令,采用延时的办法可以原创 2021-12-13 19:32:08 · 673 阅读 · 0 评论 -
关于SetCapture() 和 ReleaseCapture()的用法
MSND中对SetCapture()函数的说明为:“该函数在属于当前线程的指定窗口里设置鼠标捕获。一旦窗口捕获了鼠标,所有鼠标输入都针对该窗口,无论光标是否在窗口的边界内。同一时刻只能有一个窗口捕获鼠标。如果鼠标光标在另一个线程创建的窗口上,只有当鼠标键按下时系统才将鼠标输入指向指定的窗口。”一开始我看这个解释误认为了只要在属于窗口里的一个线程调用了SetCapture(hWnd)把hWnd设为当前的窗口句柄,那么以后的所有窗口消息都会发到我们指定的那个窗口消息队列中。这样的理解是错误的!!!在你调用Set原创 2021-12-10 19:39:00 · 976 阅读 · 0 评论 -
c#中WinForm中拖拽窗体实现移动功能(无边框模态窗体)
在WindowsForm 应用程序中,如果将窗体的FormBorderStyle属性设置为none,这时,用鼠标拖拽窗体时就无法实现移动的功能了,下面就是解决方案.在FormBordeStyle属性设置为none的窗体的后台代码中添加以下代码: [DllImport("user32.dll")] public static extern bool ReleaseCapture(); [DllImport("user32.dll")] public s原创 2021-12-10 19:37:12 · 6597 阅读 · 0 评论 -
c#中Show和Showdialog的区别分析
简单地说他们的区别就是show弹出来的窗体和父窗体(上一个窗体的简称)是属于同一等级的,这两个窗体可以同时存在而且可以随意切换,但是showdialog弹出来的窗体就不能这样,他永远是被置顶的,如果不关闭这个窗体,那就不能使用别的窗体。所以说相对于show来说我感觉showdialog更多了一种强制性。所以这两种方法虽然都是弹出窗体,但是程序员需要根据需要来选择使用在C#中窗口的显示有两种方式:模态显示(showdialog)和非模态显示(show)。二者最常见的区别是:模态显示后,弹出窗口阻原创 2021-12-06 20:39:31 · 7077 阅读 · 0 评论 -
C#中控件如何设置透明色
设置窗体的TransparencyKey 属性,为你想要变成透明的颜色,比如:你把窗体背景色设置成红色,然后把TransparencyKey 设置成红色,代码:this.BackColor = Color.Red;this.TransparencyKey = Color.Red;原创 2021-11-06 10:55:55 · 2392 阅读 · 0 评论 -
Windows 消息ID及定义大全
表A-1 Windows消息分布 消息范围 说 明 0 ~WM_USER– 1 系统消息 WM_USER~ 0x7FFF 自定义窗口类整数消息 WM_APP~ 0xBFFF 应用程序自定义消息 0xC000 ~ 0xFFFF 应用程序字符串消息 > 0xFFFF ...原创 2021-05-14 21:38:29 · 5053 阅读 · 0 评论 -
WM_Paint 消息疑问解析
1. 系统何时发送WM_PAINT消息? 系统会在多个不同的时机发送 WM_PAINT 消息:当第一次创建一个窗口时,当改变窗口的大小时,当把窗口从另一个窗口背后移出时,当最大化或最小化窗口时,等等,这些动作都是由 系统管理的,应用只是被动地接收该消息,在消息处理函数中进行绘制操作;大多数的时候应用也需要能够主动引发窗口中的绘制操作,比如当窗口显示的数据改变 的时候,这一般是通过 InvalidateRect 和 InvalidateRgn 函数来完成的。 InvalidateR...原创 2021-05-14 21:32:31 · 231 阅读 · 0 评论 -
c#中控件重绘(放大缩小移动隐藏恢复后不消失)实例
//很重要,一定要重写并在在OnPaint()中用传入的pevent.Graphics重绘,并且屏蔽掉父类的OnPaint方法,这样重绘后的图形不论控件怎么操作都不会消失了using System;using System.Collections.Generic;using System.Drawing;using System.Drawing.Drawing2D;using System.Linq;using System.Text;using System.Threading.Tasks.原创 2021-05-14 21:31:04 · 1282 阅读 · 0 评论 -
C#中GDI绘制高质量平滑图形实例
protected override void OnPaint(PaintEventArgs e){try{Graphics g = e.Graphics;//获取绘制对象///设置参数g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; //图片柔顺...原创 2021-05-14 21:26:01 · 1299 阅读 · 0 评论 -
C#中创建圆形/按钮(使用重绘)
创建圆形按钮挺简单的。 public class EllipseButton : Button { protected override void OnPaint(PaintEventArgs pevent) { GraphicsPath gPath = new GraphicsPath(); // 绘制椭圆形区域 gPath.AddEllipse(0, 0, this.ClientSize.Width, this.ClientSi.原创 2021-05-13 21:42:40 · 1735 阅读 · 1 评论 -
c#中使用消息循环机制发送接收字符串的方法和数据类型转换
在定义消息时忘记了用户可定义消息的边界值,在网上一阵疯找后来发现是const int WM_USER = 0x400。接着是SendMessage的lParam类型不能决定(默认是IntPtr),我想发送字符串信息,就将它定为了string型,然后通过重写DefWndProc接收自定义消息。问题出现:(string) message.lParam提示不能转换,然后使用另一种方法:(string)message.GetLParam(typeof(string)),依然有错,提示应该重载string的构造函数建原创 2021-05-10 21:52:07 · 881 阅读 · 0 评论 -
c#中通过win32API(FindWindowEx)查找控件句柄实例
函数功能:该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。函数原型:HWND FindWindowEx(HWND hwndParent,HWND hwndChildAfter,LPCTSTR lpszClass,LPCTSTR lpszWindow);参数:hwndParent:要查找子窗口的父窗口句柄。如果hwnjParent为NULL,则函数以桌面窗口为父窗口,查找桌面窗口的所有子窗口。原创 2021-05-10 21:50:13 · 2850 阅读 · 0 评论 -
C#使用Win32API获得窗口和控件的句柄
/*整个Windows编程的基础。一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。应用程序能够通过句柄访问相应的对象的信息,但是句柄不是指针,程序不能利用句柄来直接阅读文件中的信息。如果句柄不在I/O文件中,它是毫无用处的。 句柄是Windows用来标志应用程序中建立的或是使用的唯一整数,Windows大量使用了句柄来标识对象。*/[DllImport("U...原创 2021-04-19 20:15:57 · 1767 阅读 · 0 评论 -
c#中的DefWndProc是Control类的虚函数
protected override void DefWndProc(ref Message m)protected override void DefWndProc(ref Message m)是Control的虚函数原创 2021-04-12 21:08:07 · 1107 阅读 · 0 评论