ColorSelector.cpp
上传用户:hmc_gdtv
上传日期:2013-08-04
资源大小:798k
文件大小:8k
源码类别:

Windows Mobile

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 2001,2002,2003 Mike Matsnev.  All Rights Reserved.
  3.  *
  4.  * Redistribution and use in source and binary forms, with or without
  5.  * modification, are permitted provided that the following conditions
  6.  * are met:
  7.  *
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice immediately at the beginning of the file, without modification,
  10.  *    this list of conditions, and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. Absolutely no warranty of function or purpose is made by the author
  15.  *    Mike Matsnev.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  19.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  20.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  22.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  * 
  28.  * $Id: ColorSelector.cpp,v 1.10.2.3 2004/10/29 15:18:46 mike Exp $
  29.  * 
  30.  */
  31. #include <afxext.h>
  32. #include "resource.h"
  33. #include "Colors.h"
  34. #include "ColorSelector.h"
  35. #include "config.h"
  36. #ifdef _DEBUG
  37. #define new DEBUG_NEW
  38. #undef THIS_FILE
  39. static char THIS_FILE[] = __FILE__;
  40. #endif
  41. #define GAMMA_BASE  10000
  42. /////////////////////////////////////////////////////////////////////////////
  43. // CColorSelector dialog
  44. CColorSelector::CColorSelector(ColorItem *colors, CWnd* pParent /*=NULL*/)
  45. : CDialog(CColorSelector::IDD, pParent), m_colors(colors), m_index(0)
  46. {
  47.   //{{AFX_DATA_INIT(CColorSelector)
  48.   // NOTE: the ClassWizard will add member initialization here
  49.   m_gamma=0;
  50.   //}}AFX_DATA_INIT
  51. }
  52. void CColorSelector::DoDataExchange(CDataExchange* pDX)
  53. {
  54.   CDialog::DoDataExchange(pDX);
  55.   //{{AFX_DATA_MAP(CColorSelector)
  56.   // NOTE: the ClassWizard will add DDX and DDV calls here
  57.   DDX_Scroll(pDX,IDC_GAMMA,m_gamma);
  58.   //}}AFX_DATA_MAP
  59. }
  60. BEGIN_MESSAGE_MAP(CColorSelector, CDialog)
  61. //{{AFX_MSG_MAP(CColorSelector)
  62. ON_WM_DRAWITEM()
  63. ON_WM_HSCROLL()
  64. ON_CBN_SELENDOK(IDC_COLORS, OnSelendokColors)
  65. //}}AFX_MSG_MAP
  66. END_MESSAGE_MAP()
  67. /////////////////////////////////////////////////////////////////////////////
  68. // CColorSelector message handlers
  69. void CColorSelector::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT ds)
  70. {
  71.   if (nIDCtl==IDC_SAMPLE) {
  72.     SetBkColor(ds->hDC,m_colors[m_index].tempval);
  73.     ExtTextOut(ds->hDC,ds->rcItem.left,ds->rcItem.top,ETO_OPAQUE|ETO_CLIPPED,
  74.       &ds->rcItem,_T(""),0,NULL);
  75.   } else
  76.     CDialog::OnDrawItem(nIDCtl, ds);
  77. }
  78. void CColorSelector::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
  79. {
  80.   SCROLLINFO  info;
  81.   pScrollBar->GetScrollInfo(&info, SIF_ALL);
  82.   nPos &= 0xffff;
  83.   int page = (info.nMax - info.nMin + 1) / 15;
  84.   // Determine the new position of scroll box.
  85.   switch (nSBCode)
  86.   {
  87.   case SB_LEFT:    // Scroll to far left.
  88.     info.nPos = info.nMin;
  89.     break;
  90.   case SB_RIGHT:    // Scroll to far right.
  91.     info.nPos = info.nMax;
  92.     break;
  93.   case SB_ENDSCROLL:  // End scroll.
  94.     break;
  95.   case SB_LINELEFT:    // Scroll left.
  96.     info.nPos--;
  97.     break;
  98.   case SB_LINERIGHT:  // Scroll right.
  99.     info.nPos++;
  100.     break;
  101.   case SB_PAGELEFT:   // Scroll one page left.
  102.     info.nPos -= page;
  103.     break;
  104.   case SB_PAGERIGHT:    // Scroll one page right.
  105.     info.nPos += page;
  106.     break;
  107.   case SB_THUMBPOSITION: // Scroll to absolute position. nPos is the position
  108.     info.nPos = nPos;      // of the scroll box at the end of the drag operation.
  109.     break;
  110.   case SB_THUMBTRACK:   // Drag scroll box to specified position. nPos is the
  111.     info.nPos = nPos;     // position that the scroll box has been dragged to.
  112.     break;
  113.   }
  114.   if (info.nPos<info.nMin)
  115.     info.nPos=info.nMin;
  116.   if (info.nPos>(int)info.nMax)
  117.     info.nPos=info.nMax;
  118.   // Set the new position of the thumb (scroll box).
  119.   if (nSBCode!=SB_THUMBTRACK)
  120.     pScrollBar->SetScrollPos(info.nPos);
  121.   int id=pScrollBar->GetDlgCtrlID();
  122.   if (id==IDC_GAMMA) {
  123.     CString   tmp;
  124.     tmp.Format(_T("%1.2f"),(info.nPos + GAMMA_BASE)/10000.0);
  125.     SetDlgItemText(IDC_TXTGAMMA,tmp);
  126.   } else {
  127.     int r=((CScrollBar*)GetDlgItem(IDC_RED))->GetScrollPos();
  128.     int g=((CScrollBar*)GetDlgItem(IDC_GREEN))->GetScrollPos();
  129.     int b=((CScrollBar*)GetDlgItem(IDC_BLUE))->GetScrollPos();
  130.     switch (id) {
  131.     case IDC_RED:
  132.       r=info.nPos;
  133.       break;
  134.     case IDC_GREEN:
  135.       g=info.nPos;
  136.       break;
  137.     case IDC_BLUE:
  138.       b=info.nPos;
  139.       break;
  140.     }
  141.     if (m_colors[m_index].tempval!=RGB(r,g,b)) {
  142.       SetDlgItemInt(IDC_SRED,r);
  143.       SetDlgItemInt(IDC_SGREEN,g);
  144.       SetDlgItemInt(IDC_SBLUE,b);
  145.       m_colors[m_index].tempval=RGB(r,g,b);
  146.       GetDlgItem(IDC_SAMPLE)->Invalidate(FALSE);
  147.     }
  148.   }
  149. }
  150. BOOL CColorSelector::OnInitDialog()
  151. {
  152.   CDialog::OnInitDialog();
  153. #if POCKETPC
  154.   ((CCeCommandBar *)m_pWndEmptyCB)->LoadToolBar(cIDR_DIALOG);
  155. #endif
  156.   // init combo box
  157.   CComboBox   *box=(CComboBox*)GetDlgItem(IDC_COLORS);
  158.   if (box) {
  159.     for (int i=0;m_colors[i].name;++i)
  160.       box->AddString(m_colors[i].name);
  161.     box->SetCurSel(0);
  162.   }
  163.   // init scrollbar ranges
  164.   SCROLLINFO  si;
  165.   si.cbSize=sizeof(si);
  166.   si.fMask=SIF_ALL;
  167.   si.nMin=0;
  168.   si.nMax=255;
  169.   si.nPage=0;
  170.   //si.nMax+=si.nPage-1;
  171.   // red
  172.   si.nPos=si.nTrackPos=GetRValue(m_colors[m_index].tempval);
  173.   ((CScrollBar*)GetDlgItem(IDC_RED))->SetScrollInfo(&si);
  174.   // green
  175.   si.nPos=si.nTrackPos=GetGValue(m_colors[m_index].tempval);
  176.   ((CScrollBar*)GetDlgItem(IDC_GREEN))->SetScrollInfo(&si);
  177.   // blue
  178.   si.nPos=si.nTrackPos=GetBValue(m_colors[m_index].tempval);
  179.   ((CScrollBar*)GetDlgItem(IDC_BLUE))->SetScrollInfo(&si);
  180.   si.nMin=0;
  181.   si.nMax=40000;
  182.   si.nPage=0;
  183.   si.nPos=si.nTrackPos=m_gamma;
  184.   ((CScrollBar*)GetDlgItem(IDC_GAMMA))->SetScrollInfo(&si);
  185.   // set text
  186.   SetDlgItemInt(IDC_SRED,((CScrollBar*)GetDlgItem(IDC_RED))->GetScrollPos());
  187.   SetDlgItemInt(IDC_SGREEN,((CScrollBar*)GetDlgItem(IDC_GREEN))->GetScrollPos());
  188.   SetDlgItemInt(IDC_SBLUE,((CScrollBar*)GetDlgItem(IDC_BLUE))->GetScrollPos());
  189.   CString   tmp;
  190.   tmp.Format(_T("%1.2f"),(m_gamma+GAMMA_BASE)/10000.0);
  191.   SetDlgItemText(IDC_TXTGAMMA,tmp);
  192.   return TRUE;
  193. }
  194. bool myChooseColors(ColorItem *colors,int *gamma,CWnd *parent) {
  195.   CColorSelector    dlg(colors,parent);
  196.   // fill in temporary values
  197.   for (int i=0;colors[i].name;++i)
  198.     colors[i].tempval=colors[i].value;
  199.   dlg.m_gamma=*gamma/100 - GAMMA_BASE;
  200.   if (dlg.DoModal()==IDOK) {
  201.     bool changed=false;
  202.     for (int j=0;colors[j].name;++j)
  203.       if (colors[j].value!=colors[j].tempval) {
  204. colors[j].value=colors[j].tempval;
  205. colors[j].tempval=1;
  206. changed=true;
  207.       }
  208.     dlg.m_gamma += GAMMA_BASE;
  209.     if (dlg.m_gamma*100!=*gamma) {
  210.       *gamma=dlg.m_gamma*100;
  211.       changed=true;
  212.     }
  213.     return changed;
  214.   }
  215.   return false;
  216. }
  217. void CColorSelector::OnSelendokColors() {
  218.   int newidx=((CComboBox*)GetDlgItem(IDC_COLORS))->GetCurSel();
  219.   if (newidx==LB_ERR || newidx==m_index)
  220.     return;
  221.   m_index=newidx;
  222.   ((CScrollBar*)GetDlgItem(IDC_RED))->SetScrollPos(GetRValue(m_colors[m_index].tempval));
  223.   ((CScrollBar*)GetDlgItem(IDC_GREEN))->SetScrollPos(GetGValue(m_colors[m_index].tempval));
  224.   ((CScrollBar*)GetDlgItem(IDC_BLUE))->SetScrollPos(GetBValue(m_colors[m_index].tempval));
  225.   // set text
  226.   SetDlgItemInt(IDC_SRED,((CScrollBar*)GetDlgItem(IDC_RED))->GetScrollPos());
  227.   SetDlgItemInt(IDC_SGREEN,((CScrollBar*)GetDlgItem(IDC_GREEN))->GetScrollPos());
  228.   SetDlgItemInt(IDC_SBLUE,((CScrollBar*)GetDlgItem(IDC_BLUE))->GetScrollPos());
  229.   GetDlgItem(IDC_SAMPLE)->Invalidate(FALSE);
  230. }