コンボボックスのReadOnly機能を達成するためのWinFormアプリケーション

ハァッ、バックアップ後に記録された、ソフトウェアの問題をやったときに今日が発生しました:

3つのプロパティDropDownStyle ComboBoxコントロールがあります。
1.SimpleのTextBox同様の外観、テキスト部分は、アイテムは、キーボードに依存している項目は、「↑」、「↓」が選択されている、テキストコントロールの値を表示することができ、編集することができます。
2.DropDownはコントロールが表示されますクリックし、「▼」を選択し、テキストコントロールの値を表示することができ、ドロップダウン選択ボックス内のアイテムの項目をテキスト部分を編集することができます。
3.DropDownListのテキスト部分を編集することができない、あなたがコントロールをクリックして選択しますによって、「▼」の項目項目の外観を選択するには、コントロールのテキスト値、ドロップダウンボックスを設定することはできません。

もともとドロップダウンが、同様のスタイルを使用念の開始時に、コントロールのテキスト値を設定することですが、ユーザがオプションを選択したとき、あなたは彼がコンテンツのオプションを編集できないことができ、そこにReadOnlyプロパティだろうと思っているだろう
し、それについての設定、私はしませんでした一つ一つがちょうど見つけることができない何回かそれを読んでプロパティのリストを考える、私は本当にMSを制御するように設計されたときに考える方法を知らないが、私はそのような機能を実現するための情報を見つけることができるかどうかを確認するために、

長い比較的単純な実装するためのWindows APIで見つかっ探している(と、それはWindows APIのウィンドウAPIを思わは本当に非常に非常に強いです)
名前空間を参照:
使用してSystem.Runtime.InteropServices;
APIは声明で使用:
[DLLIMPORT(「USER32。 DLL "項目CharSet = CharSet.Auto、ExactSpelling = trueに)]
        のhWndのIntPtrは、GetWindowのIntPtrパブリック静的にextern(UCMDをINT);
        INT = GW_CHILD 5;
       
[DLLIMPORT(" User32.dllの」、項目CharSet = CharSet.Auto)]
        のpublic static SendMessage EXTERNのIntPtr(のhWndのIntPtr、lParamにINT MSG、wParamにINTを、INT);
        公共int型CONST = EM_SETREADONLY 0xCF。

1.は、GetWindow APIによって設定されるハンドルComboBoxコントロールを取得します。
読み取り専用を取得するためのSendMessage API 2.ハンドルがセット属性。


サンプルコード:

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;

名前空間WindowsFormsApplication1
{
    パブリック部分クラスをForm1:フォーム
    {
        [DLLIMPORT( "user32.dllの"、項目CharSet = CharSet.Auto、ExactSpelling =真)]
        パブリック静的にexternのIntPtrは、GetWindow(のIntPtr hWndは、INT UCMD)。
        int型GW_CHILD = 5;
       
        [DLLIMPORT( "user32.dllの"、項目CharSet = CharSet.Auto)]
        パブリック静的にexternのIntPtrのSendMessage(のIntPtr hWndは、INT MSG、INT wParamに、INT lParamに)。
        公共のconst int型EM_SETREADONLY = 0xcf。

 

        public Form1()
        {
            InitializeComponent();
            IntPtr editHandle = GetWindow(comboBox1.Handle , GW_CHILD);
            SendMessage(editHandle,EM_SETREADONLY,1,0);
        }        
    }
}


别人解释的用到的原理:
1.comboBox其实是一个嵌套控件(复合控件)在DropDownList状态时;他由下拉列表,和ComboBox本身组成
  DropDown状态时ComboBox中多了一个edit就是.net下的TextBox那个输入状态是由edit控制的;
  不过这个edit是无法在.net下取得的this.comboBox1.Controls.Count 返回 0.
2.用AIP取得控件句柄。
3.给控件设置只读状态。
  这个就是发个消息基本可以搞定(不过忘记是那个消息了),看看msdn找em_ 开头的消息,找到EM_SETREADONLY看名字就是他了;
  根据SDK规则,em_ 开头的消息都是对应edit的.

转载于:https://my.oschina.net/secyaher/blog/274470

おすすめ

転載: blog.csdn.net/weixin_33794672/article/details/91967147