複選下拉框CCheckComboBox
完整程式碼請到我的資源裡面下載
#if !defined(AFX_CHECKCOMBOBOX_H__66750D93_95DB_11D3_9325_444553540000__INCLUDED_) #define AFX_CHECKCOMBOBOX_H__66750D93_95DB_11D3_9325_444553540000__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class CCheckComboBox : public CBCGPComboBox { public: CCheckComboBox(); virtual ~CCheckComboBox(); BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID); // Selects all/unselects the specified 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(LPDRAWITEMSTRUCT 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, LPARAM lParam); afx_msg void OnDropDown(); //}}AFX_MSG DECLARE_MESSAGE_MAP() 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 CString m_strText; BOOL m_bTextUpdated; // A flag used 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 // // Written by Magnus Egelberg ([email protected]) // // Copyright (C) 1999, Lundalogik AB, Sweden. All rights reserved. // // #include "stdafx.h" #include "CheckComboBox.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif static WNDPROC m_pWndProc = 0; static CCheckComboBox *m_pComboBox = 0; BEGIN_MESSAGE_MAP(CCheckComboBox, CBCGPComboBox) //{{AFX_MSG_MAP(CCheckComboBox) ON_MESSAGE(WM_CTLCOLORLISTBOX, OnCtlColorListBox) ON_MESSAGE(WM_GETTEXT, OnGetText) ON_MESSAGE(WM_GETTEXTLENGTH, OnGetTextLength) ON_CONTROL_REFLECT(CBN_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 button, remove this ifdef. Personally, I don't really like it #if FALSE if (m_pComboBox != 0) { INT nCount = m_pComboBox->GetCount(); INT nSelCount = 0; for (INT i = 0; i < nCount; i++) { if (m_pComboBox->GetCheck(i)) nSelCount++; } m_pComboBox->SelectAll(nSelCount != nCount); // Make sure to invalidate this window as well InvalidateRect(hWnd, 0, 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 // when 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 *)&rcItem); 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_hWnd); 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); // Compute 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(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_hWnd); } } // Do the default handling now (such as close the popup // window when clicked outside) break; } case WM_LBUTTONUP: { // Don't 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::~CCheckComboBox() { } BOOL CCheckComboBox::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID) { // Remove the CBS_SIMPLE and CBS_DROPDOWN styles and add the one I'm designed for dwStyle &= ~0xF; dwStyle |= CBS_DROPDOWNLIST; // Make sure to use the CBS_OWNERDRAWVARIABLE style dwStyle |= CBS_OWNERDRAWVARIABLE; // 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 hasn't been subclassed yet, do so... if (m_hListBox == 0) { 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, wParam, 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 static portion of the combobox if ((LONG)lpDrawItemStruct->itemID < 0) { // Make sure the m_strText member is updated RecalcText(); // Get the text strText = m_strText; // Don't draw any boxes on this item nCheck = 0; } // Otherwise it is one of the items else { GetLBText(lpDrawItemStruct->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.top += 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, rcBitmap, 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, 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(LPMEASUREITEMSTRUCT 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 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, lpMeasureItemStruct->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 nCount = 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 steps thru all the items and builds // a string containing the checked items // void CCheckComboBox::RecalcText() { if (!m_bTextUpdated) { CString strText; // Get the list count INT nCount = GetCount(); // Get the list separator TCHAR szBuffer[10] = {0}; GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SLIST, szBuffer, sizeof(szBuffer)); CString strSeparator = szBuffer; // If none found, the the ';' if (strSeparator.GetLength() == 0) strSeparator = ';'; // Trim extra spaces strSeparator.TrimRight(); // And one... strSeparator += ' '; for (INT i = 0; i < nCount; i++) { if (GetItemData(i)) { CString strItem; GetLBText(i, strItem); if (!strText.IsEmpty()) strText += strSeparator; strText += strItem; } } // Set the text m_strText = strText; m_bTextUpdated = TRUE; } } INT CCheckComboBox::SetCheck(INT nIndex, BOOL bFlag) { INT nResult = SetItemData(nIndex, bFlag); if (nResult < 0) return nResult; // Signal that the text need updating m_bTextUpdated = FALSE; // Redraw the window Invalidate(FALSE); return nResult; } BOOL CCheckComboBox::GetCheck(INT nIndex) { return GetItemData(nIndex); }
相關推薦
複選下拉框CCheckComboBox
完整程式碼請到我的資源裡面下載 #if !defined(AFX_CHECKCOMBOBOX_H__66750D93_95DB_11D3_9325_444553540000__INCLUDED_) #define AFX_CHECKCOMBOBOX_H__66750
複選下拉框元件
需求說明做報表的時候,篩選條件中需要用到複選下拉框,首先說明: 複選框(checkbox)無法滿足我的需求,因為可選項有上百個,不可能都直接列在頁面上 下拉框(select)也無法滿足,因為不支援複
基於element-ui的多選下拉框和tag標簽的二次封裝
line ron click opacity ext width 顯示 模塊 scss 前言: 今年這大半年我主要負責公司的後臺教務管理的開發,這個管理系統目前主要是給公司的內部人員去配置公司的核心項目(例如:熊貓小課)的所有數據,例如課程的配置、課程期數的配置、課程版本
點選下拉框切換頁面並顯示在當前頁(語言切換)
預設html: <div class="styled-select">  
bootstrap-select動態級聯多選下拉框
1、引用css/js <link href="../../plugins/css/bootstrap.min.css" rel="stylesheet"> <link href="../../plugins/css/plugins/bootstrap-table/bootstr
Vue-multiselect 外掛使用--搜尋及單選下拉框
參考官網:https://vue-multiselect.js.org/#sub-select-with-search 1.通過npm安裝vue-multiselect npm install vue-multiselect 2.引用 template中:注意這裡的track-by
MVC身份驗證.MVC過濾器.MVC6關鍵字Task,Async.前端模擬表單驗證,提交.自定義匿名集合.Edge匯出到Excel.BootstrapTree樹狀選單的全選和反選.bootstrap可搜尋可多選可全選下拉框
在寫這篇部落格之前要嘮叨幾句.本人已從事開發四年有餘.從前兩年的熱情如火.到現在的麻木.總感覺要像上突破.卻又不敢輕舉妄動. 沒事就寫點基礎程式碼.指點下新人吧 1.MVC身份驗證. 有兩種方式.一個是傳統的所有控制器繼承自定義Control,然後再裡面用MVC的過濾器攔截.所以每次網站的後臺被訪問時.
Bootstrap-select多選下拉框實現
<!-- Latest compiled and minified CSS --> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.10.0/css/bootst
獲取多選下拉框(select標籤設定multiple屬性)的值
<select multiple>不能直接獲取value,需要藉助該元素的options屬性。如下: <select id="select" multiple> <option value="1">1111</option> &
EasyUI多選下拉框的取值和賦值
@RequestMapping("/getCodeList") public void getCodeList(HttpServletResponse resp){ ResUtil.res
Bootstrap select多選下拉框賦值
Bootstrap Multi-Select Plugin的動態資料插入使用 圖片: 這個你看到的是我頁面的效果,我將裡面的js程式碼修改了一點,擴充套件了一下顯示的結果id,text,這是固定的,後面的是我又加了一個引數 參考頁面:多選框外掛連結(這個就是那個多選的
Extjs多選下拉框multiSelect支援reset
多選,增加時會記憶上一次的選中的內容,表單reset對其無效,通過此修改可使表單reset時也會跟著清空。 以下程式碼是在multiSelect.js的基礎上進行簡單修改的。 if('function' !== typeof RegExp.escape) { RegExp.
bootstrap做前端需要實現多選下拉框
首先需要用到一個外掛bootstrap-select.min.js,新增以下引用:bootstrap-select.cssbootstrap-select.min.cssjquery-editable-select.css.cssbootstrap-select.jsboot
頁面中的點選下拉框中獲取資料
頁面需求 使用的程式碼實現: <select id="app_id" name="name_name"> <option value="Android">Android</option>
EasyUI 中多選下拉框 combotree 學習研究
增加可以獲取的兩個選擇屬性: //alert($("#cc").combotree("getValue")); //獲取key var wordstr= $("#aa").combotree("getValues"); //獲取多選的key alert($("#cc").combotree("get
angularjs 多選下拉框 控制元件angularjs ui-select2
angularjs ui-select2:http://jsfiddle.net/jLD42/4/(這個網站測試通過),網站內容如下:找了很多其他的網站都沒用,這個是測試通過的,需要匯入所需要的js檔案,需要的圖片: 這個如果控制元件寬度是比較窄的話
前端多選下拉框jquery的multiselect
官方demohttp://loudev.com/#demos網上例子,不知道咋回事,那個全選啥的無效果https://www.jb51.net/article/37323.htm看了部落格文章,然後選擇
android完成註冊頁面的下拉框及單複選框(1)
package com.example.dell.mylogin;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view
PHP獲取單選下拉列表,多選下拉列表,單選框,複選框內的值
PHP獲取單選下拉列表,多選下拉列表,單選框,複選框內的值,此例將當前頁作為提交資料的頁面。 <form action=" " method="post" accept-charset="utf-8"> <!--單選下拉 學歷--> <selec
javascrip下拉框、複選框的一些操作
下拉框的一些基本操作 //1.獲取下拉框的值 var radioValue = $("#radio option:selected").val(); //2.將下拉框中的某個值設定為選中狀態 $("#opt option").each(function(){ if($(this).va