0
点赞
收藏
分享

微信扫一扫

C# 迅雷,flash 悬浮窗体

RIOChing 2022-02-22 阅读 61


有时候用迅雷,flash那种悬浮窗做一些信息提示效果还是不错的,所以写一个简单的demo给大家,仅供参考。

实现了不规则窗体绘制,实现了不获取焦点,实现了总是显示在前面,实现了文本显示,实现拖拽功能。

注意:test.bmp是一个位图文件,背景色为(255,0,255)玫瑰红色,中间可以用其他颜色绘制要显示的窗体形状,例如我是用圆角矩形画了个黑色实体框,作为显示窗口。

代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.Runtime.InteropServices;

namespace TaskbarNotifierDemo
{
public partial class Form2 : Form
{
private Point mouseOffst;
private bool isMouseDown = false;
protected Rectangle WorkAreaRectangle;

[DllImport("user32.dll")]
private static extern Boolean ShowWindow(IntPtr hWnd, Int32 nCmdShow);

public Form2()
{
InitializeComponent();
}

public void ShowWithOutFocus()
{
WorkAreaRectangle = Screen.GetWorkingArea(WorkAreaRectangle);
Bitmap backgroundImage = new Bitmap("test.bmp");
Color transparencyColor = Color.FromArgb(255, 0, 255);
Width = backgroundImage.Width;
Height = backgroundImage.Height;
BackgroundImage = backgroundImage;
Region = BitmapToRegion(backgroundImage, transparencyColor);

//SetBounds(Region);

ShowWindow(this.Handle, 4);
}

private void MainForm_MouseDown(object sender, MouseEventArgs e)
{
int xOffset;
int yOffset;

if (e.Button == MouseButtons.Left)
{
xOffset = -e.X - SystemInformation.FrameBorderSize.Width;
yOffset = -e.Y - SystemInformation.CaptionHeight - SystemInformation.FrameBorderSize.Height;
mouseOffst = new Point(xOffset, yOffset);
isMouseDown = true;
}
}

private void MainForm_MouseLeave(object sender, EventArgs e)
{
}

public string strText = "aaaaaaaaaaaaaaaaaa";

private void MainForm_MouseMove(object sender, MouseEventArgs e)
{
if (isMouseDown)
{
Point mousePos = Control.MousePosition;
int a = Screen.PrimaryScreen.WorkingArea.Height;
int b = Screen.PrimaryScreen.Bounds.Height;

int c = Screen.PrimaryScreen.WorkingArea.Width;
int d = Screen.PrimaryScreen.Bounds.Width;

mousePos.Offset(mouseOffst.X+4, mouseOffst.Y+(b-a)/2);
Location = mousePos;
}
}

private void MainForm_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
isMouseDown = false;
}
}
private void Form2_Load(object sender, EventArgs e)
{

}

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;
}

private void Form2_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Near;
sf.LineAlignment = StringAlignment.Center;
sf.FormatFlags = StringFormatFlags.DirectionRightToLeft;
sf.Trimming = StringTrimming.EllipsisCharacter; // Added Rev 002

g.DrawString(strText, new Font("Arial",12,FontStyle.Bold,GraphicsUnit.Pixel), new SolidBrush(Color.White), new Rectangle(10,10,50,50),sf);
e.Graphics.DrawRectangle(Pens.White, Rectangle.Round(new Rectangle(10, 10, 50, 50)));

}
}
}



举报

相关推荐

0 条评论