復(fù)選框的下拉列表_第1頁
復(fù)選框的下拉列表_第2頁
復(fù)選框的下拉列表_第3頁
復(fù)選框的下拉列表_第4頁
復(fù)選框的下拉列表_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論