DVWA—Brute Force 暴力破解
新聞!
本文的原始碼和相關bug現在可以在谷歌code中找到:http://code.google.com/p/advcombobox/。
我把它移到了那裡,這樣每個人都可以報告bug並參與到控制元件的開發中來。我沒有時間自己解決所有問題,如果你想幫忙,請發郵件到[email protected],我會把你加入到專案中。對於每一個新版本,我將繼續在CodeProject.com更新這個頁面。這個控制元件在這裡已經有很長時間了,它仍然在使用,所以我想是時候更新一下了。
AdvComboBox文章索引
,,安裝
,,功能
,,通知
,,風格
,,未來的升級
,,提示,提示
,,改進和Bug修復
2.1版本有什麼新特性
我已經厭倦了在InitDialog函式中新增所有專案,這在一個頁面中有幾個CAdvComboBox的情況下是很煩人的。這個類現在將在stringtable中查詢與CAdvComboBox控制元件在資源編輯器中的ID相同的條目。演示專案已經升級,以顯示此特性。有關這方面的更多資訊已在安裝中新增。如果您想新增另一個stringtable條目,只需呼叫新函式LoadString(UINT nID),其中nID引用stringtable條目。
在這個版本中,我添加了程式碼,以便CAdvComboBox可以與巨集RUNTIME_CLASS一起使用。克里希納請求的。
我還添加了缺少的通過Alt-Down或Alt-Up鍵開啟下拉視窗的功能。這是托馬斯·弗羅伊登伯格提出的要求。
介紹
我開始在另一個CListBox中有組合框的程式中使用一個控制元件。我想要的第一個標準是組合框應該是平的(沒有陰影)。我看了一段時間,沒有找到合適的,所以我必須創造自己的。當我開始在平面組合盒上工作時,我想到了另一個很酷的功能。有多少次你想要和IE位址列一樣的功能。當你輸入一個地址,IAutoComplete COM-object開始工作。好極了!…與否。我希望在我的組合框中有同樣的功能,尤其是可調整大小的下拉視窗。所以,回到起點。經過許多個漫長的夜晚和幾種不同的方法,我終於成功了。
這個ComboBox不是MFC的CComboBox的子類,主要是因為我想能夠調整下拉視窗的大小。相反,我建立了一個CWnd物件,它看起來幾乎與MFC的CComboBox相同。棘手的部分是讓下拉視窗以與CComboBox相同的方式做出反應。首先,下拉視窗必須是桌面的子視窗,然後還有一個討厭的滑鼠和鍵盤捕獲問題。解決這個問題的方法是在一個視窗中包含一個列表框和一個滾動條。由於捕獲問題,CListBox類使用的滾動條無法使用。
在開發過程中增加了更多的特性;下拉視窗中的選中項和禁用項。
下面是一個類結構的圖片。
Picture 1
AdvComboBox的下拉視窗是autosize樣式,也就是說,它計算顯示列表中所有專案所需的大小。因此,結果是一個行為幾乎與MFC的CComboBox相同的組合框。您不應該更改任何已經在使用中的程式碼,除此之外,您必須將資源從標準的組合框更改為自定義控制元件。我已經測試了W2K和XP。現在我求助於CodeProject的成員和其他人來幫助我測試和查詢bug,也許還需要新增一些新特性。
安裝
在MFC DLL中使用CAdvComboBox建立一個新的專案來升級你的當前專案
本文包含在專案中實現CAdvComboBox類的三種不同方法。一個描述了新專案的工作順序,第二個描述瞭如何升級當前專案,最後一個描述瞭如何在MFC DLL中實現CAdvComboBox。
建立一個新專案
-
使用App嚮導建立一個對話方塊應用程式。下面的解釋建立在呼叫應用程式AdvCBDemoInsert到工作空間的基礎上
AdvComboBox.hAdvComboBox.cppDropWnd.hDropWnd.cppDropListBox.hDropListBox.cppDropScrollBar.hDropScrollBar.cppVisualStylesXP.hVisualStylesXP.h
在您的對話方塊資源編輯器中新增一個自定義控制元件,使用工具欄中的自定義控制元件工具在對話方塊中放置一個新的自定義控制元件。輸入控制元件的屬性,如下圖所示。CAdvComboBox自定義控制元件類名是AdvComboBoxCtrl,它是在AdvComboBox.h中定義的。
- Picture 2
描述不同的風格設定:
,組合style價值財產window CBS_DROPDOWN 0 x_____002 CBS_DROPDOWNLIST 0 x_____103 CBS_AUTOHSCROLL 0 x_____043 x_____103 CBS_SORT 0
因此,這意味著如果您希望您的combobox具有CBS_DROPDOWN、CBS_AUTOHSCROLL和CBS_SORT樣式,那麼樣式值應該以142結束(如圖2所示)。然後資源編輯器將您選擇的樣式轉換為此值。
以下風格尚未實現的:,,,CBS_DISABLENOSCROLL,, CBS_HASSTRINGS,, CBS_LOWERCASE,, CBS_NOINTEGRALHEIGHT,, CBS_OEMCONVERT,, CBS_OWNERDRAWFIXED,, CBS_OWNERDRAWVARIABLE,, CBS_SIMPLE, CBS_UPPERCASE
在AdvCBDemoDlg.h標頭檔案中,將以下公共成員變數新增到CAdvCBDemoDlg類中:
隱藏,複製codecadvcombobox m_ctladvcombo;
在AdvCBDemoDlg.cpp檔案中新增以下DXX_呼叫
隱藏,複製CodeDDX_Control(pDX, IDC_ADV_COMBO, m_ctlAdvCombo);
將它新增到AFX_DATA_MAP之外,以避免將來發生任何事故。現在,函式DoDataExchange(…)應該如下所示:
隱藏,複製co全無CAdvCBDemoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog: DoDataExchange (pDX);
/ / {{AFX_DATA_MAP (CAdvCBDemoDlg)
//注意:ClassWizard會在這裡新增DDX和DDV呼叫
/ /}} AFX_DATA_MAP
DDX_Control (pDX IDC_ADV_COMBO m_ctlAdvCombo);
}
現在你應該可以用AdvComboBox來測試你的對話方塊了。
另一個需要實現的特性是如何從控制元件中獲取和設定資料。下面對此進行了描述。
你可以使用相同的方法來獲取和設定資料,就像你會與一個普通的CComboBox,除了一個小的區別。DDX_CBIndex和DDX_CBString應該更改為DDX_ACBIndex和DDX_ACBString才能工作。這些函式可以在AdvComboBox.cpp檔案中找到。
要新增獲取和設定資料的功能,請在AdvCBDemoDlg.h檔案中新增以下一個或兩個變數
隱藏,複製codeint m_nadvcombo;
裝運箱m_stradvcombo;
您還必須在CAdvCBDemoDlg的建構函式中初始化這些變數的值。在AFX_DATA_INIT外部新增以下程式碼。
隱藏,複製Codem_nAdvCombo = -1;
m_strAdvCombo = " ";
還要在步驟6中新增的DDX_Control下面的AdvCBDemoDlg.cpp檔案中的函式DoDataExchange(…)中新增DDX_呼叫。
隱藏,複製CodeDDX_ACBIndex(pDX, IDC_ADV_COMBO, m_nAdvCombo);
DDX_ACBString(pDX, IDC_ADV_COMBO, m_strAdvCombo);
你現在應該能夠使用AdvComboBox控制元件,就像MFC的CComboBox一樣。
版本2.1中添加了以下內容
使用stringtable條目填充CAdvComboBox列表。為了能夠在這個組合框中使用stringtable,必須使用與在資源編輯器中建立的控制元件相同的識別符號建立一個stringtable條目。在本例中,stringtable條目ID應該是IDC_ADV_COMBO。下面是這個示例的圖片(圖3),您可以將其新增到您的專案中。在stringtable條目中,一個換行符('\n')表示組合框列表中一個項的結束。請檢視演示專案以獲得關於如何實現此功能的進一步資訊。
- Picture 3
升級當前專案
這個描述不像上面的描述那麼詳細。希望您有足夠的知識來管理以下內容。-
將以下檔案插入您的工作區
AdvComboBox.hAdvComboBox.cppDropWnd.hDropWnd.cppDropListBox.hDropListBox.cppDropScrollBar.hDropScrollBar.cppVisualStylesXP.hVisualStylesXP.h
在標頭檔案中包含AdvComboBox.h檔案
在標頭檔案中將所有的CComboBox變數定義重新命名為CAdvComboBox。替換資源組合框替換資源編輯器中的當前組合框以自定義控制元件並設定如圖2所示的屬性。當然,您可以更改自定義控制元件的樣式。
提示!對自定義控制元件使用與組合框相同的ID。這使它更加容易,因此您不必更改所有事件(ON_CBN_SELCHANGE等)的ID。
改變所有的DDX_CBIndex和DDX_CBString到DDX_ACBIndex和DDX_ACBString在你的。cpp檔案。如果你沒有在你的新自定義控制元件上設定相同的ID,就改變這些呼叫中的ID。編譯和測試您的專案現在應該可以工作,除了CAdvComboBox的限制。
在MFC DLL中使用CAdvComboBox
這只是一個關於如何在DLL中有windows(對話方塊)的DLL中使用這個類的簡短描述CAdvComboBox
。為了能夠註冊類,您必須對程式碼進行一些更改。的例項控制代碼
結構WNDCLASS
必須有DLL的例項控制代碼
,而不是呼叫應用程式例項控制代碼
。-
像這樣宣告一個CAdvComboBox變數:
隱藏,複製CodeCAdvComboBox m_ctlAdvCombo(TRUE)
你還必須在DLL專案中新增一個全域性HINSTANCE變數。新增以下檔案,例如,StdAfx.cpp在你的DLL專案:
隱藏,複製CodeHINSTANCE g_hDLLInstance = NULL;
然後,在StdAfx.h檔案中新增extern定義,如下所示:
隱藏,複製Codeextern HINSTANCE g_hDLLInstance;
初始化DllMain函式中的全域性HINSTANCESet hDllInstance。
隱藏,複製Codeg_hDLLInstance = hInstance;
接下來要做的是在AdvComboBox.cpp檔案中找到RegisterWindowClass()函式。改變函式,使它看起來像這樣:
隱藏,複製CodeBOOL CAdvComboBox: RegisterWindowClass ()
{
WNDCLASS wndcls;
例項控制代碼hInst;
如果(m_bInst)
{
hInst = g_hDLLInstance;
}
其他的
{
hInst =()控制代碼;
}
斷言(hInst != 0);
…
返回TRUE;
}
最後匯出CAdvComboBox類,但同樣重要的是,如果你想在DLL之外使用它,你必須匯出這個類。記住還要匯出兩個DDX_函式。類定義:
隱藏,複製Codeclass摔交declspec(dllexport) CAdvComboBox: public CWnd
DDX_定義:
隱藏,複製Code_declspec(dllexport) void AFXAPI DDX_ACBIndex(CDataExchange* pDX,
int nIDC int&指數);
(ddataexchange * pDX)
int nIDC CString&值);
AdvComboBox功能
中的函式CAdvComboBox
類與MFC中的相同CComboBox
。如果需要更多的幫助,請訪問MSDN。還有一些額外的功能可以使用。這些內容如下所述
- GetComboRect 描述:使用此函式檢索組合框的pos和大小。GetComboRect()返回AdvComboBox的Rect ,
- 在ver 2.0中有新的版本 描述:返回下拉視窗可見項的預設數量。使用SetDefaultVisibleItems(int)定義:int GetDefaultVisibleItems()返回:條目的數量。 ,
- GetItemChecked 定義:BOOL GetItemChecked(int nIndex)引數:列表中的nindex&item index返回:TRUE if Item nIndex被檢查,或者CB_ERR如果發生錯誤。 ,
- GetItemDisabled 定義:BOOL GetItemDisabled(int nIndex)引數:列表中的nindex&item index返回:TRUE如果nIndex被禁用,或者CB_ERR如果發生錯誤。 ,
- 在ver 1.2中是新的 描述:在dropwindow將被放置在combobox之上之前,獲取最小可見列表框專案。定義:int GetMinVisibleItems()返回:最小可見列表框專案的數量。 ,
- 在ver 2.1中,LoadString nbsp 描述:從stringtable載入一個條目,並在dropwindow列表中新增條目。定義:void LoadString(UINT nStringID)引數:nStringIDID載入的字串返回:void ,
- ModifyACBStyle 描述:修改CAdvComboBox的樣式。可以在這裡找到可用的樣式。這個函式只處理ACBS_樣式。它的工作作為MFC的ModifyStyle.定義:void ModifyACBStyle(UINT nRemoveStyle, UINT nAddStyle)引數:nRemoveStyleACBS樣式新增。 ,
- PointInWindow 定義:BOOL PointInWindow(CPoint ptScreenPoint)引數:ptScreenPoint是否在combobox中。如果該點在combobox視窗中,返回:TRUE。 ,
- 在ver 2.0中新增了SetDefaultVisibleItems 描述:設定下拉視窗中預設可見的專案數。定義:void SetDefaultVisibleItems(int nItems = -1);引數:nItems顯示下拉視窗時可見的專案數。如果樣式應該是autosize. return:void,則設定為-1 ,
- SetItemChecked 中,描述:設定一個專案組合又是檢查或如故;定義:空白SetItemChecked (int nIndex BOOL bChecked),引數:nIndex從零開始的項索引項設定只引數:bChecked新狀態的專案設定只回報:空白 ,
- SetItemDisabled 中,描述:設定一個專案組合禁用或啟用只定義:空白SetItemDisabled (int nIndex BOOL bDisabled),引數:nIndex從零開始的項索引項設定只引數:bDisabled新狀態的專案設定只回報:空白 ,
- setminvisibleitem nbsp;在ver 1.2中是新的 描述:在dropwindow被放置在組合框上方之前,設定最小可見列表框專案。預設是五個專案。定義:void SetMinVisibleItems(int nMinItems)引數:nminitems&minimum listbox專案的數量 ,
- DDX_ACBIndex 描述:使用這個函式來獲取和設定資料與MFC的UpdateData(…)的定義:void AFXAPI DDX_ACBIndex(CDataExchange* pDX, int nIDC, int&指數) ,
- DDX_ACBString 描述:使用這個函式來獲取和設定MFC的UpdateData(…)資料定義:void AFXAPI DDX_ACBString(CDataExchange* pDX, int nIDC, CString&)值)
下面是CAdvComboBox中實現的CComboBox函式列表。
- AddString
- DeleteString
- 中
- FindStringExact
- GetCount
- GetCurSel
- GetDroppedControlRect
- GetDroppedState
- GetEditSel
- GetItemData
- GetItemDataPtr
- GetLBText
- GetLBTextLen
- GetTopIndex
- InsertString
- LimitText nbsp;在第1.2條新
- ResetContent
- SelectString
- SetCurSel
- SetEditSel
- SetItemData
- SetItemDataPtr
- SetTopIndex
- ShowDropDown
下面的CComboBox函式在CAdvComboBox中沒有實現
- 清晰的
- CompareItem
- 複製
- 減少
- Dir
- DrawItem
- DeleteItem
- GetDroppedWidth
- GetExtendedUI
- GetHorizontalExtent
- GetItemHeight
- GetLocale
- MeasureItem
- 貼上
- SetDroppedWidth
- SetExtendedUI
- SetHorizontalExtent
- SetItemHeight
- SetLocale
AdvComboBox通知
的CAdvComboBox
傳送以下通知給父的,作為MFC的CComboBox
所做的事。
- CBN_CLOSEUP
- CBN_DROPDOWN
- CBN_EDITCHANGE
- CBN_EDITUPDATE
- CBN_KILLFOCUS
- CBN_SELCHANGE
- CBN_SELENDCANCEL
- CBN_SELENDOK
- CBN_SETFOCUS
沒有傳送以下通知。
- CBN_DBLCLKThis訊息僅在combobox樣式為CBS_SIMPLE且CAdvComboBox不支援此樣式時傳送。
- 這個控制元件還沒有內建記憶體管理,我不確定是否會這樣做。無聊!
AdvComboBox風格
的CAdvComboBox
有自己的風格。這裡對它們進行了描述。
- acbs_flatmake the combobox flat。使用這種樣式,combobox將一直繪製到資源中自定義控制元件矩形的邊界。
- 使用這種樣式,組合框將被繪製成一個普通的組合框,即3D外觀。
- 要使下拉視窗包含可檢查列表,請使用這種樣式。
- AdvComboBox將自動搜尋dropwindow專案,在與已在AdvComboBox的編輯框中輸入的文字最接近的匹配之後。如果找到,則將其餘文字追加到編輯框。
- 當在編輯框中輸入文字時,AdvComboBox將在下拉視窗中顯示與輸入文字匹配的列表。
CAdvComboBox支援以下CComboBox樣式
- CBS_AUTOHSCROLL
- CBS_DROPDOWN
- CBS_DROPDOWNLIST
- CBS_SORT
不支援以下CComboBox樣式
- CBS_DISABLENOSCROLL
- CBS_HASSTRINGS
- CBS_LOWERCASE
- CBS_NOINTEGRALHEIGHT
- CBS_OEMCONVERT
- CBS_OWNERDRAWFIXED
- CBS_OWNERDRAWVARIABLE
- CBS_SIMPLE
- CBS_UPPERCASE
未來的升級
- net相容
提示,提示
- 使用ClassWizardCreate您的專案與MFC的CComboBox,這樣ClassWizard可以幫助您實現通知,如ON_CBN_SELCHANGE。當你為combobox建立了所有的事件後,更改為CAdvComboBox。這是實現這個類最簡單、最快的方法。
- 在OnInitDialog()中新增一個對ModifyACBStyle(…)的呼叫,如下: 隱藏,Codem_ctlAdvCombo副本。ModifyACBStyle(0, ACBS_FLAT);
- 在我測試過的範圍內,AdvComboBox是相容主題的。如果顏色或其他方面有問題,請告訴我。在告訴我之前,請再和CComboBox做一次比較。
改進和Bug修復
版本2.1
- 具有相同ID的Stringtable條目將填充列表。
- 新增函式LoadString(單位)
- 現在可以使用巨集RUNTIME_CLASS了。在這個版本中,我在程式碼中添加了CAdvComboBox,這樣CAdvComboBox就可以與巨集RUNTIME_CLASS一起使用。克里希納請求的。
- 按Alt+上/下鍵開啟下拉視窗。增加了通過Alt-Down或Alt-Up鍵開啟下拉視窗的功能。這是Thomas Freudenberg的請求。
版本2.0
- 新增函式GetDefaultVisibleItems ()
- 新增函式SetDefaultVisibleItems (int)
- 新增CAdvComboBox樣式的ACBS_AUTOAPPEND
- 添加了CAdvComboBox風格的ACBS_AUTOSUGGEST
- CAdvComboBox現在也與CommCtrl 6.0清單相容。我使用David Yuheng Zhao的類CVisualStylesXP作為工作基礎,但我已經添加了一些功能,如從DLL獲取的函式現在是靜態函式,和一個函式檢查CommCtrl DLL版本,看看我們是否能夠使用視覺風格。如果一個清單沒有被使用,這個函式會告訴我們即使我們在WinXP上執行。
- 添加了兩個新檔案:VisualStylesXP.h和VisualStylesXP.cpp
版本1.21
- 修正了使用Create(…)時的錯誤當試圖用函式create(…)建立CAdvCombBox類,樣式為CBS_DROPDOWN時,出現了這個錯誤。感謝找到這個bug。
版本1.2
- 實現了滑鼠滾輪滾動下拉視窗。
- CComboBox函式LimitText現在已經實現。
- 不再需要Windows定義_WIN32_WINNT。
- 如果到螢幕底部的距離不夠,下拉視窗將顯示在組合框的上方。預設的listbox專案的最小數目設定為5,但是這個值可以通過呼叫CAdvComboBox類中的SetMinVisibleItems(int)函式來更改。
版本1.1
- 現在可以禁用該控制元件。
- 切換到另一個程式時,dropwindow關閉。
- 修正了Win2K下的一個小繪圖錯誤。
本文轉載於:http://www.diyabc.com/frontweb/news13768.html