版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、 用自定義的CCheckComboBox類做帶復(fù)選框的下拉列表控件 1、添加Combo Box2.、改屬性Style:DropList ; Owner Draw:Fixed ; Has string:true ;Sort:false 3、頭文件中添加: CCheckComboBox m_comboBox; 4、DoDataExchange(CDataExchange* pDX)中添加: DDX_Control(pDX, IDC_COMBO1, m_comboBox); 5、對話框初始化時添加 m_comboBox.AddString(_T();/加入項目 m_comboBox.AddStrin
2、g(_T(); m_comboBox.AddString(_T(); m_comboBox.AddString(_T(); m_comboBox.SetCheck(0, TRUE);/設(shè)置選擇狀態(tài) m_comboBox.SetCheck(1, FALSE); m_comboBox.SetCheck(2, TRUE); m_comboBox.SetCheck(3, TRUE); #if !defined(AFX_CHECKCOMBOBOX_H_66750D93_95DB_11D3_9325_444553540000_INCLUDED_) #define AFX_CHECKCOMBOBOX_H_6
3、6750D93_95DB_11D3_9325_444553540000_INCLUDED_ #if _MSC_VER 1000 #pragma once #endif / _MSC_VER 1000 class CCheckComboBox : public CComboBox public: CCheckComboBox(); virtual CCheckComboBox(); BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID); / Selects all/unselects the specif
4、ied item INT SetCheck(INT nIndex, BOOL bFlag); / Returns checked state BOOL GetCheck(INT nIndex); / Selects all/unselects all void SelectAll(BOOL bCheck = TRUE); protected: / ClassWizard generated virtual function overrides /AFX_VIRTUAL(CCheckComboBox) protected: virtual void DrawItem(LPDRAWITEMSTRU
5、CT lpDrawItemStruct); virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct); /AFX_VIRTUAL /AFX_MSG(CCheckComboBox) afx_msg LRESULT OnCtlColorListBox(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnGetText(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnGetTextLength(WPARAM wParam, LPAR
6、AM lParam); afx_msg void OnDropDown(); /AFX_MSG DECLARE_MESSAGE_MAP() public: CString m_strText; protected: / Routine to update the text void RecalcText(); / The subclassed COMBOLBOX window (notice the L) HWND m_hListBox; / The string containing the text to display BOOL m_bTextUpdated; / A flag used
7、 in MeasureItem, see comments there BOOL m_bItemHeightSet; ; / /AFX_INSERT_LOCATION / Microsoft Visual C+ will insert additional declarations immediately before the previous line. #endif / !defined(AFX_CHECKCOMBOBOX_H_66750D93_95DB_11D3_9325_444553540000_INCLUDED_) /* CheckComboBox.cpp */ / CheckCom
8、boBox.cpp / / Written by Magnus Egelberg (magnus.egelberglundalogik.se) / / Copyright (C) 1999, Lundalogik AB, Sweden. All rights reserved. / / #include stdafx.h / #include CheckCombo.h #include CheckComboBox.h #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE = _FILE_; #end
9、if static WNDPROC m_pWndProc = 0; static CCheckComboBox *m_pComboBox = 0; BEGIN_MESSAGE_MAP(CCheckComboBox, CComboBox) /AFX_MSG_MAP(CCheckComboBox) ON_MESSAGE(WM_CTLCOLORLISTBOX, OnCtlColorListBox) ON_MESSAGE(WM_GETTEXT, OnGetText) ON_MESSAGE(WM_GETTEXTLENGTH, OnGetTextLength) ON_CONTROL_REFLECT(CBN
10、_DROPDOWN, OnDropDown) /AFX_MSG_MAP END_MESSAGE_MAP() / / The subclassed COMBOLBOX message handler / extern C LRESULT FAR PASCAL ComboBoxListBoxProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam) switch (nMsg) case WM_RBUTTONDOWN: / If you want to select all/unselect all using the / right butto
11、n, remove this ifdef. Personally, I dont really like it #if FALSE if (m_pComboBox != 0) INT nCount = m_pComboBox-GetCount(); INT nSelCount = 0; for (INT i = 0; i GetCheck(i) nSelCount+; m_pComboBox-SelectAll(nSelCount != nCount); / Make sure to invalidate this window as well InvalidateRect(hWnd, 0,
12、FALSE); m_pComboBox-GetParent()-SendMessage(WM_COMMAND, MAKELONG(GetWindowLong(m_pComboBox-m_hWnd, GWL_ID), CBN_SELCHANGE), (LPARAM)m_pComboBox-m_hWnd); #endif break; / Make the combobox always return -1 as the current selection. This / causes the lpDrawItemStruct-itemID in DrawItem() to be -1 / whe
13、n the always-visible-portion of the combo is drawn case LB_GETCURSEL: return -1; case WM_CHAR: if (wParam = VK_SPACE) / Get the current selection INT nIndex = CallWindowProcA(m_pWndProc, hWnd, LB_GETCURSEL, wParam, lParam); CRect rcItem; SendMessage(hWnd, LB_GETITEMRECT, nIndex, (LONG)(VOID *)&rcIte
14、m); InvalidateRect(hWnd, rcItem, FALSE); / Invert the check mark m_pComboBox-SetCheck(nIndex, !m_pComboBox-GetCheck(nIndex); / Notify that selection has changed m_pComboBox-GetParent()-SendMessage(WM_COMMAND, MAKELONG(GetWindowLong(m_pComboBox-m_hWnd, GWL_ID), CBN_SELCHANGE), (LPARAM)m_pComboBox-m_h
15、Wnd); return 0; break; case WM_LBUTTONDOWN: CRect rcClient; GetClientRect(hWnd, rcClient); CPoint pt; pt.x = LOWORD(lParam); pt.y = HIWORD(lParam); if (PtInRect(rcClient, pt) INT nItemHeight = SendMessage(hWnd, LB_GETITEMHEIGHT, 0, 0); INT nTopIndex = SendMessage(hWnd, LB_GETTOPINDEX, 0, 0); / Compu
16、te which index to check/uncheck INT nIndex = nTopIndex + pt.y / nItemHeight; CRect rcItem; SendMessage(hWnd, LB_GETITEMRECT, nIndex, (LONG)(VOID *)&rcItem); if (PtInRect(rcItem, pt) / Invalidate this window InvalidateRect(hWnd, rcItem, FALSE); m_pComboBox-SetCheck(nIndex, !m_pComboBox-GetCheck(nInde
17、x); / Notify that selection has changed m_pComboBox-GetParent()-SendMessage(WM_COMMAND, MAKELONG(GetWindowLong(m_pComboBox-m_hWnd, GWL_ID), CBN_SELCHANGE), (LPARAM)m_pComboBox-m_hWnd); / Do the default handling now (such as close the popup / window when clicked outside) break; case WM_LBUTTONUP: / D
18、ont do anything here. This causes the combobox popup / windows to remain open after a selection has been made return 0; return CallWindowProc(m_pWndProc, hWnd, nMsg, wParam, lParam); CCheckComboBox:CCheckComboBox() m_hListBox = 0; m_bTextUpdated = FALSE; m_bItemHeightSet = FALSE; CCheckComboBox:CChe
19、ckComboBox() BOOL CCheckComboBox:Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID) / Remove the CBS_SIMPLE and CBS_DROPDOWN styles and add the one Im designed for dwStyle &= 0xF; dwStyle |= CBS_DROPDOWNLIST; / Make sure to use the CBS_OWNERDRAWVARIABLE style dwStyle |= CBS_OWNERDRA
20、WVARIABLE; / Use default strings. We need the itemdata to store checkmarks dwStyle |= CBS_HASSTRINGS; return CComboBox:Create(dwStyle, rect, pParentWnd, nID); LRESULT CCheckComboBox:OnCtlColorListBox(WPARAM wParam, LPARAM lParam) / If the listbox hasnt been subclassed yet, do so. if (m_hListBox = 0)
21、 HWND hWnd = (HWND)lParam; if (hWnd != 0 & hWnd != m_hWnd) / Save the listbox handle m_hListBox = hWnd; / Do the subclassing m_pWndProc = (WNDPROC)GetWindowLong(m_hListBox, GWL_WNDPROC); SetWindowLong(m_hListBox, GWL_WNDPROC, (LONG)ComboBoxListBoxProc); return DefWindowProc(WM_CTLCOLORLISTBOX, wPara
22、m, lParam); void CCheckComboBox:DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) HDC dc = lpDrawItemStruct-hDC; CRect rcBitmap = lpDrawItemStruct-rcItem; CRect rcText = lpDrawItemStruct-rcItem; CString strText; / 0 - No check, 1 - Empty check, 2 - Checked INT nCheck = 0; / Check if we are drawing the sta
23、tic portion of the combobox if (LONG)lpDrawItemStruct-itemID itemID, strText); nCheck = 1 + (GetItemData(lpDrawItemStruct-itemID) != 0); TEXTMETRIC metrics; GetTextMetrics(dc, &metrics); rcBitmap.left = 0; rcBitmap.right = rcBitmap.left + metrics.tmHeight + metrics.tmExternalLeading + 6; rcBitmap.to
24、p += 1; rcBitmap.bottom -= 1; rcText.left = rcBitmap.right; if (nCheck 0) SetBkColor(dc, GetSysColor(COLOR_WINDOW); SetTextColor(dc, GetSysColor(COLOR_WINDOWTEXT); UINT nState = DFCS_BUTTONCHECK; if (nCheck 1) nState |= DFCS_CHECKED; / Draw the checkmark using DrawFrameControl DrawFrameControl(dc, r
25、cBitmap, DFC_BUTTON, nState); if (lpDrawItemStruct-itemState & ODS_SELECTED) SetBkColor(dc, GetSysColor(COLOR_HIGHLIGHT); SetTextColor(dc, GetSysColor(COLOR_HIGHLIGHTTEXT); else SetBkColor(dc, GetSysColor(COLOR_WINDOW); SetTextColor(dc, GetSysColor(COLOR_WINDOWTEXT); / Erase and draw ExtTextOut(dc,
26、0, 0, ETO_OPAQUE, &rcText, 0, 0, 0); DrawText(dc, + strText, strText.GetLength() + 1, &rcText, DT_SINGLELINE|DT_VCENTER|DT_END_ELLIPSIS); if (lpDrawItemStruct-itemState & (ODS_FOCUS|ODS_SELECTED) = (ODS_FOCUS|ODS_SELECTED) DrawFocusRect(dc, &rcText); void CCheckComboBox:MeasureItem(LPMEASUREITEMSTRU
27、CT lpMeasureItemStruct) CClientDC dc(this); CFont *pFont = dc.SelectObject(GetFont(); if (pFont != 0) TEXTMETRIC metrics; dc.GetTextMetrics(&metrics); lpMeasureItemStruct-itemHeight = metrics.tmHeight + metrics.tmExternalLeading; / An extra height of 2 looks good I think. / Otherwise the list looks
28、a bit crowded. lpMeasureItemStruct-itemHeight += 2; / This is needed since the WM_MEASUREITEM message is sent before / MFC hooks everything up if used in i dialog. So adjust the / static portion of the combo box now if (!m_bItemHeightSet) m_bItemHeightSet = TRUE; SetItemHeight(-1, lpMeasureItemStruc
29、t-itemHeight); dc.SelectObject(pFont); / / Make sure the combobox window handle is updated since / there may be many CCheckComboBox windows active / void CCheckComboBox:OnDropDown() m_pComboBox = this; / / Selects/unselects all items in the list / void CCheckComboBox:SelectAll(BOOL bCheck) INT nCoun
30、t = GetCount(); for (INT i = 0; i nCount; i+) SetCheck(i, bCheck); / / By adding this message handler, we may use CWnd:GetText() / LRESULT CCheckComboBox:OnGetText(WPARAM wParam, LPARAM lParam) / Make sure the text is updated RecalcText(); if (lParam = 0) return 0; / Copy the fake window text lstrcpyn(LPWSTR)lParam, m_strText, (INT)wParam); return m_strText.GetLength(); / / By adding this message handler, we may use CWnd:GetTextLength() / LRESULT CCheckComboBox:OnGetTextLength(WPARAM, LPARAM) / Make sure the text is updated RecalcText(); return m_strText.GetLength(); / / This routine
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度新能源汽車生產(chǎn)合作協(xié)議范本正規(guī)范本
- 綠色循環(huán)農(nóng)業(yè)新模式策略及實施路徑
- 2024年監(jiān)理服務(wù)居間代理協(xié)議格式版B版
- 2021-2026年中國民用機場行業(yè)發(fā)展監(jiān)測及投資戰(zhàn)略規(guī)劃研究報告
- 2024年甲乙雙方關(guān)于二手房買賣的貸款擔(dān)保合同3篇
- 2024消防工程合同-消防水池及消防泵房改造3篇
- 二零二五年倉儲租賃合同(含倉儲技術(shù)支持)3篇
- 二零二五年度企業(yè)形象設(shè)計與品牌管理合作合同3篇
- 二零二五年度VOCs減排設(shè)備運維與技術(shù)服務(wù)合同3篇
- 二零二五年度保險代理居間保險代理人激勵機制合同2篇
- 審計常用法規(guī)培訓(xùn)課件
- 健康指南知己知彼了解你的身體質(zhì)量指數(shù)BMI
- 主題二:擁軍優(yōu)屬心連心 課件 2023-2024學(xué)年廣州版初中勞動技術(shù)九年級下冊
- 海洋技術(shù)與海洋裝備發(fā)展
- 智慧火電廠整體解決方案
- 電廠鍋爐爐膛煙道內(nèi)部作業(yè)三措兩案
- 收費站(所)事故隱患排查清單
- 駕駛證學(xué)法減分(學(xué)法免分)題庫及答案(200題完整版)
- 高績效教練的讀書心得分享
- 軟管出廠檢測報告
- 公司業(yè)務(wù)流程與工作流程介紹
評論
0/150
提交評論