1. 程式人生 > >C#:關於WinForm中ComboBox的探究

C#:關於WinForm中ComboBox的探究

ComboBox就是.net裡面用於做下拉選單的控制元件。

平時用得很多,卻對它知道的很少。

其實ComboBox並不像平常以為的那樣是一整個控制元件。而是由其他控制元件複合而成的。

其中,下拉選單的那個三角形按鈕和輸入框的邊框都是ComboBox的整體。是繪製出來的。

而,那個可以輸入的部分則是由一個無邊框的Edit控制元件構成的。

知道了這一點就可以去解釋一個問題。

我們發現,當ComboBox的Enable設定為False的時候,整個控制元件會變成灰色。

在有的情況下,我們需要改變ComboBox在不可用狀態下的顏色。

我們可以去繼承它,然後重繪它的外觀。比如:

 

經過繪製了邊框和填充了背景色之後,我們發現ComboBox在不可用狀態下的樣子有點讓人不解

也就是說,經過繪製,我們沒有把那個按鈕畫出來,然後邊框畫成了藍色,背景畫成了紅色。

但是,中間那塊灰色區域是怎麼回事?

這就是因為。ComboBox會把自己的Enable屬性賦值給Edit控制元件。從而導致Edit控制元件也出現了不可用。

但是由於重繪的時候只能重繪ComboBox,裡面的Edit的樣式是自動由系統繪製的,所以控制不到。

對於這一點應該怎麼辦呢?

既然裡面是一個控制元件。那麼就應該可以拿到它的控制代碼。方法如下,先宣告API:

 

在適當的地方呼叫

 

就可以得到裡面的Edit的控制代碼。

值得注意的是,上面這句只有在ComboBox的外部呼叫的時候才行。如果是在ComboBox內部呼叫。會出錯。

所以可以在ComboBox的外面再包一層使用者控制元件。在Enable屬性被更改的時候來做這個。

拿到Edit的控制代碼之後,我們只要用API ShowWindow來隱藏掉它。然後再自己重繪Text到ComboBox的背景上,就可以做出一個可以改變顏色的不可用ComboBox了。

相關推薦

C#關於WinFormComboBox探究

ComboBox就是.net裡面用於做下拉選單的控制元件。 平時用得很多,卻對它知道的很少。 其實ComboBox並不像平常以為的那樣是一整個控制元件。而是由其他控制元件複合而成的。 其中,下拉選單的那個三角形按鈕和輸入框的邊框都是ComboBox的整體。是繪製出來的。 而

方法C#在WinForm如何將Image存入SQL2000和取出顯示

close database 耗時 .exe while type comm res orm //保存 sql="insert into p_ry_photo(id,photo) values (‘"+id+"‘,@i)"; SqlComma

C# WinForm ComboBox資料繫結的問題

SqlConnection   con   =   new  SqlConnection("server=192.168.2.198;uid=sa;pwd=sa;database=northwind");   SqlCommand   cmd   =   con.CreateCommand();   cmd.

c#(winform)ComboBox和ListBox新增項,寫一個使用者控制元件

用comboBox的資料繫結的方法很簡單,建一個數據源,繫結到ComboBox上,然後指定DisplayMember和 ValueMember就可以了。但是感覺好不靈活哦,如果我要在ComboBox上再新增一項,那怎麼

C#在WinForm使用WebKit傳遞js對象實現與網頁交互的方法

復制代碼 dll ssa 所有 添加 spa load net clas 這篇文章主要介紹了C#在WinForm中使用WebKit傳遞js對象實現與網頁交互的方法,涉及針對WebBroswer控件及WebKit控件的相關使用技巧,需要的朋友可以參考下 本文實例講述了C#在W

C++兩個易被忽略的默認函數

ont names namespace tor img c++編譯 style div 顯式 C++的自定義類中有六個默認的函數,即如果用戶沒有顯式定義這些函數時,C++編譯器會類中生成這些函數的默認形式。除了大家所熟知的構造函數、拷貝構造函數、賦值函數和析構函數外,C++

基於C#的WinFormDataGridView控制元件操作彙總

基於C#的WinForm中DataGridView控制元件操作彙總 一、單元格內容的操作  *****// 取得當前單元格內容         Console.WriteLine(DataGridView1.CurrentCell.Value); // 取

C++的賦值函式

先來看一個例子: 1 #include<iostream> 2 #include<string> 3 using namespace std; 4 class Student{ 5 public: 6 Student(){ 7

C#的winformMDI 父窗體改變背景色

MdiClient ctlMDI; // Loop through all of the form's controls looking // for the control of type MdiClient. foreach (Control ctl in this.Controls) { tr

C#開發winformOpenFileDialog的運用還可以多選

using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Da

C# 在winform隱藏或者去除c#的標題欄並實現窗體移動附程式碼

設定窗體的FormBorderStyle為None 不過要自己加上一些相應的操作程式碼了,不然視窗是不能進行拖動關閉之類的 #region 實現點選移動 internal static int WM_NCHITTEST = 0x84; in

C#的WinFormIsMDIContatiner修改IsMDIContatiner父窗體背景色

修改C#的WinForm中MDI父窗體背景色的方法一 在MDI父窗體的Load程式碼中,加入以下程式碼: MdiClient ctlMDI; // Loop through all of the form's controls looking // for the cont

c#(winform)自定義ListItem類方便ComboBox添加Item項

urn left over string his 定義 return box item 1.定義ListItem類 public class ListItem { private string _key = string.Empty;

C# winform winApi 根據傳入handle 控制代碼獲取 其它視窗,如使用的子視窗、同級視窗等。

//根據傳入的視窗控制代碼,獲取到同級、頂級、低階的視窗,根據GetWindowCmd 傳入的不同獲取也不同,詳細看GetWindowCmd 類說明 [DllImport("user32.dll", SetLastError = true)] static exter

Winform播放視頻等【DotNet,C#】

視頻格式 數量 ide () ngs 很多 選擇 有一個 void 在項目中遇到過這樣的問題,就是如何在Winform中播放視頻。當時考察了幾種方式,第一種是直接使用Windows Media Player組件,這種最簡單;第二種是利用DirectX直接在窗體或者控件上繪圖

winform的ListBox和ComboBox綁定數據用法實例

var eve default 實現類 數據源 pan orm person spa 本文實例講述了winform中的ListBox和ComboBox綁定數據用法。分享給大家供大家參考。具體實現方法如下: 本例實現將集合數據綁定到ListBox和ComboBox控件,界面

C#將字符串連續空格轉換為一個空格

lar div 代碼 com program 數組 http static spa 使用正則表達式來進行轉換,代碼如下: 註:Trim()方法是去掉字符串首尾的空格;經過正則轉換之後,就可以直接用Split進行分割成數組 “\”:是轉義 , “\s”:代表空格 ,

【TOJ 5254】C++實驗繼承的構造函數和析構函數

des 能夠 con OS esp space AC tom cto 描述 實現C++類Base和Derived,並編寫相關構造函數和析構函數,使其能夠輸出樣例信息。 主函數裏的代碼已經給出,請補充完整,提交時請勿包含已經給出的代碼。 int main() { Base

C# windows服務C#windows服務的Timer控件的使用

技術 ima dap sys 圖片 雙擊 一個 inf form C# windows服務程序中的Timer控件的使用問題是如何解決的呢? 今天研究了下C# windows服務程序中的Timer控件的使用的寫法. 我們在建立一個C# windows服務程序後,要用到計時器的

C++如何判斷類是否存在特定的成員函式?

       在模板開發中有時需要判斷一個類中是否含特定的方法,然後根據判斷結果開分支,編寫不同的邏輯。下面就介紹一下最常用的一種方式: template <typename U> struct class_str {