Winform 中,我想按Ctr+W 显示一个提示框!

internetibm 2003-12-16 04:53:09
第1:Winform 中,我想按Ctr+W 显示一个提示框!


第2:我想在Text框中只能输入数字!


这段代码怎样写?
...全文
94 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
IceboundRock 2003-12-17
  • 打赏
  • 举报
回复
那个属性啊?
isaiahupas 2003-12-17
  • 打赏
  • 举报
回复
Q2:用NumbericUpDown控件啊!这个控件有一种style是和文本框长得一样的。
IceboundRock 2003-12-17
  • 打赏
  • 举报
回复
我也发现了这个问题,所以我改用override PreProcessMessage了
TeaBall 2003-12-17
  • 打赏
  • 举报
回复
mark
softbunny 2003-12-17
  • 打赏
  • 举报
回复
haiwangstar() 的办法好~ 我第一时间想到的也是窗体的KeyDown事件,怎么就没从菜单方面想想呢?多省事呀~~
KentYu 2003-12-17
  • 打赏
  • 举报
回复
TO :IceboundRock()
你实现IMessageFilter接口来完成第二个问题的方法不大行的通。它把整个application所有的非数字按键的消息都筛了,这样的话,其他的控件也不响应非数字按键了
KentYu 2003-12-17
  • 打赏
  • 举报
回复
mark
haiwangstar 2003-12-17
  • 打赏
  • 举报
回复
声明:昨晚1时,偶在自己的机器上调试,发现重载ProcessKeyPreview达不到要实现的效果,它并没有筛选消息,为什么呢?偶也没有多想。偶从前做过NOTEPAD的转到对话框,(源码不在手头上)其中的数字框正好同楼主的要求相同,要重载PreProcessMessage才行,随即给楼主发了消息。特此声明,以免误导大家。
simanh 2003-12-16
  • 打赏
  • 举报
回复
up
IceboundRock 2003-12-16
  • 打赏
  • 举报
回复
重要弄好了,重载PreProcessMessage
public class NumBox : System.Windows.Forms.TextBox
{
const int WM_KEYDOWN = 0x0100;
public NumBox()
{
}

public override bool PreProcessMessage(ref Message m)
{
if(m.Msg == WM_KEYDOWN)
{
int nInput = m.WParam.ToInt32();

if(!((nInput > 47 && nInput < 58) || (nInput > 36 && nInput < 41)))
{
return true;
}
}
return base.PreProcessMessage (ref m);
}
}
包括上下左右也可以处理了
IceboundRock 2003-12-16
  • 打赏
  • 举报
回复
楼上的方法不错:)我又找到一种,实现IMessageFilter接口来完成第二个问题的方法
public class NumBox : System.Windows.Forms.TextBox , IMessageFilter
{
const int WM_KEYDOWN = 0x0100;
public NumBox()
{
Application.AddMessageFilter(this);
}

~NumBox()
{

Application.RemoveMessageFilter(this);
}



public bool PreFilterMessage(ref Message m)
{
// TODO: 还要判断是不是移动光标的键
if(m.Msg == WM_KEYDOWN)
{
int nInput = m.WParam.ToInt32();
if(nInput < 48 || nInput > 57)
{
m.Msg = -1;
return true;
}
}
return false;
}
}
levinknight 2003-12-16
  • 打赏
  • 举报
回复
第一个问题:可以添一个菜单项,将来其快捷方式设为Ctrl + W ,然后设该菜单项Visable = false,这是比较简洁,方便的方法。

第二个问题:不用那么麻烦,重载ProcessKeyPreview函数即可,判断按下的是不是数字键,如果不是则返回true,表明你已处理了这个消息,剩下的交给C# 。很简洁的方法。
haiwangstar 2003-12-16
  • 打赏
  • 举报
回复

if(nInput < 48 || nInput > 57)
{
Text = strText;
}
else
{
strText = Text;
}

这段代码有错误,你没有把按键字符传递给文本框啊。



第一个问题:可以添一个菜单项,将来其快捷方式设为Ctrl + W ,然后设该菜单项Visable = false,这是比较简洁,方便的方法。

第二个问题:不用那么麻烦,重载ProcessKeyPreview函数即可,判断按下的是不是数字键,如果不是则返回true,表明你已处理了这个消息,剩下的交给C# 。很简洁的方法。
skywang0810 2003-12-16
  • 打赏
  • 举报
回复
up
haiwangstar 2003-12-16
  • 打赏
  • 举报
回复

if(nInput < 48 || nInput > 57)
{
Text = strText;
}
else
{
strText = Text;
}

这段代码有错误,你没有把按键字符传递给文本框啊。



第一个问题:可以添一个菜单项,将来其快捷方式设为Ctrl + W ,然后设该菜单项Visable = false,这是比较简洁,方便的方法。

第二个问题:不用那么麻烦,重载ProcessKeyPreview函数即可,判断按下的是不是数字键,如果不是则返回true,表明你已处理了这个消息,剩下的交给C# 。很简洁的方法。
IceboundRock 2003-12-16
  • 打赏
  • 举报
回复
这个是我继承得到的类,可是还有点bug,请大家指教
我override了TextBox的WndProc函数,但是第一个字母似乎总是处理不到
public class NumBox : System.Windows.Forms.TextBox
{
const int WM_KEYDOWN = 0x0100;
public NumBox()
{
//
// TODO: Add constructor logic here
//
strText = Text;
}
static string strText = null;
protected override void WndProc(ref System.Windows.Forms.Message m)
{
// TODO: Add NumBox.WndProc implementation
if(m.Msg == WM_KEYDOWN)
{

int nInput = m.WParam.ToInt32();
if(nInput < 48 || nInput > 57)
{
Text = strText;
}
else
{
strText = Text;
}
}
base.WndProc (ref m);
}
}
IceboundRock 2003-12-16
  • 打赏
  • 举报
回复
Ctrl+字母的keychar是从1-26,对应Ctrl+A--Ctrl+Z
IceboundRock 2003-12-16
  • 打赏
  • 举报
回复
第二个问题,你要继承TextBox,把KeyDown事件做一下处理,在输入显示之前判断输入的是否是数字。
internetibm 2003-12-16
  • 打赏
  • 举报
回复
private void FrmMain_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
if (e.KeyCode==Keys.W && e.Control==true)
{
MessageBox.Show("按下两个");
}

}
这样没反应!
IceboundRock 2003-12-16
  • 打赏
  • 举报
回复
处理keypress,e.keychar == (char)23这种情况对应了Ctrl+W
加载更多回复(5)

110,566

社区成员

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

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

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