📄 sliderctrl.cpp
字号:
DrawGripPosition(&dcMem, m_nPixelRight, m_nPosRight); } } } pDC->BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &dcMem, 0, 0, SRCCOPY); // Clean up. dcMem.SelectObject(pOldBmp); dcMem.RestoreDC(nSaveDC); dcMem.DeleteDC(); bmpMem.DeleteObject(); return TRUE;}/////////////////////////////////////////////////////////////////////////////// 侨伎俊 狼秦 函窍绰 葛剧阑 弊妨霖促. 侨伎篮 函沁绰单 角力 困摹蔼篮 函窍瘤 臼阑锭绰// 皋矫瘤甫 焊郴瘤 臼扁 困秦 馆券 蔼捞 0焊促 累栏搁 拳搁俊 grip狼 困摹绰 官布绰单// position函荐 蔼篮 函窍瘤 臼疽促// 0 : left, 1 : right, 2 : Center, 3 : left-center, 4 : center-right, 5 : left-right-centerint RxSliderCtrl::EraseBkgnd(int nIndex){ int nReturn = 0; CDC *pDC = GetDC(); CRect rcClient, rcTemp; GetClientRect(rcClient); // Create a mem DC for drawing CDC dcMem; CBitmap bmpMem; dcMem.CreateCompatibleDC(pDC); bmpMem.CreateCompatibleBitmap(pDC, rcClient.Width(), rcClient.Height()); CBitmap *pOldBmp = dcMem.SelectObject(&bmpMem); int nSaveDC = dcMem.SaveDC(); // Draw Background DrawBack(&dcMem, rcClient); if(m_dwExStyle & RXSC_GC_SINGLE) { int nOldPos = m_nPosLeft; rcTemp = GetGripRect(m_nPixelLeft); DrawGrip(&dcMem, rcTemp, (m_nSelGrip == RXSC_MOUSE_GRIP_LEFT)); m_nPosLeft = PosToPixel(m_nPixelLeft, m_nPixelMin, m_nPixelMax-RXSC_GRIP_WIDTH, FALSE); if(nOldPos != m_nPosLeft) nReturn++; if(m_dwExStyle & RXSC_CD_SHOW) DrawGripPosition(&dcMem, m_nPixelLeft, m_nPosLeft, TRUE); } else if(m_dwExStyle & RXSC_GC_MULTI) { // draw selected bar region rcTemp = GetGripRect(m_nPixelLeft, TRUE); rcTemp.SetRect(rcTemp.right, rcTemp.top, m_nPixelRight, rcTemp.bottom); dcMem.FillSolidRect(rcTemp, m_crNSel); // draw left grip rcTemp = GetGripRect(m_nPixelLeft); DrawGrip(&dcMem, rcTemp, (m_nSelGrip == RXSC_MOUSE_GRIP_LEFT || m_nSelGrip == RXSC_MOUSE_GRIP_REGION)); if(nIndex == 0 || nIndex == 5) { int nOldPos = m_nPosLeft; m_nPosLeft = PosToPixel(m_nPixelLeft, m_nPixelMin, m_nPixelMax-(RXSC_GRIP_WIDTH*2), FALSE); if(nOldPos != m_nPosLeft) nReturn++; } // draw right grip rcTemp = GetGripRect(m_nPixelRight); DrawGrip(&dcMem, rcTemp, (m_nSelGrip == RXSC_MOUSE_GRIP_RIGHT || m_nSelGrip == RXSC_MOUSE_GRIP_REGION)); if(nIndex == 1 || nIndex == 5) { int nOldPos = m_nPosRight; m_nPosRight = PosToPixel(m_nPixelRight, m_nPixelMin+RXSC_GRIP_WIDTH, m_nPixelMax-RXSC_GRIP_WIDTH, FALSE); if(nOldPos != m_nPosRight) nReturn++; } if(m_dwExStyle & RXSC_CD_SHOW) { if(m_nSelText == RXSC_MOUSE_GRIP_LEFT) { DrawGripPosition(&dcMem, m_nPixelRight, m_nPosRight); DrawGripPosition(&dcMem, m_nPixelLeft, m_nPosLeft, TRUE); } else if(m_nSelText == RXSC_MOUSE_GRIP_RIGHT) { DrawGripPosition(&dcMem, m_nPixelLeft, m_nPosLeft); DrawGripPosition(&dcMem, m_nPixelRight, m_nPosRight, TRUE); } else { DrawGripPosition(&dcMem, m_nPixelLeft, m_nPosLeft); DrawGripPosition(&dcMem, m_nPixelRight, m_nPosRight); } } } else if(m_dwExStyle & RXSC_GC_MULTI_EX) { // draw selected bar region rcTemp = GetGripRect(m_nPixelLeft, TRUE); rcTemp.SetRect(rcTemp.right, rcTemp.top, m_nPixelRight, rcTemp.bottom); dcMem.FillSolidRect(rcTemp, m_crNSel); // draw left grip rcTemp = GetGripRect(m_nPixelLeft); DrawGrip(&dcMem, rcTemp, (m_nSelGrip == RXSC_MOUSE_GRIP_LEFT || m_nSelGrip == RXSC_MOUSE_GRIP_REGION)); if(nIndex == 0 || nIndex == 3 || nIndex == 5) { int nOldPos = m_nPosLeft; m_nPosLeft = PosToPixel(m_nPixelLeft, m_nPixelMin, m_nPixelMax-(RXSC_GRIP_WIDTH*3), FALSE); if(nOldPos != m_nPosLeft) nReturn++; } // draw right grip rcTemp = GetGripRect(m_nPixelRight); DrawGrip(&dcMem, rcTemp, (m_nSelGrip == RXSC_MOUSE_GRIP_RIGHT || m_nSelGrip == RXSC_MOUSE_GRIP_REGION)); if(nIndex == 1 || nIndex == 4 || nIndex == 5) { int nOldPos = m_nPosRight; m_nPosRight = PosToPixel(m_nPixelRight, m_nPixelMin+(RXSC_GRIP_WIDTH*2), m_nPixelMax-RXSC_GRIP_WIDTH, FALSE); if(nOldPos != m_nPosRight) nReturn++; } // draw center grip rcTemp = GetGripRect(m_nPixelCenter, TRUE); DrawCenterGrip(&dcMem, rcTemp, (m_nSelGrip == RXSC_MOUSE_GRIP_CENTER || m_nSelGrip == RXSC_MOUSE_GRIP_REGION)); if(nIndex >= 2 && nIndex <= 5) { int nOldPos = m_nPosCenter; m_nPosCenter = PosToPixel(m_nPixelCenter, m_nPixelMin+RXSC_GRIP_WIDTH, m_nPixelMax-(RXSC_GRIP_WIDTH*2), FALSE); if(nOldPos != m_nPosCenter) nReturn++; } if(m_dwExStyle & RXSC_CD_SHOW) { if(m_nSelText == RXSC_MOUSE_GRIP_LEFT) { DrawGripPosition(&dcMem, m_nPixelRight, m_nPosRight); DrawGripPosition(&dcMem, m_nPixelCenter, m_nPosCenter); DrawGripPosition(&dcMem, m_nPixelLeft, m_nPosLeft, TRUE); } else if(m_nSelText == RXSC_MOUSE_GRIP_CENTER) { DrawGripPosition(&dcMem, m_nPixelRight, m_nPosRight); DrawGripPosition(&dcMem, m_nPixelLeft, m_nPosLeft); DrawGripPosition(&dcMem, m_nPixelCenter, m_nPosCenter, TRUE); } else if(m_nSelText == RXSC_MOUSE_GRIP_RIGHT) { DrawGripPosition(&dcMem, m_nPixelLeft, m_nPosLeft); DrawGripPosition(&dcMem, m_nPixelCenter, m_nPosCenter); DrawGripPosition(&dcMem, m_nPixelRight, m_nPosRight, TRUE); } else { DrawGripPosition(&dcMem, m_nPixelLeft, m_nPosLeft); DrawGripPosition(&dcMem, m_nPixelCenter, m_nPosCenter); DrawGripPosition(&dcMem, m_nPixelRight, m_nPosRight); } } } pDC->BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &dcMem, 0, 0, SRCCOPY); // Clean up. dcMem.SelectObject(pOldBmp); dcMem.RestoreDC(nSaveDC); dcMem.DeleteDC(); bmpMem.DeleteObject(); ReleaseDC(pDC); return nReturn;}// fill the hold background and draw center barvoid RxSliderCtrl::DrawBack(CDC *pDC, CRect rect){ CRect rcTemp; // Fill the hole background CBrush brush, *pOldBrush; brush.CreateSolidBrush(m_crBkgnd); pOldBrush = pDC->SelectObject(&brush); pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY); pDC->SelectObject(pOldBrush); brush.DeleteObject(); // draw border around a hole control if(m_dwExStyle & RXSC_BS_OVER) pDC->Draw3dRect(rect, RGB(255,255,255), RGB( 0, 0, 0)); else if(m_dwExStyle & RXSC_BS_UNDER) pDC->Draw3dRect(rect, RGB( 0, 0, 0), RGB(255,255,255)); // draw axis int nCenter; if(m_dwExStyle & RXSC_CD_SHOW) nCenter = rect.top + RXSC_MARGIN + RXSC_TOOLTIP_MARGIN + (RXSC_GRIP_HEIGHT / 2); else nCenter = rect.top + RXSC_MARGIN + (RXSC_GRIP_HEIGHT / 2); rcTemp.SetRect(rect.left+RXSC_MARGIN, nCenter-m_nBarThickness, rect.right-RXSC_MARGIN, nCenter+m_nBarThickness); brush.CreateSolidBrush(IsWindowEnabled() ? m_crNFace : m_crDFace); pOldBrush = pDC->SelectObject(&brush); pDC->PatBlt(rcTemp.left, rcTemp.top, rcTemp.Width(), rcTemp.Height(), PATCOPY); pDC->SelectObject(pOldBrush); brush.DeleteObject(); // draw border around the center bar pDC->Draw3dRect(rcTemp, RGB( 0, 0, 0), RGB( 0, 0, 0));}// RXSC_GA_BOTH, RXSC_GA_UP, RXSC_GA_DOWNvoid RxSliderCtrl::DrawGrip(CDC *pDC, CRect rect, BOOL bCheck){ if(m_dwExStyle & RXSC_GA_BOTH) { pDC->Draw3dRect(rect, RGB( 0, 0, 0), RGB( 0, 0, 0)); rect.DeflateRect(1,1,1,1); if(!IsWindowEnabled()) // Disable { pDC->Draw3dRect(rect, RGB(255,255,255), RGB(255,255,255)); rect.DeflateRect(1,1,1,1); pDC->FillSolidRect(rect, m_crDGrip); } else if(!bCheck) // Normal { pDC->Draw3dRect(rect, RGB(255,255,255), RGB( 92, 92, 92)); rect.DeflateRect(1,1,1,1); pDC->FillSolidRect(rect, m_crNGrip); } else // Select { pDC->Draw3dRect(rect, RGB( 92, 92, 92), RGB(255,255,255)); rect.DeflateRect(1,1,1,1); pDC->FillSolidRect(rect, m_crSGrip); } } else if(m_dwExStyle & RXSC_GA_UP) { // Draw Edge pDC->BeginPath(); pDC->MoveTo(rect.left, rect.bottom-1); pDC->LineTo(rect.left, rect.top+5); pDC->LineTo(rect.CenterPoint().x, rect.top); pDC->LineTo(rect.right-1, rect.top+5); pDC->LineTo(rect.right-1, rect.bottom-1); pDC->EndPath(); CPen pen, *pOldPen; pen.CreatePen(PS_SOLID, 1, RGB( 0, 0, 0)); CBrush brush, *pOldBrush; if(!IsWindowEnabled()) brush.CreateSolidBrush(m_crDGrip); else if(!bCheck) brush.CreateSolidBrush(m_crNGrip); else brush.CreateSolidBrush(m_crSGrip); pOldPen = pDC->SelectObject(&pen); pOldBrush = pDC->SelectObject(&brush); pDC->StrokeAndFillPath(); pDC->SelectObject(pOldPen); pDC->SelectObject(pOldBrush); pen.DeleteObject(); brush.DeleteObject(); if(!IsWindowEnabled()) { pen.CreatePen(PS_SOLID, 1, RGB(255,255,255)); pOldPen = pDC->SelectObject(&pen); pDC->MoveTo(rect.left+1, rect.bottom-2); pDC->LineTo(rect.left+1, rect.top+5); pDC->LineTo(rect.CenterPoint().x, rect.top+1); pDC->LineTo(rect.right-2, rect.top+5); pDC->LineTo(rect.right-2, rect.bottom-2); pDC->LineTo(rect.left+1, rect.bottom-2); pDC->SelectObject(pOldPen); pen.DeleteObject(); } else if(!bCheck) { pen.CreatePen(PS_SOLID, 1, RGB(255,255,255)); pOldPen = pDC->SelectObject(&pen); pDC->MoveTo(rect.left+1, rect.bottom-2); pDC->LineTo(rect.left+1, rect.top+5); pDC->LineTo(rect.CenterPoint().x, rect.top+1); pDC->SelectObject(pOldPen); pen.DeleteObject(); } else { pen.CreatePen(PS_SOLID, 1, RGB(255,255,255)); pOldPen = pDC->SelectObject(&pen); pDC->MoveTo(rect.right-2, rect.top+5); pDC->LineTo(rect.right-2, rect.bottom-2); pDC->LineTo(rect.left+1, rect.bottom-2); pDC->SelectObject(pOldPen); pen.DeleteObject(); } } else if(m_dwExStyle & RXSC_GA_DOWN) { // Draw Edge pDC->BeginPath(); pDC->MoveTo(rect.left, rect.top+1); pDC->LineTo(rect.left, rect.bottom-5); pDC->LineTo(rect.CenterPoint().x, rect.bottom); pDC->LineTo(rect.right-1, rect.bottom-5); pDC->LineTo(rect.right-1, rect.top+1); pDC->LineTo(rect.left, rect.top+1); pDC->EndPath(); CPen pen, *pOldPen; pen.CreatePen(PS_SOLID, 1, RGB( 0, 0, 0)); CBrush brush, *pOldBrush; if(!IsWindowEnabled()) brush.CreateSolidBrush(m_crDGrip); else if(!bCheck) brush.CreateSolidBrush(m_crNGrip); else brush.CreateSolidBrush(m_crSGrip); pOldPen = pDC->SelectObject(&pen); pOldBrush = pDC->SelectObject(&brush); pDC->StrokeAndFillPath(); pDC->SelectObject(pOldPen); pDC->SelectObject(pOldBrush); pen.DeleteObject(); brush.DeleteObject(); if(!IsWindowEnabled()) { pen.CreatePen(PS_SOLID, 1, RGB(255,255,255)); pOldPen = pDC->SelectObject(&pen); pDC->MoveTo(rect.left+1, rect.top+2); pDC->LineTo(rect.left+1, rect.bottom-5); pDC->LineTo(rect.CenterPoint().x, rect.bottom-1); pDC->LineTo(rect.right-2, rect.bottom-5); pDC->LineTo(rect.right-2, rect.top+2); pDC->LineTo(rect.left+1, rect.top+2); pDC->SelectObject(pOldPen); pen.DeleteObject(); } else if(!bCheck) { pen.CreatePen(PS_SOLID, 1, RGB(255,255,255)); pOldPen = pDC->SelectObject(&pen); pDC->MoveTo(rect.left+1, rect.top+2); pDC->LineTo(rect.left+1, rect.bottom-5); pDC->MoveTo(rect.left+1, rect.top+2); pDC->LineTo(rect.right-2, rect.top+2); pDC->SelectObject(pOldPen); pen.DeleteObject(); } else { pen.CreatePen(PS_SOLID, 1, RGB(255,255,255)); pOldPen = pDC->SelectObject(&pen); pDC->MoveTo(rect.CenterPoint().x, rect.bottom-1); pDC->LineTo(rect.right-2, rect.bottom-5); pDC->LineTo(rect.right-2, rect.top+2); pDC->SelectObject(pOldPen); pen.DeleteObject(); } }}void RxSliderCtrl::DrawCenterGrip(CDC *pDC, CRect rect, BOOL bCheck){ pDC->FillSolidRect(rect, (bCheck ? m_crSCGrip : m_crNCGrip)); pDC->Draw3dRect(rect, RGB(255,255,255), RGB(255,255,255));}void RxSliderCtrl::DrawGripPosition(CDC *pDC, int nPixel, int nPos, BOOL bFocus){ CFont font, *pOldFont; int nHeight = -((pDC->GetDeviceCaps(LOGPIXELSY) * 8) / 72); font.CreateFont(nHeight, 0, 0, 0, FW_BOLD, 0, 0, 0, DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE, _T("Arial")); pOldFont = pDC->SelectObject(&font); pDC->SetTextColor(RGB( 0, 0, 0)); pDC->SetBkMode(TRANSPARENT); CString strTemp; CSize szText; CRect rcClient, rcTemp; GetClientRect(rcClient); int nTop = rcClient.top+RXSC_MARGIN; int nLeft; int nCenter; strTemp.Format(_T("%d"), nPos); szText = pDC->GetTextExtent(strTemp); szText.cx += 6; nCenter = szText.cx / 2 - 5; nLeft = rcClient.left+nPixel-nCenter; if(nLeft < RXSC_MARGIN) nLeft = RXSC_MARGIN; if((nLeft+szText.cx) > (rcClient.right-RXSC_MARGIN)) nLeft = rcClient.right-RXSC_MARGIN-szText.cx; rcTemp.SetRect(nLeft, nTop, nLeft+szText.cx, nTop+szText.cy); CPen pen, *pOldPen; CBrush brush, *pOldBrush; pen.CreatePen(PS_SOLID, 1, RGB( 0, 0, 0)); brush.CreateSolidBrush(bFocus ? RGB(255,255, 230) : RGB(200,200, 100)); pOldPen = pDC->SelectObject(&pen); pOldBrush = pDC->SelectObject(&brush); pDC->Rectangle(rcTemp); pDC->DrawText(strTemp, rcTemp, DT_SINGLELINE|DT_VCENTER|DT_CENTER); pDC->SelectObject(pOldPen); pDC->SelectObject(pOldBrush); pen.DeleteObject(); brush.DeleteObject(); pDC->SelectObject(pOldFont); font.DeleteObject();}/////////////////////////////////////////////////////////////////////////////int RxSliderCtrl::PosToPixel(int nValue, int nPixelMin, int nPixelMax, BOOL bPosToPixel){ int nReturn; float fRatio = (float)(nPixelMax - nPixelMin) / (float)(m_nPosMax - m_nPosMin); if(bPosToPixel) { if(nValue >= m_nPosMax) nReturn = nPixelMax; else if(nValue <= m_nPosMin) nReturn = nPixelMin; else nReturn = (int)((nValue - m_nPosMin) * fRatio + nPixelMin + 0.5f); // Pos ==> Pixel } else { if(nValue >= m_nPixelMax) nReturn = m_nPosMax; else if(nValue <= m_nPixelMin) nReturn = m_nPosMin; else nReturn = (int)((nValue - nPixelMin) / fRatio + m_nPosMin + 0.5f); // Pixel ==> Pos } return nReturn;}int RxSliderCtrl::HitTest(CPoint point){ CRect rcTemp; if(m_dwExStyle & RXSC_GC_SINGLE) { rcTemp = GetGripRect(m_nPixelLeft); if(rcTemp.PtInRect(point)) return RXSC_MOUSE_GRIP_LEFT; } else if(m_dwExStyle & RXSC_GC_MULTI) { rcTemp = GetGripRect(m_nPixelLeft); if(rcTemp.PtInRect(point)) return RXSC_MOUSE_GRIP_LEFT; rcTemp = GetGripRect(m_nPixelRight); if(rcTemp.PtInRect(point)) return RXSC_MOUSE_GRIP_RIGHT; rcTemp = GetGripRect(m_nPixelLeft); rcTemp.SetRect(rcTemp.right, rcTemp.top, m_nPixelRight, rcTemp.bottom); if(rcTemp.PtInRect(point)) return RXSC_MOUSE_GRIP_REGION; } else if(m_dwExStyle & RXSC_GC_MULTI_EX) { rcTemp = GetGripRect(m_nPixelLeft); if(rcTemp.PtInRect(point)) return RXSC_MOUSE_GRIP_LEFT; rcTemp = GetGripRect(m_nPixelRight); if(rcTemp.PtInRect(point)) return RXSC_MOUSE_GRIP_RIGHT; rcTemp = GetGripRect(m_nPixelCenter, TRUE); if(rcTemp.PtInRect(point)) return RXSC_MOUSE_GRIP_CENTER; rcTemp = GetGripRect(m_nPixelLeft); rcTemp.SetRect(rcTemp.right, rcTemp.top, m_nPixelRight, rcTemp.bottom); if(rcTemp.PtInRect(point)) return RXSC_MOUSE_GRIP_REGION; } return -1;}CRect RxSliderCtrl::GetGripRect(int nPixel, BOOL bCenter){ CRect rcClient, rcGrip; GetClientRect(rcClient); int nTemp; if(bCenter) { if(m_dwExStyle & RXSC_CD_SHOW) nTemp = rcClient.top + RXSC_MARGIN + RXSC_TOOLTIP_MARGIN + (RXSC_GRIP_HEIGHT / 2); else nTemp = rcClient.top + RXSC_MARGIN + (RXSC_GRIP_HEIGHT / 2); rcGrip.SetRect(nPixel, nTemp-m_nBarThickness+1, nPixel+RXSC_GRIP_WIDTH, nTemp+m_nBarThickness-1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -