QueenPanel.cpp
上传用户:hncsjd
上传日期:2022-07-08
资源大小:3772k
文件大小:3k
源码类别:

其他智力游戏

开发平台:

Visual C++

  1. // QueenPanel.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "NQueen.h"
  5. #include "QueenPanel.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CQueenPanel
  13. CQueenPanel::CQueenPanel()
  14. {
  15. this->queen = NULL;
  16. N = 0;
  17. }
  18. CQueenPanel::CQueenPanel(int size)
  19. {
  20. this->queen = NULL;
  21. N = 0;
  22. SetSize(size);
  23. }
  24. CQueenPanel::~CQueenPanel()
  25. {
  26. if(queen!=NULL)  delete(queen);
  27. }
  28. BEGIN_MESSAGE_MAP(CQueenPanel, CStatic)
  29. //{{AFX_MSG_MAP(CQueenPanel)
  30. ON_WM_PAINT()
  31. //}}AFX_MSG_MAP
  32. END_MESSAGE_MAP()
  33. /////////////////////////////////////////////////////////////////////////////
  34. // CQueenPanel message handlers
  35. //画棋盘(黑白方格间隔)
  36. void CQueenPanel::DrawBoard(CDC *pDC, int size, int cell)
  37. {
  38. int i, j;
  39. CBrush w_brush, b_brush;
  40. b_brush.CreateSolidBrush(RGB(0, 0, 0));
  41. w_brush.CreateSolidBrush(RGB(255, 255, 255));
  42. for(i=0; i<size; i++)
  43. {
  44. for(j=0; j<size; j++)
  45. {
  46. if((i+j)%2 ==0 )
  47. pDC->FillRect(CRect(i*cell, j*cell, (i+1)*cell-1, (j+1)*cell-1), &b_brush);
  48. else
  49. pDC->FillRect(CRect(i*cell, j*cell, (i+1)*cell-1, (j+1)*cell-1), &w_brush);
  50. }
  51. }
  52. CPen b_pen(PS_SOLID, 1, RGB(0, 0, 0));
  53. int board = cell*size;
  54. pDC->SelectObject(b_pen);  
  55. pDC->MoveTo(0, 0);
  56. pDC->LineTo(0, board-1);
  57. pDC->LineTo(board-1, board-1);
  58. pDC->LineTo(board-1, 0);
  59. pDC->LineTo(0, 0);
  60. }
  61. void CQueenPanel::OnPaint() 
  62. {
  63. CPaintDC dc(this);
  64. if( N == 0 || queen == NULL )
  65. return;
  66. RECT rect;
  67. GetWindowRect(&rect);
  68. CDC MemDC; //定义一个显示设备对象
  69. CBitmap MemBitmap;//定义一个位图对象
  70.     int w = rect.right - rect.left;
  71.     int h = rect.bottom - rect.top;
  72.     int board = w >= h ? h : w;
  73.     board = board - board % N;
  74.     int cell = board / N;
  75. int count = 0;
  76. int i;
  77. CPen b_pen(PS_SOLID, 1, RGB(0, 0, 255));
  78. CPen r_pen(PS_SOLID, 1, RGB(255, 0, 0));
  79. CBrush y_brush, w_brush;
  80. y_brush.CreateSolidBrush(RGB(255, 255, 0));
  81. w_brush.CreateSolidBrush(RGB(255, 255, 255));
  82. MemDC.CreateCompatibleDC(&dc); //建立兼容的内存显示设备
  83. MemBitmap.CreateCompatibleBitmap(&dc,w, h);//建立一个兼容的位图
  84. CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
  85. MemDC.FillRect(CRect(0, 0, w, h), &w_brush);
  86. if(cell<7)
  87. MemDC.TextOut(0, h/2, "太大,画不下了!");
  88. else
  89. {
  90. DrawBoard(&MemDC, N, cell);
  91. MemDC.SelectObject(b_pen);
  92. MemDC.SelectObject(y_brush);     
  93. for( i = 0; i < N; i++)
  94. {
  95. if( queen[i] >= 0 )
  96. {
  97. MemDC.Ellipse(queen[i] * cell + cell / 6, i * cell + cell / 6,
  98. queen[i] * cell + cell / 6+cell * 2 / 3,
  99. i * cell + cell / 6+cell * 2 / 3);
  100. count++;
  101. }
  102. }
  103. }
  104. dc.BitBlt(0,0,w, h,&MemDC,0,0,SRCCOPY);
  105. }
  106. void CQueenPanel::SetSize(int size)
  107. {
  108. if(size>N)
  109. {
  110. if(queen!=NULL)  delete(queen);
  111. queen = new int[size*sizeof(int)];
  112. for(int i=0;i<size;i++)
  113. queen[i] = -1;
  114. }
  115. N = size;
  116.     RedrawWindow(); //重绘
  117. }
  118. void CQueenPanel::SetQueen(int *newq)
  119. {
  120. int i;
  121. for( i = 0; i < N; i++ )
  122. queen[i] = newq[i];
  123.     RedrawWindow();      
  124. }
  125. void CQueenPanel::SetQueen(int row, int col)
  126. {
  127. queen[row] = col;
  128.     RedrawWindow();     
  129. }