如何:使 comboBox 输入状态变成 readonly 方式;TextBox 只读时的效果 (转载)
2011-12-19 21:58
543 查看
桌面应用程序中的
comboBox 下拉框,输入方式;
分为3种状态
Simple 文本部分可编辑。列表部分总可见。
DropDown 文本部分可编辑。用户必须单击箭头按钮来显示列表部分。这是默认样式。
DropDownList 用户不能直接编辑文本部分。用户必须单击箭头按钮来显示列表部分。
却没有 readonly 状态;有些时候客户要copy 下拉框里的数据确实挺郁闷的,为啥没有?这个得问ms 了呵呵
不过 comboBox 其实是一个嵌套控件(复合控件)在 DropDownList 状态时;他由 下拉列表,和 comboBox 本身组成
DropDown 状态时 comboBox 中多了一个 edit 就是 .net 下的 TextBox 那个输入状态是由 edit 控制的;
不过这个 edit 是无法在 .net 下取得的 this.comboBox1.Controls.Count 返回 0;
既然知道原理了解决问题也就相对简单的(不用 Win API 看来是不行了)
现在我们需要知识
1) 如果取得子控件;这个有多种方法可以实现我们选择 GetWindow 这个 API 取xx窗口或控件下的第一个子控件比较方便也不用回调什么的;
比 EnumWindows API 容易用多了
2) 如何给 edit (TextBox) 设置只读状态;
这个就是发个消息基本可以搞定(不过忘记是那个消息了),看看 msdn 找 em_ 开头的消息,找到 EM_SETREADONLY 看名字就是他了;
根据 SDK 规则,em_ 开头的消息都是对应 edit 的;
打开代码编辑器,几行搞定;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
//using System.Runtime.InteropServices;
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetWindow(IntPtr hWnd, int uCmd);
int GW_CHILD = 5;
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
public const int EM_SETREADONLY = 0xcf;
public Form1()
{
InitializeComponent();
IntPtr editHandle = GetWindow(comboBox1.Handle , GW_CHILD);
SendMessage(editHandle,EM_SETREADONLY,1,0);
}
}
}
comboBox 下拉框,输入方式;
分为3种状态
Simple 文本部分可编辑。列表部分总可见。
DropDown 文本部分可编辑。用户必须单击箭头按钮来显示列表部分。这是默认样式。
DropDownList 用户不能直接编辑文本部分。用户必须单击箭头按钮来显示列表部分。
却没有 readonly 状态;有些时候客户要copy 下拉框里的数据确实挺郁闷的,为啥没有?这个得问ms 了呵呵
不过 comboBox 其实是一个嵌套控件(复合控件)在 DropDownList 状态时;他由 下拉列表,和 comboBox 本身组成
DropDown 状态时 comboBox 中多了一个 edit 就是 .net 下的 TextBox 那个输入状态是由 edit 控制的;
不过这个 edit 是无法在 .net 下取得的 this.comboBox1.Controls.Count 返回 0;
既然知道原理了解决问题也就相对简单的(不用 Win API 看来是不行了)
现在我们需要知识
1) 如果取得子控件;这个有多种方法可以实现我们选择 GetWindow 这个 API 取xx窗口或控件下的第一个子控件比较方便也不用回调什么的;
比 EnumWindows API 容易用多了
2) 如何给 edit (TextBox) 设置只读状态;
这个就是发个消息基本可以搞定(不过忘记是那个消息了),看看 msdn 找 em_ 开头的消息,找到 EM_SETREADONLY 看名字就是他了;
根据 SDK 规则,em_ 开头的消息都是对应 edit 的;
打开代码编辑器,几行搞定;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
//using System.Runtime.InteropServices;
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetWindow(IntPtr hWnd, int uCmd);
int GW_CHILD = 5;
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
public const int EM_SETREADONLY = 0xcf;
public Form1()
{
InitializeComponent();
IntPtr editHandle = GetWindow(comboBox1.Handle , GW_CHILD);
SendMessage(editHandle,EM_SETREADONLY,1,0);
}
}
}
相关文章推荐
- 如何:使 comboBox 输入状态变成 readonly 方式;TextBox 只读时的效果;
- 如何:使 comboBox 输入状态变成 readonly 方式;TextBox 只读时的效果;
- 如何:使 comboBox 输入状态变成 readonly 方式;TextBox 只读时的效果
- comboBox 输入状态变成 readonly 方式;TextBox 只读时的效果
- C#如何让TEXTBOX只能输入英文状态下的数字并且限制位数
- 如何去掉TextBox可输入状态时的光标
- (转载)在TextBox、ComboBox上实现水印效果(WinForms)
- WPF 实现ComboBox白底只读输入效果。
- easyui textbox combobox 设置只读不可编辑状态
- <转载>c#如何禁止Form窗口调整大小,如何禁止combobox输入?
- EditText如何设置滚动效果,字体满了继续输入可以滚动查看
- 【转载】const,readonly 常量与只读
- C#&nbsp;comboBox为可输入状态时用…
- Flash AS3.0教程:如何载入库中的影片剪辑将制作成动画效果 将影片剪辑变成类[转]
- 如何用foreach遍历页面上所有的TextBox(转载)
- vs2015 c#通过ComboBox选择查询类别并在TextBox输入条件进行查询
- Android---3种方式限制EditView输入字数(转载)
- 关于如何解决C++ Builder中DBLookupComboBox不能输入的问题:
- java ---- 给输入的字符数字 添加密码状态(变成“*”)
- 实现textbox对输入内容的自动检索功能,效果相当于百度首页的文本输入框