首页 > 其他分享 >最佳的实现Winfrom无边框四周阴影方案

最佳的实现Winfrom无边框四周阴影方案

时间:2024-12-07 23:36:01浏览次数:5  
标签:const int Winfrom WM private 阴影 边框 ref public

网上不靠谱的东西太多了,都是两边阴影,什么窗口叠加、ps作图啥的,什么玩意?本文来自Google找的,老外的方法比较实在,简洁有效。

  1 public partial class Form1 : Form
  2 {
  3     [DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")]
  4     private static extern IntPtr CreateRoundRectRgn
  5     (
  6         int nLeftRect, // x-coordinate of upper-left corner
  7         int nTopRect, // y-coordinate of upper-left corner
  8         int nRightRect, // x-coordinate of lower-right corner
  9         int nBottomRect, // y-coordinate of lower-right corner
 10         int nWidthEllipse, // height of ellipse
 11         int nHeightEllipse // width of ellipse
 12      );        
 13 
 14     [DllImport("dwmapi.dll")]
 15     public static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS pMarInset);
 16 
 17     [DllImport("dwmapi.dll")]
 18     public static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize);
 19 
 20     [DllImport("dwmapi.dll")]
 21     public static extern int DwmIsCompositionEnabled(ref int pfEnabled);
 22 
 23     private bool m_aeroEnabled;                     // variables for box shadow
 24     private const int CS_DROPSHADOW = 0x00020000;
 25     private const int WM_NCPAINT = 0x0085;
 26     private const int WM_ACTIVATEAPP = 0x001C;
 27 
 28     public struct MARGINS                           // struct for box shadow
 29     {
 30         public int leftWidth;
 31         public int rightWidth;
 32         public int topHeight;
 33         public int bottomHeight;
 34     }
 35 
 36     private const int WM_NCHITTEST = 0x84;          // variables for dragging the form
 37     private const int HTCLIENT = 0x1;
 38     private const int HTCAPTION = 0x2;
 39 
 40     protected override CreateParams CreateParams
 41     {
 42         get
 43         {
 44             m_aeroEnabled = CheckAeroEnabled();
 45 
 46             CreateParams cp = base.CreateParams;
 47             if (!m_aeroEnabled)
 48                 cp.ClassStyle |= CS_DROPSHADOW;
 49 
 50             return cp;
 51         }
 52     }
 53 
 54     private bool CheckAeroEnabled()
 55     {
 56         if (Environment.OSVersion.Version.Major >= 6)
 57         {
 58             int enabled = 0;
 59             DwmIsCompositionEnabled(ref enabled);
 60             return (enabled == 1) ? true : false;
 61         }
 62         return false;
 63     }
 64 
 65     protected override void WndProc(ref Message m)
 66     {
 67         switch (m.Msg)
 68         {
 69             case WM_NCPAINT:                        // box shadow
 70                 if (m_aeroEnabled)
 71                 {
 72                     var v = 2;
 73                     DwmSetWindowAttribute(this.Handle, 2, ref v, 4);
 74                     MARGINS margins = new MARGINS()
 75                     {
 76                         bottomHeight = 1,
 77                         leftWidth = 1,
 78                         rightWidth = 1,
 79                         topHeight = 1
 80                     };
 81                     DwmExtendFrameIntoClientArea(this.Handle, ref margins);
 82 
 83                 }
 84                 break;
 85             default:
 86                 break;
 87         }
 88         base.WndProc(ref m);
 89 
 90         if (m.Msg == WM_NCHITTEST && (int)m.Result == HTCLIENT)     // drag the form
 91             m.Result = (IntPtr)HTCAPTION;
 92 
 93     }
 94 
 95     public Form1()
 96     {
 97         m_aeroEnabled = false;
 98 
 99         this.FormBorderStyle = FormBorderStyle.None;
100 
101         InitializeComponent();
102     }
103 }

 

标签:const,int,Winfrom,WM,private,阴影,边框,ref,public
From: https://www.cnblogs.com/soliang/p/18592820

相关文章

  • 判断如下边框的颜色,并解释为什么[代码]?
    请提供代码!我没有看到任何代码可以用来判断边框颜色。请把HTML和CSS代码贴出来,我会尽力帮你分析。我需要代码才能理解边框是如何定义的。它可能是内联样式、外部样式表或甚至是从JavaScript动态应用的。没有代码,我只能给出一些通用的方法:检查元素的style属性:如果边框......
  • css 边框镶角
    效果图:background:linear-gradient(toleft,yellow,yellow)lefttopno-repeat,linear-gradient(tobottom,yellow,yellow)lefttopno-repeat,linear-gradient(toleft,yellow,yellow)righttopno-repeat,linear-gradient(tobottom,yellow,yellow)ri......
  • 请使用CSS画一个带锯齿形边框圆圈
    可以使用clip-path属性配合polygon()函数来创建一个带锯齿形边框的圆圈。以下是一个示例:.jagged-circle{width:200px;height:200px;border-radius:50%;background-color:#4CAF50;/*Green*/clip-path:polygon(50%0%,60%5%,70%0%,......
  • 用css给一个元素加边框有哪些方法?
    在CSS中,您可以使用多种方法为元素添加边框。以下是一些常见的方法,并附带示例:1.border简写属性:这是最常用的方法,它允许您在一个声明中设置边框的宽度、样式和颜色。border:2pxsolidred;/*2px宽的红色实线边框*/这个简写属性等同于分别设置border-width、border-s......
  • 移动页面底部工具条有3个图标,如何平分?在设置边框后最后一个图标掉下去了怎么办?
    这个问题通常是因为工具条的宽度没有正确计算或者最后一个图标的宽度导致溢出。以下是一些解决方法,并解释了可能的原因:1.Flexbox布局(推荐):Flexbox是最简单和最灵活的解决方案。它可以自动处理元素的排列和分配空间。<divclass="toolbar"style="display:flex;justify-......
  • 选中多个窗口中一个,绘制蓝色边框
    1.需求描述多个播放的窗口,选中其中的一个,用蓝色线框标记出来,如下图所示;2.实现方式通过mousePressEvent函数判断是点击了哪个窗口,然后用paintEvent函数来绘制窗口的边框;#ifndefMULTLAYOUT_H#defineMULTLAYOUT_H#include<QWidget>#include"ui_MultLayout.h"#include......
  • HTML和CSS中的浮动以及边框塌陷解决方案(内置练习及答案)
    一、浮动概述在HTML和CSS中,“浮动”(Float)是一种布局技术,它允许元素脱离其正常的文档流,向左或向右移动,直到它的外边缘碰到包含框或另一个浮动元素的边缘。浮动元素仍然保持块级盒模型的特性(如可以设置宽度和高度),但是它们不再占据文档流中的空间,这意呀着文档中的其他元素会......
  • CSS——边框过渡效果
    CSS——边框过渡效果今天浅浅的水一下边框过渡效果。按钮边框过渡效果小小的解释一波这里采用了一个外围的容器盒子,为了实现容器盒子的水平居中(这个简单)和垂直居中(这个就稍微复杂一些,往后可能会出一期专门设置垂直居中的文章),我还是请出了Flex弹性盒子,真的是太好......
  • PyQt / PySide + Pywin32 + ctypes 自定义标题栏窗口 + 完全还原 Windows 原生窗口边
    项目地址:GitHub-github201014/PyQt-NativeWindow:AclassofwindowincludenativeEvent,usePySideorPyQtandPywin32andctypesAclassofwindowincludenativeEvent,usePySideorPyQtandPywin32andctypes-github201014/PyQt-NativeWindowhttps://githu......
  • 如何修改边框的外观
    文章目录1.概念介绍2.使用方法3.示例代码我们在上一章回中介绍了DrawerHeaderWidget相关的内容,本章回中将介绍BoxDecorationWidget.闲话休提,让我们一起TalkFlutter吧。1.概念介绍我们在这里介绍的BoxDecorationWidget是一种修饰类组件,它不能单独使用,需......