//#######################################################################################//## CheckComboBox.cpp : implementation file//########################################################################################include "stdafx.h"#include "CheckComboBox.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif//## ====================================================================================WNDPROC CCheckComboBox::m_parentWndProc = NULL;CWnd* CCheckComboBox::m_pwndActiveDropDown = NULL;CCheckComboBox* CCheckComboBox::m_pwndActiveCheckComboBox = NULL;CRect CCheckComboBox::m_rcParentRect = CRect(0, 0, 0, 0);//#######################################################################################IMPLEMENT_DYNAMIC(CCheckComboBox, CButton)//## ====================================================================================CCheckComboBox::CCheckComboBox(){//## INITIALIZEm_pwndTree = NULL;m_parentWndProc = NULL;m_pwndActiveCheckComboBox = NULL;m_nDroppedWidth = DROPPED_WIDTH_NOT_SET;m_bSendMsgToParent=TRUE;}//## ====================================================================================CCheckComboBox::~CCheckComboBox(){//## HIDE ActiveDropDownHideActiveDropDown();//## UNINTERCEPTUnInterceptParentWndProc();//## DESTROY Treeif (m_pwndTree){m_pwndTree->ShowWindow( SW_HIDE );delete m_pwndTree;m_pwndTree = NULL;}}//## ====================================================================================void CCheckComboBox::OnDestroy(){//## CALL ParentCButton::OnDestroy();//## HIDE ActiveDropDownHideActiveDropDown();//## UNINTERCEPTUnInterceptParentWndProc();}//#######################################################################################BEGIN_MESSAGE_MAP(CCheckComboBox, CButton)ON_WM_DESTROY()ON_WM_LBUTTONDOWN()ON_WM_LBUTTONDBLCLK()ON_WM_GETDLGCODE()ON_WM_KILLFOCUS()END_MESSAGE_MAP()//#######################################################################################void CCheckComboBox::OnLButtonDown(UINT nFlags, CPoint point){//## CALL ParentCButton::OnLButtonDown(nFlags, point);//## SHOW TreeShowDropWnd();}//## ====================================================================================void CCheckComboBox::OnLButtonDblClk(UINT nFlags, CPoint point){//## CALL ParentCButton::OnLButtonDown(nFlags, point);//## SHOW TreeShowDropWnd();}//## ====================================================================================LRESULT CCheckComboBox::WindowProc( UINT message, WPARAM wParam, LPARAM lParam ){//## CATCH DropDown Keysswitch (message){case WM_KEYDOWN:case WM_SYSKEYDOWN:switch ((int) wParam){case VK_F4:ShowDropWnd();return NULL; //## INTERCEPTcase VK_DOWN:case VK_UP:if (message == WM_SYSKEYDOWN)ShowDropWnd();return NULL; //## INTERCEPTcase VK_SPACE:return NULL; //## INTERCEPT}}//## CALL Parentreturn CButton::WindowProc(message, wParam, lParam);}//## ====================================================================================BOOL CCheckComboBox::PreTranslateMessage(MSG* pMsg){//## INTERCEPT Keys => send them to treeif ((pMsg->message >= WM_KEYFIRST) && (pMsg->message <= WM_KEYLAST))if(m_pwndActiveDropDown){m_pwndActiveDropDown->SendMessage( pMsg->message, pMsg->wParam, pMsg->lParam);((CCheckTreeCtrl*)m_pwndActiveDropDown)->UpdateToState();return FALSE;}//## PROCESS ToolTipInitToolTip();m_ToolTip.RelayEvent(pMsg);return CButton::PreTranslateMessage(pMsg);}//#######################################################################################void CCheckComboBox::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct ){//## GET CDCCDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);//## FRAMECRect rc = lpDrawItemStruct->rcItem;pDC->DrawEdge( rc, EDGE_SUNKEN, BF_TOP | BF_LEFT | BF_BOTTOM | BF_RIGHT );//## DRAW white BKrc.DeflateRect(2, 2);static CBrush brWindow(GetSysColor(COLOR_WINDOW));static CBrush brBtnFace(GetSysColor(COLOR_BTNFACE));static CBrush brBtnShadow(GetSysColor(COLOR_BTNSHADOW));if (IsWindowEnabled())pDC->FillRect(&rc, &brWindow);else pDC->FillRect(&rc, &brBtnFace);//## COMPUTE Button RectCRect rcButton = rc;rcButton.left = rcButton.right - DROP_BUTTON_WIDTH;if (rcButton.left < rc.left) rcButton.left = rc.left;//## COMPUTE Caption RectCRect rcCaption = rc;rcCaption.right = rcButton.left - 1;if (rcCaption.right < rcCaption.left) rcCaption.right = rcCaption.left;//## FOCUSrcCaption.DeflateRect(1, 1);if (lpDrawItemStruct->itemState & ODS_FOCUS) pDC->DrawFocusRect(rcCaption);rcCaption.DeflateRect(2, 1);//## GET CaptionCString strText;GetWindowText(strText);//## DRAW CaptionpDC->SetBkColor( (IsWindowEnabled()) ? GetSysColor(COLOR_WINDOW) : GetSysColor(COLOR_BTNFACE) );COLORREF crOldColor = SetTextColor(lpDrawItemStruct->hDC, RGB(0, 0, 0));DrawText(lpDrawItemStruct->hDC, strText, strText.GetLength(), &rcCaption, DT_SINGLELINE | DT_VCENTER );SetTextColor(lpDrawItemStruct->hDC, crOldColor);//## GET Button StyleUINT uStyle = DFCS_BUTTONPUSH;if (lpDrawItemStruct->itemState & ODS_SELECTED) uStyle |= DFCS_PUSHED;//## DRAW Buttonif (lpDrawItemStruct->itemState & ODS_SELECTED){pDC->FrameRect(rcButton, &brBtnShadow);rcButton.DeflateRect(1, 1);pDC->FillRect(&rcButton, &brBtnFace);rcButton.DeflateRect(1, 3, 0, 0);}else{pDC->FrameRect(rcButton, &brBtnFace);rcButton.DeflateRect(1, 1, 0, 0);DrawFrameControl(lpDrawItemStruct->hDC, &rcButton, DFC_BUTTON, uStyle);}//## DRAW Arrowstatic CPen penBlack(PS_SOLID, 1, RGB(0, 0, 0));static CPen penBtnShadow(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW));CPen* ppenOld;if (IsWindowEnabled())ppenOld = pDC->SelectObject(&penBlack);else ppenOld = pDC->SelectObject(&penBtnShadow);for(long i=0; i<4; i++){pDC->MoveTo( rcButton.left + 3 + i, rcButton.top + rcButton.Height()/2 - 2 + i);pDC->LineTo( rcButton.left + 3 + 7 - i, rcButton.top + rcButton.Height()/2 - 2 + i);if (!IsWindowEnabled())pDC->SetPixel(rcButton.left + 3 + 7 - i, rcButton.top + rcButton.Height()/2 - 2 + i + 1, 0xFFFFFF);}pDC->SelectObject(ppenOld);}//#######################################################################################void CCheckComboBox::AddString(LPCTSTR lpszString, CString strID, long nLevel){//## IF is the first item => add rootif (m_Data.GetSize() == 0)m_Data.AddString(lpszString, INVALID_ID, ROOT_LEVEL);//## ADDm_Data.AddString(lpszString, strID, nLevel);}//## ====================================================================================void CCheckComboBox::CheckAll(BOOL bCheck){m_Data.CheckAll(bCheck);UpdateCaption();}//## ====================================================================================void CCheckComboBox::SetChecks(CString strIDs, BOOL bCheck){m_Data.SetChecks(strIDs, bCheck);UpdateCaption();}//## ====================================================================================BOOL CCheckComboBox::GetCheck(CString strID){return m_Data.GetCheck(strID);}//## ====================================================================================int CCheckComboBox::GetCount(){return m_Data.GetSize();}//## ====================================================================================CString CCheckComboBox::GetCheckedIDs(){return m_Data.GetCheckedIDs();}CString CCheckComboBox::GetCheckedTexts(){return m_Data.GetCheckedTexts();}//## ====================================================================================void CCheckComboBox::UpdateCaption(){//## CAPTIONCString str = m_Data.GetCheckedTexts();SetWindowText(str);//## ASSERTif (!::IsWindow(m_ToolTip.m_hWnd)) InitToolTip();if (!::IsWindow(m_ToolTip.m_hWnd)) return;//## TOOLTIPm_ToolTip.SetMaxTipWidth( TOOLTIP_MAX_WIDTH );if (str.GetLength() > TOOLTIP_MAX_CHARACTERS)str = str.Mid(0, (TOOLTIP_MAX_CHARACTERS-3)) + "...";SetToolTipText( str );}//#######################################################################################void CCheckComboBox::SetImageList(CImageList *pimgList){//## SET ImageListm_imgList.Create( pimgList );}//## ====================================================================================CImageList* CCheckComboBox::GetImageList(){//## ASSERTif ((HIMAGELIST)m_imgList) return &m_imgList;return NULL;}//#######################################################################################void CCheckComboBox::ShowDropWnd(){//## ASSERTif (!m_pwndTree) CreateDropWnd();if (!m_pwndTree) return;//## PLACE TreePlaceDropWnd();//## DROPDrop( !IsDropped() );}//## ====================================================================================void CCheckComboBox::CreateDropWnd(){//## ASSERTif (m_pwndTree) return;//## CREATE Treem_pwndTree = new CCheckTreeCtrl;// m_pwndTree->CreateEx( WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR | WS_EX_TOOLWINDOW,// WC_TREEVIEW,// NULL,// WS_CHILD | WS_BORDER |// WS_CLIPSIBLINGS | WS_OVERLAPPED |// TVS_HASBUTTONS | TVS_HASLINES | TVS_CHECKBOXES | TVS_DISABLEDRAGDROP |// TVS_SHOWSELALWAYS | TVS_FULLROWSELECT,// CRect(0, 0, 0, 0),// GetDesktopWindow(),// 0x3E8,// NULL);m_pwndTree->CreateEx( WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR | WS_EX_TOOLWINDOW,WS_CHILD | WS_BORDER |WS_CLIPSIBLINGS | WS_OVERLAPPED |TVS_HASBUTTONS | TVS_HASLINES | TVS_CHECKBOXES | TVS_DISABLEDRAGDROP |TVS_SHOWSELALWAYS | TVS_FULLROWSELECT,CRect(0, 0, 0, 0),GetDesktopWindow(),0x3E8);//## MOVE on topm_pwndTree->SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);//## SET Parentm_pwndTree->SetParentCombo( this );m_pwndTree->EnableSendMsgToParent(m_bSendMsgToParent);//## ATTACH ImageList// if (GetImageList())// m_pwndTree->SetImageList( GetImageList(), TVSIL_NORMAL );//## POPULATEm_pwndTree->Populate();}//## ====================================================================================void CCheckComboBox::PlaceDropWnd(){//## ASSERTif (!m_pwndTree) CreateDropWnd();if (!m_pwndTree) return;//## GET ComboRectCRect rc;GetWindowRect(&rc);//## MOVE Treem_pwndTree->MoveWindow(rc.left, rc.bottom, GetDroppedWidth(), DROPDOWN_HEIGHT);}//## ====================================================================================BOOL CCheckComboBox::IsDropped(){//## ASSERTif (!m_pwndTree) return FALSE;//## RETURNreturn ( m_pwndTree->IsWindowVisible() );}//## ====================================================================================void CCheckComboBox::Drop(BOOL bDrop){//## ASSERTif (!m_pwndTree) return;//## DROP/UNDROPif (bDrop){//## ASSERTHideActiveDropDown();//## INTERCEPT parent messages// if (!m_parentWndProc) InterceptParentWndProc();//## STRANGE (I do not know why... but without an image list, the following lines are needed)if (!(HIMAGELIST)m_imgList){m_pwndTree->ShowWindow( SW_SHOW );m_pwndTree->UpdateFromState();}//## UPDATEm_pwndTree->UpdateFromState();//## SHOW Windowm_pwndTree->ShowWindow( SW_SHOW );m_pwndTree->SetFocus();//## SET Active DropDownm_pwndActiveDropDown = m_pwndTree;m_pwndActiveCheckComboBox = this;//## TOOLTIPSetToolTipText( "" );//## TO BE SURE (if our combo is in a FormView)if (this->GetParent())this->GetParent()->GetWindowRect( &m_rcParentRect );}else{//## ASSERTHideActiveDropDown();//## HIDE Windowm_pwndTree->ShowWindow( SW_HIDE );//## CAPTIONUpdateCaption();}}//## ====================================================================================void CCheckComboBox::HideActiveDropDown(){//## ASSERTif (!m_pwndActiveDropDown) return;//## HIDE Windowm_pwndActiveDropDown->ShowWindow( SW_HIDE );m_pwndActiveDropDown = NULL;//## CAPTIONif (m_pwndActiveCheckComboBox){m_pwndActiveCheckComboBox->UpdateCaption();m_pwndActiveCheckComboBox = NULL;}}//#######################################################################################void CCheckComboBox::InterceptParentWndProc(){//## ASSERTif (m_parentWndProc) return;//## ASSERTCWnd *pwndParent = GetParent();if (!pwndParent) return;if (!pwndParent->GetSafeHwnd()) return;//## GET Parent WinProc & SET our functionm_parentWndProc = (WNDPROC)::SetWindowLong(pwndParent->GetSafeHwnd(), GWL_WNDPROC, (long)(WNDPROC)ParentWindowProc);}//## ====================================================================================void CCheckComboBox::UnInterceptParentWndProc(){//## ASSERTif (!m_parentWndProc) return;//## ASSERTCWnd *pwndParent = GetParent();if (!pwndParent) return;if (!pwndParent->GetSafeHwnd()) return;//## SET Parent WinProc = UNINTERCEPT(WNDPROC)::SetWindowLong(pwndParent->GetSafeHwnd(), GWL_WNDPROC, (long)(WNDPROC)m_parentWndProc);m_parentWndProc = NULL;}//## ====================================================================================LRESULT CALLBACK CCheckComboBox::ParentWindowProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam){//## CHECK Messageswitch (nMsg){case WM_COMMAND:case WM_SYSCOMMAND:case WM_SYSKEYDOWN:case WM_LBUTTONDOWN:case WM_NCLBUTTONDOWN:case WM_WINDOWPOSCHANGING:case WM_WINDOWPOSCHANGED://## FILTER Messagesif (IsMsgOK(hWnd, nMsg,/* wParam,*/ lParam)) break;//## HIDE Active DropDownHideActiveDropDown();break;case WM_PAINT://## TO BE SURE (if our combo is in a FormView)if (m_pwndActiveCheckComboBox)if (m_pwndActiveCheckComboBox->GetParent()){CRect rcParent;m_pwndActiveCheckComboBox->GetParent()->GetWindowRect( &rcParent );if ((rcParent.top != m_rcParentRect.top) || (rcParent.left != m_rcParentRect.left))HideActiveDropDown();}break;}//## CALL Parentif(!m_parentWndProc) return NULL;return CallWindowProc( m_parentWndProc, hWnd, nMsg, wParam, lParam );}//## ====================================================================================BOOL CCheckComboBox::IsMsgOK(HWND hWnd, UINT nMsg, /*WPARAM wParam,*/ LPARAM lParam){//## ASSERTif (!hWnd) return FALSE;if (nMsg != WM_COMMAND) return FALSE;if (!m_pwndActiveDropDown) return FALSE;if ((HWND)lParam != m_pwndActiveCheckComboBox->GetSafeHwnd()) return FALSE;//## GET DropDownRectCRect rc;m_pwndActiveCheckComboBox->GetWindowRect( rc );//## GET MousePosCPoint pt;::GetCursorPos( &pt );//## CHECK is in rectif (pt.x < rc.left) return FALSE;if (pt.x > rc.right) return FALSE;if (pt.y < rc.top) return FALSE;if (pt.y > rc.bottom) return FALSE;//## FINALLYreturn TRUE;}//## ====================================================================================UINT CCheckComboBox::OnGetDlgCode(){return DLGC_WANTARROWS | DLGC_WANTCHARS | CButton::OnGetDlgCode();}//#######################################################################################void CCheckComboBox::OnKillFocus(CWnd* pNewWnd){//## CALL ParentCButton::OnKillFocus(pNewWnd);//## HIDE Active DropDownHideActiveDropDown();}//#######################################################################################void CCheckComboBox::InitToolTip(){if (m_ToolTip.m_hWnd == NULL){try{m_ToolTip.Create(this);m_ToolTip.Activate(FALSE);}catch(...){};}}//## ====================================================================================void CCheckComboBox::SetToolTipText(int nId, BOOL bActivate){//## LOAD StringCString strText;strText.LoadString(nId);//## SET Tooltipif (strText.IsEmpty() == FALSE) SetToolTipText(strText, bActivate);}//## ====================================================================================void CCheckComboBox::SetToolTipText(CString strText, BOOL bActivate){//## INITIALIZE ToolTipInitToolTip();//## IF there is no tooltip defined then add itif (m_ToolTip.GetToolCount() == 0){CRect rectBtn;GetClientRect(rectBtn);m_ToolTip.AddTool(this, (LPCTSTR)strText, rectBtn, 1);}//## SET text for tooltipm_ToolTip.UpdateTipText((LPCTSTR)strText, this, 1);m_ToolTip.Activate(bActivate);}//#######################################################################################long CCheckComboBox::GetDroppedWidth(){//## ASSERTif (m_nDroppedWidth != DROPPED_WIDTH_NOT_SET) return m_nDroppedWidth;if (!m_hWnd) return DROPPED_WIDTH_NOT_SET;//## GET ComboRectCRect rc;GetWindowRect(&rc);//## SET, RETURN DroppedWidthm_nDroppedWidth = rc.Width();return m_nDroppedWidth;}//## ====================================================================================void CCheckComboBox::SetDroppedWidth(long nWidth){m_nDroppedWidth = nWidth;}//#######################################################################################void CCheckComboBox::EnableSendMsgToParent(BOOL bEnable/* =TRUE */){m_bSendMsgToParent=bEnable;}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。