winform 不规则显示

herttfly 2009-12-03 11:12:20
做一个项目,有部分功能要实现点击一个地图上的某一个镇的区域就弹出一个窗体显示这个镇的一些信息。

地图(就是整个大窗体)的大小是可以改变的,可以拖大、拖小或是最大化之类;还有就是弹出的窗体不是矩形的,是不规则的的图形;还有就是大窗体的右上角放一个小的显示区域,也是个不规则的形状。

请问这样能实现么 , 用什么技术做比较好点? 希望高手帮帮忙!多谢了!!

效果如图:
...全文
300 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
wufeiwu7424609 2010-03-25
  • 打赏
  • 举报
回复
只是路过
ITJaneLiu 2009-12-04
  • 打赏
  • 举报
回复
这要用GDI+了.
wartim 2009-12-04
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 herttfly 的回复:]
    嗯  现在把那个地图的大小固定了 , 好做多了  , 现在就是在弹出信息窗的时候弄出点半透明、渐显之类的效果, 各位多多帮忙  多谢了          做完了就散分。
[/Quote]

鼠标移动到按钮区域就显示提示


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.Threading;

namespace WindowsApplication194
{
public partial class Form1 : Form, IMessageFilter
{
Button B = new Button();
PictureBox PB = new PictureBox();
Form F = new Form();
GraphicsPath GP = new GraphicsPath();

public Form1()
{
InitializeComponent();

Application.AddMessageFilter(this);

B.Parent = this;

GP.AddEllipse(0, 0, 80, 40);
GP.AddEllipse(20, 45, 40, 15);
GP.AddEllipse(25, 70, 20, 10);

F.Opacity = 0;
F.FormBorderStyle = FormBorderStyle.None;
F.Size = new Size(100, 100);
F.Region = new Region(GP);
F.TopMost = true;
DoDraw(String.Empty);
F.Show();

PB.Parent = F;
PB.Dock = DockStyle.Fill;
}

public bool PreFilterMessage(ref Message m)
{
int WM_MOUSEMOVE = 0x200;

if (m.Msg == WM_MOUSEMOVE)
{
if (B.Bounds.Contains(this.PointToClient(Control.MousePosition)))
{
F.Location = Point.Add(Control.MousePosition, new Size(-25, -F.Height));
F.Show();
new Thread(new ParameterizedThreadStart(ShowFormThread)).Start("ABC");
this.Focus();
}
else
{
F.Opacity = 0;
F.Hide();
}
}
return false;
}

void ShowFormThread(Object Obj)
{
try
{
String Text = Obj.ToString();
int StartTick = Environment.TickCount;

this.Invoke(new Draw(DoDraw), new Object[] { Text });

while ((double)this.Invoke(new GetOpacity(DoGetOpacity)) < 0.8)
if (Environment.TickCount - StartTick > 200)
{
this.Invoke(new IncOpacity(DoIncOpacity));

StartTick = Environment.TickCount;
}
}
catch
{
// 忽略程序退出的异常
}
}

delegate double GetOpacity();
delegate void IncOpacity();
delegate void Draw(String Text);

double DoGetOpacity()
{
return F.Opacity;
}

void DoIncOpacity()
{
F.Opacity += 0.1;
}

void DoDraw(String Text)
{
Bitmap Bmp = new Bitmap(PB.ClientRectangle.Width, PB.ClientRectangle.Height);

using (Graphics G = Graphics.FromImage(Bmp))
{
SizeF SF = G.MeasureString(Text, F.Font);

G.Clear(Color.Yellow);
G.DrawPath(Pens.Black, GP);
G.DrawString(Text, F.Font, Brushes.Black, (80 - SF.Width) / 2, 10);
}
PB.Image = Bmp;
}
}
}
herttfly 2009-12-04
  • 打赏
  • 举报
回复
嗯 是了

hhc123 2009-12-04
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 herttfly 的回复:]
    嗯  现在把那个地图的大小固定了 , 好做多了  , 现在就是在弹出信息窗的时候弄出点半透明、渐显之类的效果, 各位多多帮忙  多谢了          做完了就散分。
[/Quote]
就是从透明度那下手啊,
herttfly 2009-12-04
  • 打赏
  • 举报
回复
嗯 现在把那个地图的大小固定了 , 好做多了 , 现在就是在弹出信息窗的时候弄出点半透明、渐显之类的效果, 各位多多帮忙 多谢了 做完了就散分。
mjp1234airen4385 2009-12-04
  • 打赏
  • 举报
回复
gdi+
把地图的无用区域做成透明的png格式图片。
加载的时候,自动会去掉的。
herttfly 2009-12-04
  • 打赏
  • 举报
回复
wartim 效果挺好 O(∩_∩)O~

多谢大家
夏脑 2009-12-03
  • 打赏
  • 举报
回复
用区域,
1.定义GraphicsPath
2、从上面定义Region
3、设置窗体的Region
mytimes_walker 2009-12-03
  • 打赏
  • 举报
回复
直接显示原图就好了,我想你的地图也是图片拼出来的吧
mytimes_walker 2009-12-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hitlcyu19 的回复:]
ajax
[/Quote]
WinForm能用Ajax,高!
cymandhxl 2009-12-03
  • 打赏
  • 举报
回复
把问题分解,然后逐个解决
1,图像缩放
2,不规则图型
3,点击后出现提示
网上代码很多的。
hitlcyu19 2009-12-03
  • 打赏
  • 举报
回复
ajax
biny101 2009-12-03
  • 打赏
  • 举报
回复
day day up
Justin-Liu 2009-12-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 herttfly 的回复:]
  高手帮帮忙呀......

  关于点击某一区域弹出窗体的问题,我是在那一区域上放了一个透明的Label,这样一来当大窗体也就是整个地图的位置改变了之后,放的Label位置就没法定了.  哪位兄台做过这方面的算法吗,或者这种功能有其他的办法实现吗  ?    麻烦给指点一下吧 , 不胜感激.
[/Quote]
把位置相对固定起来就好了吧?
shadow_2006 2009-12-03
  • 打赏
  • 举报
回复
gis吧,提示框用个窗体控件或什么,然后确定控件的location,然后再mapDrawn事件里动态改变框的位置,很简单的!
nixiang12 2009-12-03
  • 打赏
  • 举报
回复
旁观
herttfly 2009-12-03
  • 打赏
  • 举报
回复
那个区域怎么确定呀?
我现在是就是一整张图,怎么样才能区分的呀
hhc123 2009-12-03
  • 打赏
  • 举报
回复
Mouse_Click()
{

}
不就是判断Mouse的座标是否在那个区域上啊,
herttfly 2009-12-03
  • 打赏
  • 举报
回复
不是大窗体位置改变,是大小改变 上面说错了 ..
加载更多回复(6)

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧