⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 util_clr.cpp

📁 比较详尽的介绍了短信的发送与接收的实现模块与程序
💻 CPP
字号:

// util_clr.cpp

#include "stdafx.h"
#include "util_clr.h"
#include "util_mdc.h"
#include "util_gdi.h"




#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


GColorComboBox::GColorComboBox()
{
   m_cl = RGB(0,0,0);
}

GColorComboBox::~GColorComboBox()
{
}



void GColorComboBox::SetColor(COLORREF clInit)
{
   m_cl = clInit;
}

COLORREF GColorComboBox::GetColor() const
{
   return m_cl;
}


void GColorComboBox::UpdateColor(COLORREF clUpdate)
{
   if(clUpdate != m_cl)
   {
      m_cl = clUpdate;
      Invalidate();
   
      int nChildID = GetDlgCtrlID();
      WPARAM wParam = MAKEWPARAM((WORD)nChildID, CCN_SELCHANGE);

      GetParent()->SendMessage(WM_COMMAND, wParam, (LPARAM)m_hWnd);
   }
}


BEGIN_MESSAGE_MAP(GColorComboBox, CWnd)
   ON_WM_LBUTTONDOWN()
   ON_WM_PAINT()
   ON_WM_ERASEBKGND()
END_MESSAGE_MAP()




BOOL GColorComboBox::Create(DWORD dwStyle, const RECT& rect,
                            CWnd *pParentWnd, UINT nID)
{
   return CWnd::Create(NULL, NULL, dwStyle, rect, pParentWnd, nID);
}




void GColorComboBox::OnLButtonDown(UINT nFlags, CPoint pt)
{
   CRect cr;
   GetClientRect(cr);
   cr.right -= CCBDIM_CXEDGE;
   cr.left = cr.right - CCBDIM_CXARROW -
             CCBDIM_CXBORDER - CCBDIM_CXSPACERIGHT;
   cr.top += CCBDIM_CYEDGE;
   cr.bottom -= CCBDIM_CYEDGE;

   if(cr.PtInRect(pt))
   {
      CRect wr;
      GetWindowRect(wr);

      WNDCLASS wndcls;
      memset(&wndcls, 0, sizeof(wndcls));

      wndcls.lpszClassName = "GPopupColorCtrl";
      wndcls.lpfnWndProc = AfxWndProc;
      wndcls.hInstance = AfxGetInstanceHandle();
      
      if(AfxRegisterClass(&wndcls))
      {
         GPopupColorCtrl *pPopup = new GPopupColorCtrl(m_cl, this);
         pPopup->CreateEx(0, wndcls.lpszClassName, NULL, WS_BORDER|WS_POPUP, 
                            wr.left, wr.bottom+2, 0, 0, AfxGetMainWnd()->m_hWnd, 0, NULL);
      }
   }
}

                       

void GColorComboBox::OnPaint()
{
   CPaintDC dc(this);
   
   GMemDC memDC;
   CBrush brush(GetSysColor(COLOR_BTNFACE));

   CRect cr;
   GetClientRect(cr);

   if(memDC.Create(&dc, cr, &brush))
   {
      CDC *pDC = &memDC;
      
      CRect rectDraw(cr);

      rectDraw.DeflateRect(1,1);
      CPen penBlack(PS_SOLID, 1, RGB(0,0,0));
      CPen penDarkGray(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW));
      CPen penWhite(PS_SOLID, 1, RGB(255,255,255));
      CPen penGray(PS_SOLID, 1, GetSysColor(COLOR_BTNFACE));

      // draw the borders
      CPen *pOldPen = pDC->SelectObject(&penGray);

      pDC->MoveTo(rectDraw.left, rectDraw.top);
      pDC->LineTo(rectDraw.right, rectDraw.top);
      pDC->MoveTo(rectDraw.left, rectDraw.top);
      pDC->LineTo(rectDraw.left, rectDraw.bottom);

      pDC->SelectObject(&penWhite);

      rectDraw.DeflateRect(1, 1);
      pDC->MoveTo(rectDraw.left, rectDraw.top);
      pDC->LineTo(rectDraw.right, rectDraw.top);
      pDC->MoveTo(rectDraw.left, rectDraw.top);
      pDC->LineTo(rectDraw.left, rectDraw.bottom);

      pDC->SelectObject(&penBlack);

      rectDraw.InflateRect(1, 1);
      pDC->MoveTo(rectDraw.right, rectDraw.top);
      pDC->LineTo(rectDraw.right, rectDraw.bottom+1);
      pDC->MoveTo(rectDraw.left, rectDraw.bottom);
      pDC->LineTo(rectDraw.right, rectDraw.bottom);

      pDC->SelectObject(&penDarkGray);

      rectDraw.DeflateRect(1, 1);
      pDC->MoveTo(rectDraw.right, rectDraw.top);
      pDC->LineTo(rectDraw.right, rectDraw.bottom+1);
      pDC->MoveTo(rectDraw.left, rectDraw.bottom);
      pDC->LineTo(rectDraw.right, rectDraw.bottom);


      // draw arrow
      pDC->SelectObject(&penBlack);

      int nEnd = rectDraw.right - CCBDIM_CXEDGE - 
                 CCBDIM_CXBORDER;
      int nStart = nEnd - CCBDIM_CXARROW;
      int nMiddle = cr.top + (cr.Height()/2);

      pDC->MoveTo(nStart, nMiddle-1);
      pDC->LineTo(nEnd, nMiddle-1);

      nStart++;
      nEnd--;
      pDC->MoveTo(nStart, nMiddle);
      pDC->LineTo(nEnd, nMiddle);

      nStart++;
      nEnd--;
      pDC->MoveTo(nStart, nMiddle+1);
      pDC->LineTo(nEnd, nMiddle+1);

      // draw dividers
      nEnd = rectDraw.right - CCBDIM_CXEDGE - 
                 CCBDIM_CXBORDER - CCBDIM_CXARROW -
                 CCBDIM_CXSPACERIGHT - 1;

      pDC->SelectObject(&penWhite);

      int nTop = cr.top + CCBDIM_CYEDGE + CCBDIM_CYBORDER;
      int nBottom = (cr.bottom - CCBDIM_CYEDGE) - CCBDIM_CYBORDER;
      pDC->MoveTo(nEnd, nTop);
      pDC->LineTo(nEnd, nBottom);

      pDC->SelectObject(&penDarkGray);

      nEnd--;
      pDC->MoveTo(nEnd, nTop);
      pDC->LineTo(nEnd, nBottom);

      // draw color rectangle
      nEnd -= CCBDIM_CXSPACELEFT;

      CRect rectColor(cr);
      rectColor.DeflateRect(1,1);

      rectColor.right = nEnd;
      rectColor.left += cr.left + CCBDIM_CXEDGE + CCBDIM_CXBORDER;
      rectColor.top = nTop;
      rectColor.bottom = nBottom;

      pDC->SelectObject(&penBlack);

      CBrush brush(m_cl);
      CBrush *pOldBrush = pDC->SelectObject(&brush);

      pDC->Rectangle(rectColor);
  
      pDC->SelectObject(pOldPen);
      pDC->SelectObject(pOldBrush);

      memDC.Copy(&dc, cr);
      memDC.Release();
   }
}


BOOL GColorComboBox::OnEraseBkgnd(CDC *pDC)
{
   return TRUE;
}





///////////////////////////////////////////////////
// GPopupColorCtrl

COLORREF g_clArray[] = {RGB(0,0,255), RGB(0,255,0), 
                        RGB(0,255,255), RGB(255,0,0), 
                        RGB(255,0,255), RGB(255,255,0), 
                        RGB(255,255,255), RGB(0,0,0), 
                        RGB(0,0,127), RGB(0,127,0), 
                        RGB(0,127,127), RGB(127,0,0), 
                        RGB(127,0,127), RGB(127,127,0), 
                        RGB(127,127,127), RGB(63,63,63)}; 



GPopupColorCtrl::GPopupColorCtrl(COLORREF clInit,
                                 GColorComboBox *pBuddyCombo)
{
   m_pBuddyCombo = pBuddyCombo;
   m_nActiveSquare = 0;                           
   m_nCurHoverSquare = 0;

   for(int nColor = 0; nColor < CCDIM_TOTALINDECES; nColor++)
   {
      if(g_clArray[nColor] == clInit)
      {
         m_nActiveSquare = nColor;
         m_nCurHoverSquare = nColor;
         break;
      }
   }

   m_clSelected = g_clArray[m_nActiveSquare];
}


GPopupColorCtrl::~GPopupColorCtrl()
{

}


int GPopupColorCtrl::CursorToColorIndex(CPoint ptTest)
{
   CPoint pt(CCDIM_CXSPACE, CCDIM_CYSPACE);
   int nIndex = 0;

   for(int nRow = 0; nRow < 4; nRow++)
   {
      for(int nCol = 0; nCol < 4; nCol++)
      {
         CRect rectSquare(pt, CSize(CCDIM_SQUAREWIDTH, CCDIM_SQUAREHEIGHT));

         if(rectSquare.PtInRect(ptTest))
            return nIndex;

         pt.x += (CCDIM_SQUAREWIDTH + CCDIM_CXSPACE);
         nIndex++;
      }

      pt.x = CCDIM_CXSPACE;
      pt.y += (CCDIM_SQUAREHEIGHT + CCDIM_CYSPACE);
   }

   return -1;
}


void GPopupColorCtrl::DrawColorSquare(CDC *pDC, int nIndex, CPoint pt)
{
   CRect rectDraw(pt, CSize(CCDIM_SQUAREWIDTH, CCDIM_SQUAREHEIGHT));
   
   _3DPENS pens;

   int nThickness = GfxDraw3DBorder(pDC, &pens, rectDraw);

   rectDraw.DeflateRect(nThickness, nThickness);
   CBrush brush(g_clArray[nIndex]);
   pDC->FillRect(rectDraw, &brush);

   if(nIndex == m_nCurHoverSquare)
   {
      rectDraw.InflateRect(1, 1);
      GfxDrawBorder(pDC, rectDraw, pens.pPenWhite);

      rectDraw.DeflateRect(1,1);
      GfxDrawBorder(pDC, rectDraw, pens.pPenBlack);
   }
}



BEGIN_MESSAGE_MAP(GPopupColorCtrl, GPopupWindow)
   ON_WM_CREATE()
   ON_WM_MOUSEMOVE()
   ON_WM_LBUTTONUP()
   ON_WM_PAINT()
   ON_WM_ERASEBKGND()
END_MESSAGE_MAP()



int GPopupColorCtrl::OnCreate(LPCREATESTRUCT lpcs)
{
   int nCreate = GPopupWindow::OnCreate(lpcs);

   if(nCreate == 0)
   {
      int cx = CCDIM_CXSPACE * 5;
      cx += GetSystemMetrics(SM_CXBORDER) * 2;
      cx += (CCDIM_SQUAREWIDTH * 4);

      int cy = CCDIM_CYSPACE * 5;
      cy += GetSystemMetrics(SM_CYBORDER) * 2;
      cy += (CCDIM_SQUAREHEIGHT * 4);

      SetWindowPos(&wndTopMost, 0, 0, cx, cy, 
             SWP_NOMOVE|SWP_NOZORDER|SWP_SHOWWINDOW|SWP_NOACTIVATE);
   }

   return nCreate;
}


void GPopupColorCtrl::OnPaint()
{
   CPaintDC dc(this);
   
   GMemDC memDC;
   CBrush brush(GetSysColor(COLOR_BTNFACE));

   CRect cr;
   GetClientRect(cr);

   if(memDC.Create(&dc, cr, &brush))
   {
      CPoint pt(CCDIM_CXSPACE, CCDIM_CYSPACE);
      int nIndex = 0;

      for(int nRow = 0; nRow < 4; nRow++)
      {
         for(int nCol = 0; nCol < 4; nCol++)
         {
            DrawColorSquare(&memDC, nIndex, pt);
            pt.x += (CCDIM_SQUAREWIDTH + CCDIM_CXSPACE);
            nIndex++;
         }

         pt.x = CCDIM_CXSPACE;
         pt.y += (CCDIM_SQUAREHEIGHT + CCDIM_CYSPACE);
      }

      memDC.Copy(&dc, cr);
      memDC.Release();
   }
}


BOOL GPopupColorCtrl::OnEraseBkgnd(CDC *pDC)
{
   return TRUE;
}


void GPopupColorCtrl::OnMouseMove(UINT nFlags, CPoint pt)
{
   int nIndex = CursorToColorIndex(pt);

   if(nIndex != -1 && nIndex != m_nCurHoverSquare)
   {
      m_nCurHoverSquare = nIndex;
      Invalidate();
   }
}


void GPopupColorCtrl::OnLButtonUp(UINT nFlags, CPoint pt)
{
   if(!OnLButtonDownCheck(nFlags, pt))
   {
      int nIndex = CursorToColorIndex(pt);
      // find out what color mouse is over
      if(nIndex != -1)
      {
         if(m_pBuddyCombo)
            m_pBuddyCombo->UpdateColor(g_clArray[nIndex]); 

         m_nActiveSquare = nIndex;
         ::ReleaseCapture();
      }
   }
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -