?? queenpanel.cpp
字號:
// QueenPanel.cpp : implementation file
//
#include "stdafx.h"
#include "EightQueen.h"
#include "QueenPanel.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// QueenPanel
QueenPanel::QueenPanel()
{
this->queen = NULL;
n = 0;
queen_mutex = CreateMutex(NULL,FALSE,NULL);
}
QueenPanel::QueenPanel(int size)
{
this->queen = NULL;
n = 0;
SetSize(size);
queen_mutex = CreateMutex(NULL,FALSE,NULL);
}
QueenPanel::~QueenPanel()
{
if(queen!=NULL)
free(queen);
}
BEGIN_MESSAGE_MAP(QueenPanel, CWnd)
//{{AFX_MSG_MAP(QueenPanel)
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// QueenPanel message handlers
void QueenPanel::OnPaint()
{
CPaintDC dc(this); // device context for painting
if (n == 0 || queen == NULL) {
return;
}
RECT rect;
GetWindowRect(&rect);
CDC MemDC; //定義一個顯示設備對象
CBitmap MemBitmap;//定義一個位圖對象
WaitForSingleObject(queen_mutex, INFINITE);
int w = rect.right-rect.left;
int h = rect.bottom -rect.top;
int board = w >= h ? h : w;
board = board - board % n;
int cell = board / n;
//System.out.println("w:" + w + " h:" + h + " x: " + x + " y:" + y + " cell:" +
// cell + " board:" + board + " rl:" + rl);
int count = 0;
int i;
CPen b_pen(PS_SOLID, 1, RGB(0, 0, 255));
CPen r_pen(PS_SOLID, 1, RGB(255, 0, 0));
CBrush y_brush, b_brush;
y_brush.CreateSolidBrush(RGB(255, 255, 0));
b_brush.CreateSolidBrush(RGB(255, 255, 255));
MemDC.CreateCompatibleDC(&dc); //建立兼容的內存顯示設備
MemBitmap.CreateCompatibleBitmap(&dc,w, h);//建立一個兼容的位圖
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
MemDC.FillRect(CRect(0, 0, w, h), &b_brush);
if(cell<7) {
MemDC.TextOut(0, h/2, "太大,畫不下了!");
}
else {
DrawBoard(&MemDC, n, cell);
MemDC.SelectObject(b_pen);
MemDC.SelectObject(y_brush);
for (i = 0; i < n; i++) {
if (queen[i] >= 0) {
MemDC.Ellipse(queen[i] * cell + cell / 6, i * cell + cell / 6,
queen[i] * cell + cell / 6+cell * 2 / 3,
i * cell + cell / 6+cell * 2 / 3);
count++;
}
}
}
ReleaseMutex(queen_mutex);
dc.BitBlt(0,0,w, h,&MemDC,0,0,SRCCOPY);
}
void QueenPanel::DrawBoard(CDC *pDC, int size, int cell) {
int i, j;
CBrush w_brush, b_brush;
b_brush.CreateSolidBrush(RGB(0, 0, 0));
w_brush.CreateSolidBrush(RGB(255, 255, 255));
for(i=0; i<size; i++) {
for(j=0; j<size; j++) {
if((i+j)%2 ==0 ) {
pDC->FillRect(CRect(i*cell, j*cell, (i+1)*cell -1, (j+1)*cell-1), &b_brush);
}
else {
pDC->FillRect(CRect(i*cell, j*cell, (i+1)*cell -1, (j+1)*cell-1), &w_brush);
}
}
}
CPen b_pen(PS_SOLID, 1, RGB(0, 0, 0));
int board = cell*size;
pDC->SelectObject(b_pen);
pDC->MoveTo(0, 0);
pDC->LineTo(0, board-1);
pDC->LineTo(board-1, board-1);
pDC->LineTo(board-1, 0);
pDC->LineTo(0, 0);
}
void QueenPanel::SetSize(int size) {
WaitForSingleObject(queen_mutex,INFINITE);
if(size>n) {
if(queen!=NULL)
free(queen);
queen = (int *)malloc(size*sizeof(int));
for(int i=0;i<size;i++)
queen[i] = -1;
}
n = size;
ReleaseMutex(queen_mutex);
RedrawWindow();
}
void QueenPanel::SetQueen(int *newq)
{
WaitForSingleObject(queen_mutex,INFINITE);
int i;
for (i = 0; i < n; i++) {
queen[i] = newq[i];
}
ReleaseMutex(queen_mutex);
RedrawWindow();
}
void QueenPanel::SetQueen(int row, int col)
{
WaitForSingleObject(queen_mutex,INFINITE);
queen[row] = col;
ReleaseMutex(queen_mutex);
RedrawWindow();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -