如何:使 comboBox 输入状态变成 readonly 方式;TextBox 只读时的效果;

[转]http://www.cnblogs.com/flashelf/archive/2008/07/10/1240331.html

 

桌面应用程序中的
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 );
            
            
        }        
    }

    
}



好了结合我以前的一个blog
http://blog.csdn.net/FlashElf/archive/2004/10/31/161024.aspx

不但可以readonly 还可以限制输入;
打完收工;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值