用C#做一个像FlashGet的悬浮窗口,其实很简单,不像以前需要调用很多系统API。大致的步骤如下。

首先是主窗体部分,即要判断窗体的状态来决定是否显示悬浮窗口。

局部成员声明:

private FormWindowState fwsPrevious;

private frmTopMost myTopMost;

主窗体的Load事件:

private void frmMain_Load(object sender, System.EventArgs e)

{

// Save window state

fwsPrevious = this.WindowState;

// Create top most window

myTopMost = new frmTopMost( this );

}

主窗体的SizeChanged事件:

private void frmMain_SizeChanged(object sender, System.EventArgs e)

{

if( this.WindowState == FormWindowState.Minimized )

{

// Window minimized

// Show top most window

myTopMost.Show();

this.ShowInTaskbar = false;

}

else if( this.WindowState != fwsPrevious )

{

// Save current window state

fwsPrevious = this.WindowState;

}

}

然后,就是还原窗口方法,即供悬浮窗口进行调用的。

/// <summary>

/// Restore window state

/// </summary>

public void RestoreWindow()

{

this.WindowState = fwsPrevious;

this.ShowInTaskbar = true;

}

下来就是悬浮窗口部分代码,首先要设置其窗体的FormBorderStyle为None,然后设置其的TopMost为true,接下来,就是主要是三个鼠标事件的处理,以下,具体说明如何实现的。

局部成员声明。

private Point ptMouseCurrrnetPos, ptMouseNewPos,

ptFormPos, ptFormNewPos;

private bool blnMouseDown=false;

private frmMain pParent;

悬浮窗口的构造函数。

public frmTopMost( frmMain pMain )

{

//

// Required for Windows Form Designer support

//

InitializeComponent();

// Init main window object

pParent = pMain;

}

悬浮窗口的Load事件。

private void frmTopMost_Load(object sender, System.EventArgs e)

{

this.Show();

// Init window size and position

this.Top = 100;

this.Left = Screen.PrimaryScreen.Bounds.Width - 100;

this.Width = 80;

this.Height = 80;

}

主要的三个鼠标事件,即MouseDown、 MouseMove、 MouseUp三个事件。

private void frmTopMost_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)

{

if( blnMouseDown )

{

//Get the current position of the mouse in the screen

ptMouseNewPos = Control.MousePosition;

//Set window position

ptFormNewPos.X = ptMouseNewPos.X - ptMouseCurrrnetPos.X + ptFormPos.X;

ptFormNewPos.Y = ptMouseNewPos.Y - ptMouseCurrrnetPos.Y + ptFormPos.Y;

//Save window position

Location = ptFormNewPos;

ptFormPos = ptFormNewPos;

//Save mouse position

ptMouseCurrrnetPos = ptMouseNewPos;

}

}

private void frmTopMost_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)

{

if(e.Button==MouseButtons.Left)

{

blnMouseDown = true;

// Save window position and mouse position

ptMouseCurrrnetPos = Control.MousePosition;

ptFormPos = Location;

}

}

private void frmTopMost_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)

{

if( e.Button == MouseButtons.Left)

//Return back signal

blnMouseDown = false;

}

然后就是双击悬浮窗体,进行恢复主窗体。

private void frmTopMost_DoubleClick(object sender, System.EventArgs e)

{

SwitchToMain();

}

private void SwitchToMain()

{

//Change main window status here

pParent.RestoreWindow();

//Hide top most window

this.Hide();

}

此外,还可以给悬浮窗口添加ContextMenu,来辅助操作,这里就不细说了。

private System.Windows.Forms.ContextMenu mnuPopup;

private System.Windows.Forms.MenuItem mnuMainWindow;

private System.Windows.Forms.MenuItem mnuExit;

private void mnuMainWindow_Click(object sender, System.EventArgs e)

{

SwitchToMain();

}

private void mnuExit_Click(object sender, System.EventArgs e)

{

Application.Exit();

}

如何用C#做一个悬浮窗口程序的更多相关文章

  1. fir.im Weekly - 如何做一个出色的程序员

    做一个出色的程序员,困难而高尚.本期 fir.im Weekly 精选了一些实用的 iOS,Android 开发工具和源码分享,还有一些关于程序员的成长 Tips 和有意思有质量的线下活动~ How ...

  2. 【CSS】如何用css做一个爱心

    摘要:HTML的标签都比较简单,入门非常的迅速,但是CSS是一个需要我们深度挖掘的东西,里面的很多样式属性掌握几个常用的便可以实现很好看的效果,下面我便教大家如何用CSS做一个爱心. 前期预备知识: ...

  3. 做一个懒COCOS2D-X程序猿(一)停止手打所有cpp文件到android.mk

    前言:”懒”在这里当然不是贬义词,而是追求高效,拒绝重复劳动的代名词!做一个懒COCOS2D-X程序猿的系列文章将教会大家在工作中如何偷懒,文章篇幅大多较短,有的甚至只是几行代码,争取把懒发挥到极致! ...

  4. 如何用css做一个爱心

    摘要:HTML的标签都比较简单,入门非常的迅速,但是CSS是一个需要我们深度挖掘的东西,里面的很多样式属性掌握几个常用的便可以实现很好看的效果,下面我便教大家如何用CSS做一个爱心. 前期预备知识: ...

  5. NetAnalyzer笔记 之 三. 用C++做一个抓包程序

    [创建时间:2015-08-27 22:15:17] NetAnalyzer下载地址 经过前两篇的瞎扯,你是不是已经厌倦了呢,那么这篇让我们来点有意思的吧,什么,用C#.不,这篇我们先来C++的 Wi ...

  6. Micropython 如何用Turnipbit做一个自动浇水装置

    最近在研究Turnipbit这块板子,打算是连接一个摄像头模块,正在实验练习中,(祝自己早日弄好)上篇文章我们讲了用Turnipbit连接LCD5110显示英文词句,前几天给家里花浇水的时候发现花招了 ...

  7. 用pyqt5做一个能python程序能插入图片的ide

    之前只是放到github上了,现在一想应该开源,大家想继续做好这个ide的都能从这里起步. #注意在.py文件相同目录下放一个1.png做测试图片 #本质就是用html来实现图片 #写在前面的话:这个 ...

  8. 我的第一个 Windows 窗口程序(1)

    一般来说,构建一个 Windows 程序可以分为如下几个步骤: 定义窗口类(WNDCLASS) 注册窗口类(RegisterClass) 创建窗口(CreateWindow) 更新显示窗口(Updat ...

  9. 使用python做一个爬虫GUI程序

    整体思路和之前的一篇博客爬虫豆瓣美女一致,这次加入了图片分类,同时利用tkinter模块做成GUI程序 效果如下: 整体代码如下: # -*- coding:utf-8 -*- import requ ...

随机推荐

  1. 1036: [ZJOI2008]树的统计Count (树链剖分)

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3401  Solved: 1418[Submit] ...

  2. HF Reader

  3. Android学习笔记(三)之带有侧边索引的快速查找(跟带字母索引查找的通讯录差不多)

    喜欢另辟蹊径的我,在这里废话不多说了,直接上代码和图片了. 效果图如下: 第一步:MainActivity的代码如下: package net.loonggg.test; import java.ut ...

  4. shell之if简化语句

    最常用的简化if语句: && 如果是“前面”,则“后面” [ -f /var/run/dhcpd.pid ] && rm /var/run/dhcpd.pid 检查 文 ...

  5. 狗日的rem

    rem这是个低调的css单位,近一两年开始崭露头角,有许多同学对rem的评价不一,有的在尝试使用,有的在使用过程中遇到坑就弃用了.但是我对rem综合评价是用来做web app它绝对是最合适的人选之一. ...

  6. spring boot配置springMVC拦截器

    spring boot通过配置springMVC拦截器 配置拦截器比较简单, spring boot配置拦截器, 重写preHandle方法. 1.配置拦截器: 2重写方法 这样就实现了拦截器. 其中 ...

  7. mysql知识点(三)

    1.表关联是可以利用两个表的索引的,如果是用子查询,至少第二次查询是没有办法使用索引的. 2.  为了给主查询提供数据而首先执行的查询被叫做子查询 3.如果WHERE子句的查询条件里使用了函数(WHE ...

  8. End of Life check fails with NullPointerException

    Checks if the running version of JIRA is approaching, or has reached End of Life. Details Type: Bug ...

  9. 两步改动CentOS主机名称

    在CentOS系统中,改动主机名称的过程例如以下: 1. 改动network文件 编辑network文件.配置例如以下: vi /etc/sysconfig/network 配置 NETWORKING ...

  10. Android学习进阶和IoC

    1.成为Android高手一般分为六个阶段: 第一阶段:熟练掌握Java SE,尤其是对其内部类.线程.并发.网络编程等需要深入研究:熟练掌握基于HTTP协议的编程,清楚POST和GET等请求方式流程 ...