在VB程式中,透過程式碼改變Combo控制元件只讀屬性Style值 (轉)
在VB中,如果你用如下語句動態建立一個Combo
Dim WithEvents cmbDropList As ComboBox
...
Set cmbDropList = Controls.Add("VB.ComboBox", "cmbDropList")
後,Combo控制元件的Style值是1 (VbComboDropDown 下拉式組合框,包括一個下拉式列表和一個文字框。可以從列表選擇或在文字框中輸入 ),若想把Style的值更改2 (VbComboDrop-DownList 2 下拉式列表。這種樣式僅允許從下拉式列表中選擇 )
透過語句Combo1.Style=2是不行的,因為Style是隻讀屬性。為了突破這個限制,我動用的Spy++這個武器,對兩種不同Style值的combo控制元件進行偵察,發現了兩處不同
1、combo控制元件的style的值為1-VbComboDropDown時,combo控制元件視窗的Styles=&H54010242,而combo控制元件的style的值為2-VbComboDrop-DownList時,combo控制元件視窗的Styles=&H54010243
2、combo控制元件的style的值為1-VbComboDropDown時,combo控制元件裡有一個Edit文字框視窗,而combo控制元件的style的值為2-VbComboDrop-DownList時,則沒有Edit文字框視窗
我首先試著用改變combo控制元件視窗的Styles值,
Call SetWindowLong(Combo1.hwnd, GWL_STYLE,&H54010243)
看Combo控制元件有沒有什麼改變,結果大失所望,
我再次試著用API函式殺死Combo控制元件裡的那個Edit視窗,耶~~~,成功了
下面是我的實現程式碼:
Private Const GWL_STYLE = (-16)
Private Const GW_CHILD = 5
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long
Const SW_H = 0
Const SW_SHOW = 5
Dim WithEvents cmbDropList As ComboBox
Private Sub cmbDropList_Click()
MsgBox cmbDropList.Text
End Sub
Private Sub Command1_Click()
Dim ChildHwnd As Long
Set cmbDropList = Controls.Add("VB.ComboBox", "cmbDropList")
cmbDropList.Visible = True
cmbDropList.AddItem "One"
cmbDropList.AddItem "Two"
ChildHwnd = GetWindow(cmbDropList.hwnd, GW_CHILD) '取edit控制程式碼
Call DestroyWindow(ChildHwnd) 'Kill edit視窗
'改變cmbDropList的Style,這一語句可有可無~~~~,
Call SetWindowLong(cmbDropList.hwnd, GWL_STYLE, GetWindowLong(cmbDropList.hwnd, GWL_STYLE) + 1)
End Sub
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990513/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- js 改變 控制元件的屬性值JS控制元件
- 教你在WindowsXP中為USB新增“只讀”屬性(轉)Windows
- jquery改變元素屬性值jQuery
- 在url中通過屬性名獲取屬性值
- 如何呼叫程式碼在python3中改變函式值?Python函式
- 改變檔案屬性 (轉)
- VB6.0中透過MSChart控制元件呼叫資料庫 (轉)控制元件資料庫
- javascript動態改變iframe元素src屬性程式碼例項JavaScript
- 透過程式碼改變客戶端所顯示的語言型別 (轉)客戶端型別
- TypeScript 介面 只讀屬性TypeScript
- tkinter中scale拖拉改變值控制元件(十一)控制元件
- js通過type屬性值篩選input元素程式碼例項JS
- 針對限定作者、書名均為只讀屬性的程式碼及其疑問
- JavaScript style 屬性JavaScript
- HTML style 屬性HTML
- C# 可以利用反射給只讀屬性賦值嗎?C#反射賦值
- vue中慎用style的scoped屬性Vue
- 學在 VC ,用在 VB - 透過語言看 "世界" (轉)
- VB程式設計師的FTP程式設計指南1.3-列出、改變目錄 (轉)程式設計師FTP
- let 宣告的變數,只在程式碼塊內有效變數
- combo box控制元件的使用 (轉)控制元件
- 跟蹤model中屬性(值)的變更
- 透過編寫模組化程式碼提高軟體可移植性(轉)
- JavaScript監聽屬性改變JavaScript
- PL/SQL變數值可變在程式中會變嗎?SQL變數
- 程式程式碼,常量,區域性變數,全域性變數在記憶體中的儲存位置變數記憶體
- css屬性與js中style物件的屬性對應表CSSJS物件
- domino 發郵件時,透過修改 Principal 中的值改變發件人地址
- 在VB.Net中建立使用控制元件陣列 (轉)控制元件陣列
- Java常見的系統屬性值及如何通過Java程式設計獲得系統屬性值Java程式設計
- 【轉】改變檢視頁面原始碼的程式原始碼
- WPF當屬性值改變時利用PropertyChanged事件來載入動畫事件動畫
- 想用就用,VB基礎程式碼 (轉)
- javascript通過class屬性獲取元素的程式碼JavaScript
- 一勞永逸讓VB自動改變控制元件大小控制元件
- 動態路由,透過id改變,改頁面路由
- 讀《我和Labview》7控制元件的區域性變數和屬性View控制元件變數
- Android開發Style的使用,控制元件共同屬性的抽取Android控制元件