ColorSetDlg.cpp
上传用户:lj3531212
上传日期:2007-06-18
资源大小:346k
文件大小:12k
源码类别:

绘图程序

开发平台:

Visual C++

  1. // ColorSetDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "GraphSoft.h"
  5. #include "ColorSetDlg.h"
  6. #include "GraphSoftView.h"
  7. #include "MainFrm.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CColorSetDlg dialog
  15. CColorSetDlg::CColorSetDlg(int nType,CWnd* pParent /*=NULL*/)
  16. : CDialog(CColorSetDlg::IDD, pParent)
  17. {
  18. //{{AFX_DATA_INIT(CColorSetDlg)
  19. m_nColor_B = 0;
  20. m_nColor_G = 0;
  21. m_nColor_R = 0;
  22. //}}AFX_DATA_INIT
  23. m_nColorType=nType;
  24. m_nNumPatterns = 40 ;
  25. m_nColorOther    = 1000 ;
  26. m_nColorAuto   = 1001;
  27. m_OtherColorRect.top = 118 ;
  28. m_OtherColorRect.left = 0 ;
  29. m_OtherColorRect.bottom = 140 ;
  30. m_OtherColorRect.right  = 146 ;
  31. m_AutoSetRect.top=0;
  32. m_AutoSetRect.left=0;
  33. m_AutoSetRect.bottom=22;
  34. m_AutoSetRect.right=146;
  35. m_AutoColorRect.left=0;
  36. m_AutoColorRect.top=0;
  37. m_AutoColorRect.bottom=22;
  38. m_AutoColorRect.right=22;
  39. m_nBoxSize = 18 ;
  40. m_nNumColumns = 8 ;
  41. m_nMargin = 1 ;
  42. m_nCurrent = -1 ;
  43. m_nSelect  = -1 ;
  44. m_clrArray[0]=RGB(0,0,0);
  45. m_clrArray[1]=RGB(153,51,0);
  46. m_clrArray[2]=RGB(51,51,0);
  47. m_clrArray[3]=RGB(0,51,0);
  48. m_clrArray[4]=RGB(0,51,102);
  49. m_clrArray[5]=RGB(0,0,128);
  50. m_clrArray[6]=RGB(51,51,153);
  51. m_clrArray[7]=RGB(51,51,51);
  52. m_clrArray[8]=RGB(128,0,0);
  53. m_clrArray[9]=RGB(255,102,0);
  54. m_clrArray[10]=RGB(128,128,0);
  55. m_clrArray[11]=RGB(0,1128,0);
  56. m_clrArray[12]=RGB(0,128,128);
  57. m_clrArray[13]=RGB(0,0,255);
  58. m_clrArray[14]=RGB(102,102,153);
  59. m_clrArray[15]=RGB(128,128,128);
  60. m_clrArray[16]=RGB(255,0,0);
  61. m_clrArray[17]=RGB(255,153,0);
  62. m_clrArray[18]=RGB(153,204,0);
  63. m_clrArray[19]=RGB(51,153,102);
  64. m_clrArray[20]=RGB(51,204,204);
  65. m_clrArray[21]=RGB(51,102,255);
  66. m_clrArray[22]=RGB(128,0,128);
  67. m_clrArray[23]=RGB(153,153,153);
  68. m_clrArray[24]=RGB(255,0,255);
  69. m_clrArray[25]=RGB(255,204,0);
  70. m_clrArray[26]=RGB(255,255,0);
  71. m_clrArray[27]=RGB(0,255,0);
  72. m_clrArray[28]=RGB(0,255,255);
  73. m_clrArray[29]=RGB(0,204,255);
  74. m_clrArray[30]=RGB(153,51,102);
  75. m_clrArray[31]=RGB(192,192,192);
  76. m_clrArray[32]=RGB(234,255,204);
  77. m_clrArray[33]=RGB(255,204,53);
  78. m_clrArray[34]=RGB(255,255,153);
  79. m_clrArray[35]=RGB(204,255,204);
  80. m_clrArray[36]=RGB(204,255,255);
  81. m_clrArray[37]=RGB(53,204,255);
  82. m_clrArray[38]=RGB(204,153,255);
  83. m_clrArray[39]=RGB(255,255,255);
  84. m_pWndParent=pParent;
  85. }
  86. void CColorSetDlg::DoDataExchange(CDataExchange* pDX)
  87. {
  88. CDialog::DoDataExchange(pDX);
  89. //{{AFX_DATA_MAP(CColorSetDlg)
  90. DDX_Text(pDX, IDC_COLOR_B, m_nColor_B);
  91. DDV_MinMaxInt(pDX, m_nColor_B, 0, 255);
  92. DDX_Text(pDX, IDC_COLOR_G, m_nColor_G);
  93. DDV_MinMaxInt(pDX, m_nColor_G, 0, 255);
  94. DDX_Text(pDX, IDC_COLOR_R, m_nColor_R);
  95. DDV_MinMaxInt(pDX, m_nColor_R, 0, 255);
  96. //}}AFX_DATA_MAP
  97. }
  98. BEGIN_MESSAGE_MAP(CColorSetDlg, CDialog)
  99. //{{AFX_MSG_MAP(CColorSetDlg)
  100. ON_WM_PAINT()
  101. ON_WM_LBUTTONDOWN()
  102. ON_WM_KILLFOCUS()
  103. ON_WM_MOUSEMOVE()
  104. //}}AFX_MSG_MAP
  105. END_MESSAGE_MAP()
  106. /////////////////////////////////////////////////////////////////////////////
  107. // CColorSetDlg message handlers
  108. void CColorSetDlg::OnPaint() 
  109. {
  110. CPaintDC dc(this); // device context for painting
  111. // TODO: Add your message handler code here
  112. int i ;
  113. draw_cell(&dc,m_nColorAuto);
  114. for(i=0;i<m_nNumPatterns;i++) {
  115. draw_cell(&dc,i) ;
  116. }
  117. draw_cell(&dc,m_nColorOther) ;
  118. // Do not call CDialog::OnPaint() for painting messages
  119. }
  120. BOOL CColorSetDlg::OnInitDialog() 
  121. {
  122. CDialog::OnInitDialog();
  123. // TODO: Add extra initialization here
  124. return TRUE;  // return TRUE unless you set the focus to a control
  125.               // EXCEPTION: OCX Property Pages should return FALSE
  126. }
  127. void CColorSetDlg::Init()
  128. {
  129. m_nSelect=-1;
  130. }
  131. void CColorSetDlg::OnLButtonDown(UINT nFlags, CPoint point) 
  132. {
  133. // TODO: Add your message handler code here and/or call default
  134. int i ;
  135. CRect rect ;
  136. if(m_OtherColorRect.PtInRect(point)) {
  137. CColorDialog colordlg(GetInitColor(), CC_FULLOPEN) ;
  138. if(colordlg.DoModal()==IDOK) {
  139. SetColor(colordlg.GetColor());
  140. this->PostMessage(WM_COMMAND,IDCANCEL) ;
  141. }
  142. }else if(m_AutoSetRect.PtInRect(point)) {
  143. SetColor(RGB(0,0,0));
  144. this->PostMessage(WM_COMMAND,IDCANCEL) ;
  145. } else {
  146. for(i=0;i<m_nNumPatterns;i++) {
  147. if(GetCellRect(i,&rect)) {
  148. if(rect.PtInRect(point)) {
  149. m_nCurrent = i ;
  150. SetColor(GetColor(i));
  151. Invalidate() ;
  152. this->PostMessage(WM_COMMAND,IDCANCEL) ;
  153. }
  154. }
  155. }
  156. }
  157. CDialog::OnLButtonDown(nFlags, point);
  158. }
  159. void CColorSetDlg::OnKillFocus(CWnd* pNewWnd) 
  160. {
  161. CDialog::OnKillFocus(pNewWnd);
  162. // TODO: Add your message handler code here
  163. this->PostMessage(WM_COMMAND,IDCANCEL);
  164. }
  165. void CColorSetDlg::OnMouseMove(UINT nFlags, CPoint point) 
  166. {
  167. // TODO: Add your message handler code here and/or call default
  168. BOOL flag = FALSE ;
  169. int i ;
  170. CRect rect ;
  171. if(m_AutoSetRect.PtInRect(point)) {
  172. if(this->m_nSelect!=m_nColorAuto) {
  173. CClientDC dc(this);  
  174. int old = m_nSelect ;
  175. m_nSelect = -1 ;
  176. if(old>=0) draw_cell(&dc,old) ;
  177. m_nSelect = m_nColorAuto ;
  178. draw_cell(&dc,m_nColorAuto) ;
  179. }
  180. flag = TRUE ;
  181. }
  182. if(!flag){
  183. GetCellRect(m_nColorOther,&rect) ;
  184. if(rect.PtInRect(point)) {
  185. if(m_nSelect!=m_nColorOther) {
  186. CClientDC dc(this);  
  187. int old = this->m_nSelect ;
  188. m_nSelect = -1 ;
  189. if(old>=0) draw_cell(&dc,old) ;
  190. m_nSelect = m_nColorOther ;
  191. draw_cell(&dc,m_nColorOther) ;
  192. }
  193. flag = TRUE ;
  194. }
  195. }
  196. if(!flag) {
  197. for(i=0;i<m_nNumPatterns;i++) {
  198. if(GetCellRect(i,&rect)) {
  199. if(rect.PtInRect(point)) {
  200. if(this->m_nSelect!=i) {
  201. CClientDC dc(this);  
  202. int old = this->m_nSelect ;
  203. this->m_nSelect = -1 ;
  204. if(old>=0) draw_cell(&dc,old) ;
  205. this->m_nSelect = i ;
  206. draw_cell(&dc,i) ;
  207. }
  208. flag = TRUE ;
  209. break ;
  210. }
  211. }
  212. } }
  213. if(!flag) {
  214. CClientDC dc(this);  
  215. int old = this->m_nSelect ;
  216. this->m_nSelect = -1 ;
  217. if(old>=0) draw_cell(&dc,old) ;
  218. }
  219. CDialog::OnMouseMove(nFlags, point);
  220. }
  221. void CColorSetDlg::draw_cell(CDC *pDC, int i)
  222. {
  223. if(i==m_nColorOther) {
  224. CRect rect = m_OtherColorRect ;
  225.         rect.top += 2*m_nMargin;
  226.         // Fill background
  227.         pDC->FillSolidRect(rect, ::GetSysColor(COLOR_3DFACE));
  228.         // Draw horizontal line
  229.         pDC->FillSolidRect(m_OtherColorRect.left+2*m_nMargin, m_OtherColorRect.top,
  230. m_OtherColorRect.Width()-4*m_nMargin, 1, ::GetSysColor(COLOR_3DSHADOW));
  231.         pDC->FillSolidRect(m_OtherColorRect.left+2*m_nMargin, m_OtherColorRect.top+1,
  232. m_OtherColorRect.Width()-4*m_nMargin, 1, ::GetSysColor(COLOR_3DHILIGHT));
  233.         rect.DeflateRect(1,1);
  234.         // Draw button
  235.         if (i==this->m_nSelect) pDC->DrawEdge(rect, BDR_RAISEDINNER, BF_RECT);
  236.         else if (i==this->m_nCurrent) pDC->DrawEdge(rect, BDR_SUNKENOUTER, BF_RECT);
  237. NONCLIENTMETRICS ncm;
  238. ncm.cbSize = sizeof(NONCLIENTMETRICS);
  239. VERIFY(SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0));
  240. CFont font ;
  241. font.CreateFontIndirect(&(ncm.lfMessageFont)) ;
  242. CFont* pOldFont = (CFont*)pDC->SelectObject(&font) ;
  243.         pDC->SetBkMode(TRANSPARENT);
  244. CString str ;
  245. #ifdef IDS_AUTO_COLOR
  246. str.LoadString(IDS_OTHER_COLOR) ;
  247. #else
  248. str="其它颜色";
  249. #endif
  250.         pDC->DrawText(str, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  251. pDC->SelectObject(pOldFont) ;
  252. }else if(i==m_nColorAuto) {
  253. CRect rect = m_AutoSetRect ;
  254.         rect.bottom += 2*m_nMargin;
  255.         // Fill background
  256.         pDC->FillSolidRect(rect, ::GetSysColor(COLOR_3DFACE));        
  257.         pDC->FillSolidRect(m_AutoSetRect.left+m_nMargin, m_AutoSetRect.bottom-1,
  258. m_AutoSetRect.Width()-2*m_nMargin, 1, ::GetSysColor(COLOR_3DHILIGHT));
  259.         rect.DeflateRect(m_nMargin,m_nMargin);
  260.         // Draw button
  261.         if (i==this->m_nSelect) pDC->DrawEdge(rect, BDR_RAISEDINNER, BF_RECT);
  262.         else if (i==this->m_nCurrent) pDC->DrawEdge(rect, BDR_SUNKENOUTER, BF_RECT);
  263. // Draw Out Rect
  264.         pDC->MoveTo(m_AutoSetRect.left+5*m_nMargin,m_AutoSetRect.top+3*m_nMargin);
  265. pDC->LineTo(m_AutoSetRect.right-5*m_nMargin,m_AutoSetRect.top+3*m_nMargin);
  266. pDC->LineTo(m_AutoSetRect.right-5*m_nMargin,m_AutoSetRect.bottom-3*m_nMargin);
  267. pDC->LineTo(m_AutoSetRect.left+5*m_nMargin,m_AutoSetRect.bottom-3*m_nMargin);
  268. pDC->LineTo(m_AutoSetRect.left+5*m_nMargin,m_AutoSetRect.top+3*m_nMargin);
  269.         
  270. // Draw the AutoColorRect
  271.         CPen   pen;
  272. pen.CreatePen(PS_SOLID, 1, ::GetSysColor(COLOR_3DSHADOW));
  273. CBrush brush ;
  274. brush.CreateSolidBrush(RGB(0,0,0)) ;
  275. CPen*   pOldPen   = (CPen*)   pDC->SelectObject(&pen);
  276. CBrush* pOldBrush = (CBrush*) pDC->SelectObject(&brush);
  277. rect=m_AutoColorRect;
  278. rect.DeflateRect(0,4*m_nMargin+1);
  279. rect.left+=7*m_nMargin+1;
  280. pDC->Rectangle(rect);
  281. pDC->SelectObject(pOldBrush);
  282. pDC->SelectObject(pOldPen);
  283. // Text
  284. NONCLIENTMETRICS ncm;
  285. ncm.cbSize = sizeof(NONCLIENTMETRICS);
  286. VERIFY(SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0));
  287. CFont font ;
  288. font.CreateFontIndirect(&(ncm.lfMessageFont)) ;
  289. CFont* pOldFont = (CFont*)pDC->SelectObject(&font) ;
  290.         pDC->SetBkMode(TRANSPARENT);
  291. CString str ;
  292. #ifdef IDS_AUTO_COLOR
  293. str.LoadString(IDS_AUTO_COLOR) ;
  294. #else
  295. str="自动";
  296. #endif
  297.         pDC->DrawText(str, m_AutoSetRect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  298. pDC->SelectObject(pOldFont) ;
  299. }else {
  300. CRect rect;
  301. if (!GetCellRect(i,&rect)) return;
  302. pDC->FillSolidRect(rect, ::GetSysColor(COLOR_3DFACE));
  303. if(i==this->m_nSelect) pDC->DrawEdge(rect, BDR_RAISEDINNER, BF_RECT);
  304. else if(i==this->m_nCurrent) pDC->DrawEdge(rect, BDR_SUNKENOUTER, BF_RECT);
  305. CPen   pen;
  306. pen.CreatePen(PS_SOLID, 1, ::GetSysColor(COLOR_3DSHADOW));
  307. CPen*   pOldPen   = (CPen*)   pDC->SelectObject(&pen);
  308. CBrush brush ;
  309. CBrush* pOldBrush ;
  310. brush.CreateSolidBrush(GetColor(i)) ;
  311. pOldBrush = (CBrush*) pDC->SelectObject(&brush);
  312. // Draw the cell colour
  313. rect.DeflateRect(m_nMargin+1, m_nMargin+1);
  314. pDC->Rectangle(rect);
  315. // restore DC and cleanup
  316. pDC->SelectObject(pOldBrush);
  317. pDC->SelectObject(pOldPen);
  318. }
  319. }
  320. int CColorSetDlg::GetRow(int i)
  321. {
  322. return i / m_nNumColumns; 
  323. }
  324. int CColorSetDlg::GetColumn(int i)
  325. {
  326. return i % m_nNumColumns; 
  327. }
  328. BOOL CColorSetDlg::GetCellRect(int i,CRect* pRect)
  329. {
  330. if(i==this->m_nColorOther) {
  331. *pRect = this->m_OtherColorRect ;
  332. }
  333. else {
  334. if (i < 0 || i >= m_nNumPatterns)
  335. return FALSE;
  336. pRect->left = GetColumn(i) * m_nBoxSize + m_nMargin;
  337. pRect->top = GetRow(i) * m_nBoxSize + m_nMargin + m_AutoSetRect.Height()+2*m_nMargin;
  338. pRect->right = pRect->left + m_nBoxSize;
  339. pRect->bottom = pRect->top + m_nBoxSize;
  340. }
  341. return TRUE;
  342. }
  343. COLORREF CColorSetDlg::GetColor(int i)
  344. {
  345.    return m_clrArray[i];
  346. }
  347. COLORREF CColorSetDlg::GetColor()
  348. {
  349. return RGB(m_nColor_R,m_nColor_G,m_nColor_B);  
  350. }
  351. void CColorSetDlg::InitColor(COLORREF color)
  352. {
  353.     m_nColor_R=(int)GetRValue(color);
  354. m_nColor_G=(int)GetGValue(color);
  355.     m_nColor_B=(int)GetBValue(color);
  356. for(int i=0;i<m_nNumPatterns;i++){
  357. if(color==m_clrArray[i]){
  358. m_nCurrent=i;
  359. break;
  360. }
  361. }
  362. }
  363. void  CColorSetDlg::SetColor(COLORREF color)
  364. {
  365. m_nColor_R=(int)GetRValue(color);
  366. m_nColor_G=(int)GetGValue(color);
  367. m_nColor_B=(int)GetBValue(color);
  368. if(m_nColorType==0&&m_pWndParent!=NULL){
  369. m_pWndParent->PostMessage(WM_SETCOLOR,WPARAM(color));
  370. }else if(m_nColorType==1&&m_pWndParent!=NULL){
  371.         m_pWndParent->PostMessage(WM_SETFILLCOLOR,WPARAM(color));
  372. }
  373. }
  374. COLORREF CColorSetDlg::GetInitColor()
  375. {
  376. return RGB(m_nColor_R,m_nColor_G,m_nColor_B);  
  377. }
  378. BOOL CColorSetDlg::PreCreateWindow(CREATESTRUCT& cs) 
  379. {
  380. // TODO: Add your specialized code here and/or call the base class
  381. return CDialog::PreCreateWindow(cs);
  382. }