1 创建一个窗体项目(本项目是在VS2015中进行创建)2 将窗体的FormBorderStyle属性设置为None,设置后窗体的标题栏将消失不显示3 添加2个panel空间,如下图布置,上面一个panel作为标题栏,下面一个panel作为窗体内容显示区4 添加3个pictureBox空间,作为最大化、最小化、关闭按钮的容器
本片博客主要讲的事最近总结的一些关于
窗体
的
自定义
:
1.首先创建一个BaseForm
窗体
,通过设置属性FormBorderStyle=None为无边框
窗体
,代码如下:
public partial class BaseForm : Form
// 图片名称
public const String IMG_MIN = "btn_min";
C#
移动无标题栏
窗体
的三种代码:第一种采用,需注意
窗体
上的控件是否把
窗体
覆盖了。。。MouseDown、MouseMove、MouseUp事件应该是鼠标所处位置最顶层的控件的事件
在
窗体
的类中声明两个变量
private Point mouseOffset; //记录鼠标指针的坐标
private bool isMouseDown = false; //记录鼠标按键是否按下
创建该
窗体
MouseDown、MouseMove、MouseUp事件的相应处理程序
private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
int xOffset;
int yOffset;
if (e.Button == MouseButtons.Left)
xOffset = -e.X ;
yOffset = -e.Y ;
mouseOffset = new Point(xOffset, yOffset);
isMouseDown = true;
private void Form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
if (isMouseDown)
Point mousePos = Control.MousePosition;
mousePos.Offset(mouseOffset.X, mouseOffset.Y);
Location = mousePos;
private void Form1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
// 修改鼠标状态isMouseDown的值
// 确保只有鼠标左键按下并移动时,才移动
窗体
if (e.Button == MouseButtons.Left)
isMouseDown = false;
第二种调用API 未验证
using System.Runtime.InteropServices;
[DllImport("user32.dll")]
public static extern bool ReleaseCapture();
[DllImport("user32.dll")]
public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
public const int WM_SYSCOMMAND = 0x0112;
public const int SC_MOVE = 0xF010;
public const int HTCAPTION = 0x0002;
private void Form1_MouseDown(object sender, MouseEventArgs e)
ReleaseCapture();
SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
第三种未验证
private bool isMouseDown = false;
private Point FormLocation; //form的location
private Point mouseOffset; //鼠标的按下位置
[DllImport("user32.dll")]
public static extern bool ReleaseCapture();
[DllImport("user32.dll")]
public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
private const int WM_SYSCOMMAND = 0x0112;//点击窗口左上角那个图标时的系统信息
private const int SC_MOVE = 0xF010;//移动信息
private const int HTCAPTION = 0x0002;//表示鼠标在窗口标题栏时的系统信息
private const int WM_NCHITTEST = 0x84;//鼠标在
窗体
客户区(除了标题栏和边框以外的部分)时发送的消息
private const int HTCLIENT = 0x1;//表示鼠标在窗口客户区的系统消息
private const int SC_MAXIMIZE = 0xF030;//
最大化
信息
private const int SC_MINIMIZE = 0xF020;//
最小化
信息
protected override void WndProc(ref Message m)
switch (m.Msg)
case WM_SYSCOMMAND:
if (m.WParam == (IntPtr)SC_MAXIMIZE)
m.WParam = (IntPtr)SC_MINIMIZE;
break;
case WM_NCHITTEST: //如果鼠标移动或单击
base.WndProc(ref m);//调用基类的窗口过程——WndProc方法处理这个消息
if (m.Result == (IntPtr)HTCLIENT)//如果返回的是HTCLIENT
m.Result = (IntPtr)HTCAPTION;//把它改为HTCAPTION
return;//直接返回退出方法
break;
base.WndProc(ref m);//如果不是鼠标移动或单击消息就调用基类的窗口过程进行处理
private void Form1_Load(object sender, EventArgs e)
-------------------------------
如何在
窗体
标题栏左边的控制菜单加入自己的菜单啊?
我们一般在窗口标题栏点右键 或 按Alt+空格 可以弹出那个菜单。
------解决方案--------------------
using System.Runtime.InteropServices;
[DllImport( "user32.dll ")]
public static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
[DllImport( "user32.dll ")]
public static extern bool InsertMenu(IntPtr hMenu, uint uPosition, uint uFlags,
uint uIDNewItem, string lpNewItem);
public const int MF_BYCOMMAND = 0;
public const int MF_STRING = 0;
public const int MF_BYPOSITION = 0x400;
public const int MF_SEPARATOR = 0x800;
private const uint SC_ABOUT = 0x0001;
public const int WM_SYSCOMMAND = 0x0112;
private void Form1_Load(object sender, EventArgs e)
IntPtr vMenuHandle = GetSystemMenu(Handle, false);
InsertMenu(vMenuHandle, 255, MF_STRING, SC_ABOUT, "About... ");
protected override void WndProc(ref Message m)
switch (m.Msg)
case WM_SYSCOMMAND:
if ((uint)m.WParam == SC_ABOUT)
MessageBox.Show( "Zswang 路过! ");
break;
base.WndProc(ref m);
应用中会涉及到对
最大化
,
最小化
,
关闭
按钮
三种
按钮
的控制方法,下面一次说明对这三种
按钮
的控制方法.
最大化
:MaximizeBox,
最小化
:MinimizeBox。
如果设置一个为False 的时候会显示不可用,两个都设置为False 的时候,两个
按钮
同时消失。
关闭
按钮
没有设置不可用
但是它有一个ControlBox属性,设置为False 的时候
最小化
、
最大化
、
关闭
按钮
都会消失。
设置对窗口大小不能调整
找到【FormBorderStyle】选项,在选项列表中选择【FixedDialog】,这样就可以固
要实现
窗体
化动态UI,可以采用以下步骤:
1. 创建一个Windows
窗体
应用程序,打开
Visual
Studio
并选择“新建项目”,选择“Windows
窗体
应用程序”。
2. 在
窗体
上添加控件,例如文本框、
按钮
和标签,并设置其属性。
3. 为
窗体
和控件添加事件处理程序,例如单击
按钮
时执行的代码。
4. 创建动态UI的动画效果。可以使用.NET框架中的System.Drawing和System.Windows.Forms命名空间提供的类来实现。
5. 在
窗体
加载时启动动画效果,并在需要时停止动画效果。
6. 调整UI控件的布局和样式,以使其符合预期的设计要求。
7. 最后,运行应用程序并测试动态UI的效果。
下面是一个简单的例子,演示了如何实现一个动态图标的动画效果:
```csharp
using System.Drawing;
using System.Windows.Forms;
namespace DynamicUIExample
public partial class MainForm : Form
private Timer timer;
private int angle = 0;
public MainForm()
InitializeComponent();
timer = new Timer();
timer.Interval = 100;
timer.Tick += Timer_Tick;
private void Timer_Tick(object sender, System.EventArgs e)
angle += 10;
pictureBox1.Image = RotateImage(Properties.Resources.icon, angle);
private Image RotateImage(Image image, float angle)
Bitmap rotatedImage = new Bitmap(image.Width, image.Height);
rotatedImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);
Graphics graphics = Graphics.FromImage(rotatedImage);
graphics.TranslateTransform(image.Width / 2, image.Height / 2);
graphics.RotateTransform(angle);
graphics.TranslateTransform(-image.Width / 2, -image.Height / 2);
graphics.DrawImage(image, new Point(0, 0));
return rotatedImage;
private void MainForm_Load(object sender, System.EventArgs e)
timer.Start();
private void btnStop_Click(object sender, System.EventArgs e)
timer.Stop();
private void btnStart_Click(object sender, System.EventArgs e)
timer.Start();
在上面的代码中,我们创建了一个Windows
窗体
应用程序,添加了一个PictureBox控件和两个
按钮
。在
窗体
加载时,我们启动了一个计时器,定期更新图标的旋转角度,并使用RotateImage方法来旋转实际的图标。当单击“停止”
按钮
时,我们停止计时器。当单击“开始”
按钮
时,我们重新启动计时器。
RealTimePlot = new QCustomPlot;
RealTimeLay = new QVBoxLayout;
RealTimer = new QTimer(this);
RTBtn = new QPushButton("Button");
connect(RTBtn, SIGNAL(clicked()), this, SLOT(on_RTBtn()));
connect(RealTimer, SIGNAL(timeout()), this, SLOT(RealTimeout()));
RealTimeLay->addWidget(RTBtn);
RealTimeLay->addWidget(RealTimePlot);
ui->tab->setLayout(RealTimeLay);
LoadRealTimeChart();
RealTimer->start(50);
void Widget::RealTimeout()
static int i = 0;
double xData, yData;
xData = i;
yData = 5 * cos(i);
if(i >= 100)
RealTimePlot->xAxis->setRange(i - 100, i);
RealTimePlot->graph(0)->addData(xData, yData);
RealTimePlot->replot();
qDebug() << QDateTime::currentDateTime().toString("yyyy-mm-dd hh:mm:ss.zzz");
[/code]
Qt使用QCustomPlot绘制实时曲线
初896:
Qt使用QCustomPlot绘制实时曲线
ALONE_WORK:
Qt使用QCustomPlot绘制实时曲线
初896: