设计类似MessageBox遇到的问题

鏡椛氹鈅 2015-12-23 05:55:25
在项目中需要自己设计类似于微软的MessageBox,整体已完成,但遇到以下几个问题:
1---当用户单击显示桌面在点击程序,消息窗体并不显示到主窗体前面,如下图:

该怎么解决...


2---用如下代码

public static MsgBoxResult Show(string msg, string title)
{
MainWindow msgBox =null ;
msgBox = new MainWindow();
msgBox.Title = title;
msgBox.Message = msg;
msgBox.ShowDialog();
return msgBox.BoxResult;
}

会导致任务管理器出现消息窗体的进程,如下图

怎么可以让消息窗体不出现在进程中

3---微软的MessageBox可以根据输入的信息动态改变消息窗体的大小,其实现原理是什么?
本人能力有限看不懂微软的源码,望大神给予解答
微软MessageBox的源码
...全文
271 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Poopaye 2015-12-24
  • 打赏
  • 举报
回复
我还是不懂你说的子窗体是什么,mdi? 我这样写的 Form1
namespace WindowsFormsApplication1
{
	public partial class Form1 : Form
	{
		public Form1()
		{
			InitializeComponent();
		}

		private void button1_Click(object sender, EventArgs e)
		{
			Form2.Show("", "");
		}
	}
}
Form2
namespace WindowsFormsApplication1
{
	public partial class Form2 : Form
	{
		public Form2()
		{
			InitializeComponent();
		}

		public static void Show(string msg, string title)
		{
			Form2 msgBox = null;
			msgBox = new Form2();
			msgBox.ShowDialog();
		}
	}
}
鏡椛氹鈅 2015-12-24
  • 打赏
  • 举报
回复
引用 8 楼 shingoscar 的回复:
什么叫做在子窗体内进行ShowDialog?
public static MsgBoxResult Show(string msg, string title) { MainWindow msgBox =null ; msgBox = new MainWindow(); msgBox.Title = title; msgBox.Message = msg; msgBox.ShowDialog(); return msgBox.BoxResult; } 这段代码是放在子窗体执行的, 主窗体只是调用Show这个函数...
Poopaye 2015-12-24
  • 打赏
  • 举报
回复
一样啊,还是不会跑到后面去
鏡椛氹鈅 2015-12-24
  • 打赏
  • 举报
回复
引用 12 楼 shingoscar 的回复:
https://img-bbs.csdn.net/upload/201512/24/1450937617_781762.jpg 你自己试试 另存为,改扩展名exe
WindowStyle="None" 把窗体边框去掉,在试试...
Poopaye 2015-12-24
  • 打赏
  • 举报
回复
https://img-bbs.csdn.net/upload/201512/24/1450937617_781762.jpg
你自己试试
另存为,改扩展名exe
鏡椛氹鈅 2015-12-24
  • 打赏
  • 举报
回复
引用 10 楼 shingoscar 的回复:
我还是不懂你说的子窗体是什么,mdi? 我这样写的 Form1
namespace WindowsFormsApplication1
{
	public partial class Form1 : Form
	{
		public Form1()
		{
			InitializeComponent();
		}

		private void button1_Click(object sender, EventArgs e)
		{
			Form2.Show("", "");
		}
	}
}
Form2
namespace WindowsFormsApplication1
{
	public partial class Form2 : Form
	{
		public Form2()
		{
			InitializeComponent();
		}

		public static void Show(string msg, string title)
		{
			Form2 msgBox = null;
			msgBox = new Form2();
			msgBox.ShowDialog();
		}
	}
}
你这样写From2不会跑到From1后面吗
Poopaye 2015-12-23
  • 打赏
  • 举报
回复
什么叫做在子窗体内进行ShowDialog?
鏡椛氹鈅 2015-12-23
  • 打赏
  • 举报
回复
引用 6 楼 shingoscar 的回复:
1. 原因不详,我自己试了下ShowDialog,死活都不会跑后面去 2. 窗体属性里ShowInTaskbar设为false即可 3. 你也可以根据输入内容来改变窗体大小啊,比如你设置label的Text,那它的size就会变化,然后。。。
1---你的代码一定是在主程序内进行ShowDialog而不是和我一样在子窗体内进行ShowDialog 2---我的ShowInTaskbar已经设置过了,仔细看下任务栏,没有出现在任务栏,但是会出现在任务管理器 3---具体的呢,窗体的大小会限制label,你不会告诉我通过label的大小来设置窗体的大小吧...
Poopaye 2015-12-23
  • 打赏
  • 举报
回复
1. 原因不详,我自己试了下ShowDialog,死活都不会跑后面去 2. 窗体属性里ShowInTaskbar设为false即可 3. 你也可以根据输入内容来改变窗体大小啊,比如你设置label的Text,那它的size就会变化,然后。。。
鏡椛氹鈅 2015-12-23
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
例如,你可以写
public static class abc
{
    public static void RegisterMessageBox(Form f)
    {
        f.Activated += (s, e) =>
        {
            MyMsgBox msg = GetMessageBoxWindow();
            if (msg != null && msg.正在显示)
            {
                msg.Focus();
            }
        };
    }

......................
}
}
然后在其它所有窗体的 Form_Load 方法中都调用它一次。
剩下的两个问题能给指点下吗?
鏡椛氹鈅 2015-12-23
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
例如,你可以写
public static class abc
{
public static void RegisterMessageBox(Form f)
{
f.Activated += (s, e) =>
{
MyMsgBox msg = GetMessageBoxWindow();
if (msg != null && msg.正在显示)
{
msg.Focus();
}
};
}

......................
}
}


然后在其它所有窗体的 Form_Load 方法中都调用它一次。

我明白你的意思,但实际上窗体没办法获取焦点

我用过窗体自带的LostFocus事件,用过API SetFoucs,拦截过上图的消息进行This.Foucs都不行,不过我刚刚把问题解决了
是通过SPy++看了下消息传递的情况,我拦截了WM_ACTIVATEAPP这个消息然后就达到了我要的效果
马少华 2015-12-23
  • 打赏
  • 举报
回复
1,showinco,showtaskbar都设成false就行了。 2,看不到实现,低层调用的Win32Api函数,SafeNativeMethods.MessageBox(new HandleRef(owner, handle), text, caption, style) 3,先测试要显示的文字宽度,再创建窗口。
  • 打赏
  • 举报
回复
例如,你可以写
public static class abc
{
    public static void RegisterMessageBox(Form f)
    {
        f.Activated += (s, e) =>
        {
            MyMsgBox msg = GetMessageBoxWindow();
            if (msg != null && msg.正在显示)
            {
                msg.Focus();
            }
        };
    }

......................
}
}
然后在其它所有窗体的 Form_Load 方法中都调用它一次。
  • 打赏
  • 举报
回复
你可以捕获窗体的“激活”事件,此时如果消息窗体应该显示,那么将焦点设置到消息窗体上。而且这可以是你所有窗体(除了消息窗体)的通用的行为,可以写为自己的一个公共static方法库中的通用方法。
内容概要:本文档系统讲解了创意版烟花的完整实现路径,从粒子系统原理出发,深入剖析烟花效果的五大核心阶段——上升、爆炸、扩散、衰减与拖尾,并基于四种技术栈(HTML5 Canvas、Three.js、Python Pygame、AI音乐节拍同步)提供可运行的完整代码方案。文档涵盖基础实现、视觉增强(形状变化、闪烁、二次爆炸)、交互升级(鼠标拖动、手势控制)、性能优化(对象池、渲染优化)、部署上线(GitHub Pages、Vercel)及创意拓展(文字烟花、数据可视化、协同互动),形成“原理→编码→调优→部署→创新”的闭环学习链路。同时融入Web Audio API节拍检测、滑动窗口动态阈值等实用算法,助力开发者打造兼具美观性与技术深度的动态视觉作品。; 适合人群:具备基础编程能力的前端开发者、Python爱好者、多媒体交互设计人员,以及希望提升图形编程与动效设计能力的工作1-3年研发人员;也适用于教学演示、作品集建设或创意项目原型开发。; 使用场景及目标:①掌握粒子系统在动画与游戏开发中的底层实现机制;②实现网页端与桌面端的高性能烟花特效;③构建音乐可视化、数据艺术、互动装置等融合型项目;④学习从代码实现到线上部署的全流程工程实践。; 阅读建议:建议按照“Canvas基础→进阶优化→3D/Pygame/AI扩展”的路径逐步实践,重点关注参数调优表与性能优化策略,在调试中理解每行代码的作用;对于音乐同步等复杂功能,可先运行成功案例再深入算法逻辑,结合实际项目需求灵活组合各项技术模块。

111,129

社区成员

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

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

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