winform消息提示框

摘自:http://www.cnblogs.com/risen/archive/2008/01/15/1039751.html

public partial class AlertForm : Form
   
{
       
/*
         *
在类AlertForm定义的下方,
         *
我们创建用于显示的字符串和其颜色的变量,
         *
再定义几个Rectangle对象的变量用于放置标题、
         *
提示内容以及可以拖动窗体的区域和关闭按钮的区域。
         *
然后,我们需要保存窗体在浮动时的高度以便计算移动后的新高度,
        
*
intervalValue变量用来确定窗体显示和隐藏的速度。
        
*
进行平台调用时我们需要提前定义好常量的值用来传递给函数,
        
*
WM_NCLBUTTONDOWN和HT_CAPTION常量用于拖动窗体,
        
* 他们的值都保存在WinUser.h头文件中,
         *
所对应的动态链接库名为:user32.dll。
         *
我们用到的Win32API为:SendMessage、ReleaseCapture和ShowWindow,
        
*
通过使用DllImportAttribute可以导入相应的函数并在程序中重新进行定义,如下:
        
*/
        public Bitmap BackgroundBitmap
= null;

        private string
titleText;
        private string
contentText;
        private Color
normalTitleColor = Color.FromArgb(0, 0,
0);
        private Font normalTitleFont =
new Font("宋体", 12, FontStyle.Regular,
GraphicsUnit.Pixel);
        private Color
normalContentColor = Color.FromArgb(0, 0,
0);
        private Font normalContentFont
= new Font("宋体", 12, FontStyle.Regular,
GraphicsUnit.Pixel);

        public
Rectangle TitleRectangle;
        public
Rectangle TitlebarRectangle;
       
public Rectangle ContentRectangle;
       
public Rectangle
CloseBtnRectangle;

        private
Rectangle WorkAreaRectangle;

       
private int SavedTop;
        private int
currentTop = 1;
        private int
intervalValue = 2;

        public
const int WM_NCLBUTTONDOWN = 0x00A1; //消息:左键点击
winuser.h
        public const int
HT_CAPTION = 0x0002; //标题栏

       
[DllImportAttribute("user32.dll")]
       
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int
lParam); //发送消息 //winuser.h
中有函数原型定义
       
[DllImportAttribute("user32.dll")]
       
public static extern bool ReleaseCapture(); //释放鼠标捕捉
winuser.h
       
/*
         *
SendMessage向消息循环发送标题栏被按下的消息来模拟窗体的拖动,
        
* ShowWindow用来将特定句柄的窗体显示出来,
        
*
注意第二个参数nCmdShow,它表示窗体应该怎样显示出来,
        
* 而我们需要窗体不获得焦点显示出来,
         *
SW_SHOWNOACTIVATE可以满足我们要求,
         *
继续在WinUser.h文件中搜索找到该常量对应的值为4,
        
* 于是我们就可以这样调用来显示窗体了:
        
*/
       
[DllImportAttribute("user32.dll")]
//winuser.h
        private static extern
Boolean ShowWindow(IntPtr hWnd, Int32
nCmdShow);

        public int
CurrentState=0; //0=hide 1=uptoshow 2=showing
3=downtohide      
 

        private AlertForm()

       
{
           
InitializeComponent();
           
SetBackgroundBitmap(snnu.ccs.Properties.Resources.popup2, Color.FromArgb(255, 0,
255));
       
}
        public static void Show(string
ftitletext, string fcontenttext)
       
{
           
AlertForm alert = new
AlertForm();
           
alert.ShowForm(ftitletext,
fcontenttext);
       
}
       
/*
         *
当窗体需要升起时将窗体的Top属性值不断减少,
         *
而窗体回落时将Top属性值增加并超过屏幕的高度窗体就消失了,
        
* 虽然原理很简单但仍需精确控制。
         *
SetBackgroundBitmap函数首先将窗体背景图像保存到BackgroundBitmap变量中,
        
*
然后根据该位图图像轮廓和透明色创建Region,BitmapToRegion就用于完成Bitmap到Region的转换,
        
*
程序再将这个Region付值给窗体的Region属性以完成不规则窗体的创建。
        
*/
        protected void
SetBackgroundBitmap(Image image, Color
transparencyColor)
       
{
           
BackgroundBitmap = new
Bitmap(image);
           
Width =
BackgroundBitmap.Width;
           
Height =
BackgroundBitmap.Height;
           
TitleRectangle = new Rectangle(2, 1, 70,
25);
           
TitlebarRectangle = new Rectangle(1, 1, Width,
25);
           
ContentRectangle = new Rectangle(1, 25, Width, Height -
25);
           
CloseBtnRectangle = new Rectangle(Width - 25, 1, 25,
25);
           
Region = BitmapToRegion(BackgroundBitmap,
transparencyColor);
       
}

        protected Region
BitmapToRegion(Bitmap bitmap, Color
transparencyColor)
       
{
            if
(bitmap ==
null)
               
throw new ArgumentNullException("Bitmap", "Bitmap cannot be
null!");

           
int height =
bitmap.Height;
           
int width =
bitmap.Width;

           
GraphicsPath path = new
GraphicsPath();

           
for (int j = 0; j < height;
j++)
               
for (int i = 0; i < width;
i++)
               
{
                   
if (bitmap.GetPixel(i, j) ==
transparencyColor)
                       
continue;

                   
int x0 =
i;

                   
while ((i < width) && (bitmap.GetPixel(i, j) !=
transparencyColor))
                       
i++;

                   
path.AddRectangle(new Rectangle(x0, j, i - x0,
1));
               
}

           
Region region = new
Region(path);
           
path.Dispose();
           
return region;
       
}

        protected void
DrawText(Graphics grfx)
       
{
            if
(titleText != null && titleText.Length !=
0)
           
{
               
StringFormat sf = new
StringFormat();
               
sf.Alignment =
StringAlignment.Near;
               
sf.LineAlignment =
StringAlignment.Center;
               
sf.FormatFlags =
StringFormatFlags.NoWrap;
               
sf.Trimming =
StringTrimming.EllipsisCharacter;
               
grfx.DrawString(titleText, normalTitleFont, new SolidBrush(normalTitleColor),
TitleRectangle,
sf);
           
}

            if
(contentText != null && contentText.Length !=
0)
           
{
               
StringFormat sf = new
StringFormat();
               
sf.Alignment =
StringAlignment.Center;
               
sf.LineAlignment =
StringAlignment.Center;
               
sf.FormatFlags =
StringFormatFlags.MeasureTrailingSpaces;
               
sf.Trimming = StringTrimming.Word;  
 
               
grfx.DrawString(contentText, normalContentFont, new
SolidBrush(normalContentColor), ContentRectangle,
sf);
           
}
       
}
       
/*
         *
通知窗体背景以及文字的绘制在重载的OnPaintBackground方法中完成,
        
* 而且利用了双重缓冲区技术来进行绘制操作,代码如下:
        
*/
        protected override void
OnPaintBackground(PaintEventArgs
e)
       
{
            Graphics
grfx =
e.Graphics;
           
grfx.PageUnit =
GraphicsUnit.Pixel;

           
Graphics
offScreenGraphics;
           
Bitmap
offscreenBitmap;

           
offscreenBitmap = new Bitmap(BackgroundBitmap.Width,
BackgroundBitmap.Height);
           
offScreenGraphics =
Graphics.FromImage(offscreenBitmap);

           
if (BackgroundBitmap !=
null)
           
{
               
offScreenGraphics.DrawImage(BackgroundBitmap, 0, 0, BackgroundBitmap.Width,
BackgroundBitmap.Height);
           
}

           
DrawText(offScreenGraphics);

           
grfx.DrawImage(offscreenBitmap, 0,
0);
       
}
       
/*
         *
CurrentState变量表示窗体的状态是显示中、停留中还是隐藏中,
        
* 两个计时器根据窗体不同状态对窗体的位置进行更改,
         *
我们会使用SetBounds来执行该操作:
         *
this.SetBounds(WorkAreaRectangle.Width - this.Width, WorkAreaRectangle.Height -
currentTop, this.Width,
this.Height);
        
*/
        protected void ShowForm(string
ftitletext, string fcontenttext)
       
{
           
titleText =
ftitletext;
           
contentText =
fcontenttext;
           
WorkAreaRectangle =
Screen.GetWorkingArea(WorkAreaRectangle);
           
this.Top = WorkAreaRectangle.Height +
this.Height;
           
FormBorderStyle =
FormBorderStyle.None;
           
WindowState =
FormWindowState.Normal;
           
this.SetBounds(WorkAreaRectangle.Width - this.Width, WorkAreaRectangle.Height -
currentTop, this.Width,
this.Height);
           
CurrentState =
1;
           
timer1.Enabled =
true;

           
ShowWindow(this.Handle, 4); //#define SW_SHOWNOACTIVATE  
4
       
}

        private void
timer1_Tick(object sender, EventArgs
e)
       
{
            if
(CurrentState == 1)

           
{
               
this.SetBounds(WorkAreaRectangle.Width - this.Width, WorkAreaRectangle.Height -
currentTop, this.Width,
this.Height);
               
currentTop = currentTop +
intervalValue;
               
if (this.Top <= WorkAreaRectangle.Height -
this.Height)
               
{
                   
timer1.Enabled =
false;
                   
CurrentState =
2;
                   
timer2.Enabled = true;
//显示停留计时
                   
currentTop =
1;
               
}
           
}
            else if
(CurrentState==3)

           
{
               
this.SetBounds(WorkAreaRectangle.Width - this.Width, SavedTop + currentTop,
this.Width,
this.Height);
               
currentTop = currentTop +
intervalValue;
               
if (this.Top >=
WorkAreaRectangle.Height)
               
{
                   
timer1.Enabled =
false;

                   
this.Close();
                   
CurrentState =
0;
                   
currentTop =
1;
               
}
           
}
       
}
       
/*
        
上述代码首先返回窗体绘制表面的Graphics并保存在变量grfx中,
        
*
然后创建一个内存Graphics对象offScreenGraphics和内存位图对象offscreenBitmap,
        
*
将内存位图对象的引用付值给offScreenGraphics,
        
*
这样所有对offScreenGraphics的绘制操作也都同时作用于offscreenBitmap,
        
*
这时就将需要绘制到通知窗体表面的背景图像BackgroundBitmap绘制到内存的Graphics对象上,
        
*
DrawText函数根据需要显示文字的大小和范围调用Graphics.DrawString将文字显示在窗体的特定区域。
        
*
最后,调用Graphics.DrawImage将内存中已经绘制完成的图像显示到通知窗体表面。
        
* 我们还需要捕获窗体的鼠标操作,有三个操作在这里进行,
        
* 1、处理拖动窗体操作,
         *
2、处理通知窗体的关闭操作,
         *
3、内容区域的单击操作。
         *
三个操作都需要检测鼠标的当前位置与每个Rectangle区域的包含关系,
        
* 只要单击落在特定区域我们就进行相应的处理,代码如下
        
*/
        private void
TaskbarForm_MouseDown(object sender, MouseEventArgs
e)
       
{
            if
(e.Button ==
MouseButtons.Left)
           
{
               
if (TitlebarRectangle.Contains(e.Location))
//单击标题栏时拖动
               
{
                   
ReleaseCapture();
//释放鼠标捕捉
                   
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
//发送左键点击的消息至该窗体(标题栏)
               
}
               
if (CloseBtnRectangle.Contains(e.Location))
//单击Close按钮关闭
               
{
                   
this.Close();
                   
currentTop =
1;
               
}
           
}
       
}

        private void
timer2_Tick(object sender, EventArgs
e)
       
{
           
timer2.Enabled =
false;
           
CurrentState =
1;
           
currentTop =
1;
           
SavedTop =
this.Top;
           
CurrentState =
3;
           
timer1.Enabled = true;
       
}

        private void
TaskbarForm_MouseMove(object sender, MouseEventArgs
e)
       
{
            if
(ContentRectangle.Contains(e.Location))
           
{
               
Cursor =
Cursors.Hand;
           
}
           
else
               
Cursor = Cursors.Default;
       
}
    }

winform消息提示框,布布扣,bubuko.com

时间: 05-12

winform消息提示框的相关文章

UWP中的消息提示框(一)

不管什么平台,应用内难免会出现一些消息提示框,下面就来聊聊我在UWP里用到的消息提示框. 弹窗也可按是否需要用户操作促发一些逻辑进行分为两大类. 不需要用户干涉的一类: MessageDialog:操作简单,写起来也省事,想具体了解的请参考MSDN 先看看效果 PC上效果: mobile上效果: 再看看代码(●'?'●) 前台: <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" >

CSS+jQuery实现可关闭的智能定位的浮动消息提示框

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>CSS+jQuery实现可关闭的智能定位的

从仿QQ消息提示框来谈弹出式对话框

<代码里的世界> -UI篇 用文字札记描绘自己 android学习之路 转载请保留出处 by Qiao http://blog.csdn.net/qiaoidea/article/details/45896477 [导航] - 自定义弹出式对话框的简单用法 列举各种常见的对话框实现方案 1.概述 android原生控件向来以丑著称(新推出的Material Design当另说),因此几乎所有的应用都会特殊定制自己的UI样式.而其中弹出式提示框的定制尤为常见,本篇我们将从模仿QQ退出提示框来看一

自定义iOS 中推送消息 提示框

看到标题你可能会觉得奇怪 推送消息提示框不是系统自己弹出来的吗? 为什么还要自己自定义呢? 因为项目需求是这样的:最近需要做一个客服系统 包括店铺客服和官方客服两个模块 如果用户当前不在客服界面的时候 要求无论是在app前台 还是app退到后台 顶部都要弹出系统的那种消息提示框 这样的需求 我们就只能自定义一个在app内 弹出消息提示框 实现步骤如下: 1.我们自定义一个view 为 STPushView 推送消息的提示框view

Android:Toast简单消息提示框

Toast是简单的消息提示框,一定时间后自动消失,没有焦点. 1.简单文本提示的方法: //参数1:当前的上下文环境.this或getApplicationContext() //参数2:提示内容 //参数3:显示的时间长短 Toast toast = Toast.makeText(this, "默认的toast", Toast.LENGTH_LONG); toast.show(); 2.自定义位置的方法: Toast toast = Toast.makeText(this, &quo

Android消息提示框Toast

Toast是Android中一种简易的消息提示框.和Dialog不一样的是,Toast是没有焦点的,toast提示框不能被用户点击,而且Toast显示的时间有限,toast会根据用户设置的显示时间后自动消失. 创建Toast的方法总共有2种: 1.Toast.makeText(Context context, (CharSequence text)/( int resId), int duration) 参数:context是指上下文对象,通常是当前的Activity,text是指自己写的消息内

用PHP实现弹出消息提示框

方法一: echo "<script>alert('提示内容')</script>"; 方法二: echo '<script language="JavaScript">;alert("这是";location.href="http://www.jinyuanbao.cn";</script>;'; 里面的location.href="index.htm"表示

关于安卓开发通过Toast显示消息提示框

Toast用于在屏幕中显示一个提示信息栏,该消息栏没有任何控制按钮,并且不会获得焦点,经过一定时间后自动消失. 作用:用于显示一些快速提示信息 有两种方式可以显示提示信息框 一: 调用Toast类的make Text()方法创建一个名称为toast(自定义)的Toast对象 关键代码 1 Toast toast = Toast.makeText(this, "要显示的内容", Toast.LENGTH_LONG).show(); 二: 通过Toast类的构造方法创建一个消息提示框 关键

(RPA学习)使用多线程点击 VBA 运行中的消息提示框

艺赛旗RPA全面免费下载中点击下载http://www.i-search.com.cn/index.html?from=line27 业务场景使用 win32com 运行 Excel 中的宏运算(VBA),会遇到 VBA 运行的最后一步会弹出消息提示框,需点击这个消息提示框之后,VBA 才能运行结束,所以在运行 VBA 之后加入 Try 组件去点击时无法点击的,所以考虑使用多线程来实现. 流程代码import ubpa.iautomation as iautomationimport threa