第一步:需要了解的基本知识

NativeWindow:该类自动管理窗口类的创建和注册。当窗口与窗口句柄关联时,该窗口不适合进行垃圾收集。为了确保正确的垃圾回收,必须使用DestroyHandle手动销毁句柄,或者使用ReleaseHandle释放句柄。NativeWindow类提供以下属性和方法来管理句柄:句柄、CreateHandle、AssignHandle、DestroyHandle和ReleaseHandle。详细请见:https://docs.microsoft.com/enus/dotnet/api/system.windows.forms.nativewindow?view=netframework-4.8

CreateParams:封装创建控件时所需的信息。CreateParams中的信息可用于传递关于控件初始状态和外观的信息。大多数控件派生的控件都覆盖CreateParams属性,以传入适当的值或在CreateParams中包含附加信息。用于设置样式、ExStyle和ClassStyle属性的常量在Winuser.h头文件中定义。该文件由平台SDK或Visual Studio安装。详细请见:
https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.createparams?view=netframework-4.8

user32.dll:是Windows用户界面相关应用程序接口,用于包括Windows处理,基本用户界面等特性,如创建窗口和发送消息。在早期32-bit 版本的Windows中,用户控件是在ComCtl32中实现的,但是一些控件的显示功能是在User32.dll中实现的。例如在一个窗口中非客户区域(边框和菜单)的绘制就是由User32.dll来完成的。User32.dll 是操作系统的一个核心控件,它和操作系统是紧密联系在一起的。也就是说,不同版本的Windows中User32.dll 是不同。因此,应用程序在不同版本的Windows中运行的时候,由于User32.dll的不同,会导致应用程序的界面通常会有微小的不同,详细请见:
https://blog.csdn.net/nodeman/article/details/82424076

gdi32.dll:系统文件gdi32.dll是存放在Windows系统文件夹中的一个动态链接库,是windows下图形用户界面的应用拓展,通常情况下是在安装操作系统过程中自动创建的,对于系统正常运行来说至关重要。除非用户电脑被木马病毒、或是流氓软件篡改导致出现gdi32.dll丢失、缺失损坏等弹窗现象,否则不建议用户对该类文件(gdi32.dll)进行随意的修改。(至于里面的函数,大家一个个到百度搜索吧)

第二步:代码实现

效果如图:

1、主进入点:

public void show(){//判断句柄是否为空,为空则代表需要创建句柄对象if (this.Handle == IntPtr.Zero){//封装创建控件时需要的信息,获取此封装对象CreateParams params1 = new CreateParams();//设置封装对象的相关属性params1.X = 50;params1.Y = 50;params1.Height = 200;params1.Width = 400;params1.Parent = IntPtr.Zero;uint ui = 0x80000000;params1.Style = (int)ui;params1.ExStyle = 0x8 | 0x80 | 0x80000 | 0x08000000 | 0x20;//创建窗口及句柄,此时还是透明的,因为还没有任何控件this.CreateHandle(params1);//给窗体中添加背景,控件等Bitmap bitmap1 = new Bitmap(400, 200, PixelFormat.Format32bppArgb);using (Graphics graphics1 = Graphics.FromImage(bitmap1))  //生成一个绘图画面{Rectangle rectangle1;SIZE size1;POINT point1;POINT point2;BLENDFUNCTION blendfunction1;rectangle1 = new Rectangle(0, 0, 400, 200);  //新建一个矩形框//绘制图像背景和文字this.performPaint(new PaintEventArgs(graphics1, rectangle1));// 该函数检索指定窗口客户区域或整个屏幕的显示设备上下文环境的句柄,在随后的GDI函数中可以使用该句柄在设备上下文环境中绘图。IntPtr ptr1 = GetDC(IntPtr.Zero);//现有设备上下文环境的句柄,如果该句柄为NULL,该函数创建一个与应用程序的当前显示器兼容的内存设备上下文环境。IntPtr ptr2 = CreateCompatibleDC(ptr1);//创建GDI位图对象IntPtr ptr3 = bitmap1.GetHbitmap(Color.FromArgb(0));//SelectObject将返回设备描述表中上一次选择的对象句柄。//函数功能:该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。IntPtr ptr4 = SelectObject(ptr2, ptr3);size1.CX = 400;size1.CY = 200;point1.X = 50;point1.Y = 50;point2.X = 0;point2.Y = 0;blendfunction1 = new BLENDFUNCTION();blendfunction1.BlendOp = 0;blendfunction1.BlendFlags = 0;blendfunction1.SourceConstantAlpha = this._alpha;blendfunction1.AlphaFormat = 1;//创建半透明窗体  UpdateLayeredWindow函数更新一个分层窗口的位置,大小,形状,内容和半透明度。//详细见网址:https://baike.baidu.com/item/UpdateLayeredWindow/1778213?fr=aladdinUpdateLayeredWindow(this.Handle, ptr1, ref point1, ref size1, ptr2, ref point2, 0, ref blendfunction1, 2);SelectObject(ptr2, ptr4);ReleaseDC(IntPtr.Zero, ptr1);DeleteObject(ptr3);DeleteDC(ptr2);}}//设置窗口的可见性状态//详细见:https://baike.baidu.com/item/ShowWindow/5279029ShowWindow(this.Handle, 4);}

2、其中涉及到的变量和方法:

 //绘制图像protected virtual void performPaint(PaintEventArgs e){using (LinearGradientBrush b = new LinearGradientBrush(this.Bound, Color.LightBlue, Color.DarkGoldenrod, 45f)){//绘制图像的大小形状,背景色e.Graphics.FillRectangle(b, this.Bound);}//在图像上绘制文字e.Graphics.DrawString("Overide this PerformPaint method........", new Font(FontFamily.GenericSansSerif, 12f, FontStyle.Regular), new SolidBrush(Color.FromArgb(170, Color.Red)), new PointF(0f, 10f));}public Rectangle Bound{get{return new Rectangle(new Point(0, 0), new Size(400, 200));}}#region//引入外部的dll方法  变成自己的方法[DllImport("User32.dll", CharSet = CharSet.Auto)]//设置窗口的可见性状态public static extern int ShowWindow(IntPtr hWnd, short cmdShow);[DllImport("gdi32.dll", CharSet = CharSet.Auto)]//删除DC  ,画布环境(设备上下文)public static extern bool DeleteDC(IntPtr hDC);[DllImport("gdi32.dll", CharSet = CharSet.Auto)]//删除一个GDI对象public static extern IntPtr DeleteObject(IntPtr hObject);[DllImport("User32.dll", CharSet = CharSet.Auto)]//释放指定的设备描述表,设备上下文public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);[DllImport("User32.dll", CharSet = CharSet.Auto)]//半透明窗体 public static extern bool UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, ref POINT pptDst, ref SIZE psize, IntPtr hdcSrc, ref POINT pprSrc, int crKey, ref BLENDFUNCTION pblend, int dwFlags);private byte _alpha = 250;[DllImport("gdi32.dll", CharSet = CharSet.Auto)]//函数功能:该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。//SelectObject将返回设备描述表中上一次选择的对象句柄。public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);[DllImport("gdi32.dll", CharSet = CharSet.Auto)]//现有设备上下文环境的句柄,如果该句柄为NULL,该函数创建一个与应用程序的当前显示器兼容的内存设备上下文环境。public static extern IntPtr CreateCompatibleDC(IntPtr hDC);[DllImport("User32.dll", CharSet = CharSet.Auto)]// 该函数检索指定窗口客户区域或整个屏幕的显示设备上下文环境的句柄,在随后的GDI函数中可以使用该句柄在设备上下文环境中绘图。public static extern IntPtr GetDC(IntPtr hWnd);#endregion#region IDisposable Supportprivate bool disposedValue = false; // 要检测冗余调用protected virtual void Dispose(bool disposing){if (!disposedValue){if (disposing){// TODO: 释放托管状态(托管对象)。GC.SuppressFinalize(this);}// TODO: 释放未托管的资源(未托管的对象)并在以下内容中替代终结器。// TODO: 将大型字段设置为 null。this.DestroyHandle();disposedValue = true;}}// 添加此代码以正确实现可处置模式。void IDisposable.Dispose(){Dispose(true);}#endregion}

3、涉及的数据类型(Struct):

#region//一些相关的数据Struct结构[StructLayout(LayoutKind.Sequential, Pack = 1)]public struct BLENDFUNCTION{public byte BlendOp;public byte BlendFlags;public byte SourceConstantAlpha;public byte AlphaFormat;}[StructLayout(LayoutKind.Sequential)]public struct POINT{public Int32 X;public Int32 Y;public POINT(Int32 x, Int32 y){X = x;Y = y;}}[StructLayout(LayoutKind.Sequential)]public struct SIZE{public Int32 CX;public Int32 CY;public SIZE(Int32 cx, Int32 cy){CX = cx;CY = cy;}}[Serializable, StructLayout(LayoutKind.Sequential)]public struct RECT{public int Left;public int Top;public int Right;public int Bottom;public RECT(Rectangle rect){Left = rect.Left;Top = rect.Top;Right = rect.Right;Bottom = rect.Bottom;}public Rectangle Rect{get{return new Rectangle(Left, Top, Right - Left, Bottom - Top);}}public Point Location{get{return new Point(Left, Top);}}}#endregion

C#中纯代码实现界面设计,不受VS中的拖拽图像界面限制相关推荐

  1. MFC 基于VLC的视频播放器(三)---界面设计以及对话框接受文件的拖拽

    北京时间23点11分 2018年12月20日 前面已经完成了vlc的环境的搭建,下面便开始真正的编程. 前面的界面是这样的: 理想的界面应该是这样的: 所以添加按钮.进度条和播放列表控件,并且修改好I ...

  2. 汇编语言:编写code段中的代码,用push指令将a段中的前8个字型数据,逆序存储b段中

    题目介绍 程序如下,编写code段中的代码,用push指令将a段中的前8个字型数据,逆序存储b段中. assume cs:code,ds:a,ss:ba segmentdw 1,2,3,4,5,6,7 ...

  3. 户界面样式-表单轮廓和防止拖拽文本域(HTML、CSS)

    户界面样式-表单轮廓和防止拖拽文本域(HTML.CSS) <!DOCTYPE html> <html lang="en"><head><m ...

  4. c语言关键字中英翻译机课程设计,C语言关键字中英翻译机.doc

    C语言关键字中英翻译机.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文档 ...

  5. 机械中计算机的应用研究,机械设计制造及其自动化中计算机技术的应用研究

    机械设计制造及其自动化中计算机技术的应用研究 陶颖 北华航天工业学院研究生教学部 河北 廊坊 065000 摘要:随着我国社会的不断发展,我国科技技术也在加快进步.目前我国对于机械设计制造及其自动化计 ...

  6. java 图形界面设计,使用JPanel、JFrame 绘图,图形界面设计入门演示,各种主要绘图方法以及图片、文字插入

    那什么是JPanel?JFrame 又是什么呢?让我们先来了解一下他们的区别吧: JFrame是最底层,JPanel是置于其面上,同一个界面只有一个JFrame,一个JFrame可以放多个JPanel ...

  7. Javafx可视化、拖拽式界面设计之Scene Builder的安装和使用

    系列文章专栏:javafx图形绘制.桌面录屏录音源码合集 目录 一.安装Scene Builder 二.Scene Builder功能介绍 三.Scene Builder的使用 相信使用java开发桌 ...

  8. vue项目中,兼容vue3.0 1.0 2.0 宫格拖拽排序,特殊五小一大六宫格拖拽

    前端时间写了标准宫格拖拽排序的文章       1.  2.4.9.12等等标准宫格拖拽,基于vue-grid-layout 拖拽换位无刷新 vue项目中 基于vue-grid-layout开发的拖拽 ...

  9. html css拖拽设计,css绘制三角形 和 HTML拖拽事件

    利用css制作三角形 利用设置边框的三个边的长度和border实现三角形设置,并隐藏其他边 例子:#yz3{ display: inline-block; 0; height: 0; border-t ...

最新文章

  1. AI智能手机会是什么样?至少有这十个功能
  2. Redis实战(2)安装和试用
  3. 后台开发技术(1)--概述
  4. ALTERA产品型号命名
  5. spring源码研究
  6. CF924D. Contact ATC
  7. LeetCode 1637. 两点之间不包含任何点的最宽垂直面积
  8. 【BZOJ1607】轻拍牛头,筛一筛
  9. 兼容超大图片的处理_N年都没弄明白!PS保存的图片格式都啥意思?
  10. 计量分析类论文如何创新-化柏林
  11. 【oracle ocp知识点一】
  12. 函数模板与函数的区别
  13. ParaView Volume MHD
  14. 服务器状态 fadein,aria2-BT服务器地址的可用trackers列表(已接手)
  15. 如何通过股票量化交易接口实现盈利稳定?
  16. Nginx反向代理汇总
  17. linux区分物理机和虚拟机,如何判断linux服务器是虚拟机还是物理机
  18. 如何做云班课上的计算机作业,云班课不分组怎么提交作业
  19. 舰船知识科普-有图有真相(附PPT)
  20. SuperNotCalledException Activity xxx did not call through to super.onCreate

热门文章

  1. finally在python中是什么意思_在Python中解释try,except和finally语句。
  2. c语言如何使一行抹去,c语言,clrscr();怎么清除指定的内容,不是页面都清除掉。比如第一行是标题,我只想清除第二行...
  3. shell 变量保护 引号的作用
  4. 供应商绩效管理对企业采购组织的重要价值
  5. 关于无法删除VMware虚拟机文件解决办法
  6. 一周前端文章推荐(2019/09/22)
  7. Web2.0-个人品牌打造指南
  8. mysql对xa的支持_Mysql对XA的支持
  9. mysql coolshell_coolshell里的一些c++文章
  10. C语言beep随机音乐代码