3#include "FrmChineseChess.h"
4#include "ui_FrmChineseChess.h"
5#include "DlgAbout/DlgAbout.h"
6#include "RabbitCommonTools.h"
12#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
13 #include <QSoundEffect>
19CFrmChineseChess::CFrmChineseChess(QWidget *parent) :
23 m_QiPangColor(0, 0, 0),
24 m_TiShiBoxColor(0, 255, 0)
28 m_QiPangStartX = m_QiPangStartY = 0;
31 m_QiPangPicture.load(
":/image/QIPANG");
32 SetTransparentImage(m_QiPangPicture);
33 m_RedShuai.load(
":/image/RSHUAI");
35 m_RedShi.load(
":/image/RSHI");
37 m_RedXiang.load(
":/image/RXIANG");
39 m_RedMa.load(
":/image/RMA");
41 m_RedChe.load(
":/image/RCHE");
43 m_RedBing.load(
":/image/RBING");
45 m_RedPao.load(
":/image/RPAO");
47 m_BlackShuai.load(
":/image/BSHUAI");
49 m_BlackShi.load(
":/image/BSHI");
51 m_BlackXiang.load(
":/image/BXIANG");
53 m_BlackMa.load(
":/image/BMA");
55 m_BlackChe.load(
":/image/BCHE");
57 m_BlackBing.load(
":/image/BZU");
59 m_BlackPao.load(
":/image/BPAO");
62 m_Chu.load(
":/image/CHU");
63 SetTransparentImage(m_Chu);
64 m_He.load(
":/image/HE");
65 SetTransparentImage(m_He);
66 m_Han.load(
":/image/HAN");
67 SetTransparentImage(m_Han);
68 m_Jie.load(
":/image/JIE");
69 SetTransparentImage(m_Jie);
70 m_KL.load(
":/image/KL");
73CFrmChineseChess::~CFrmChineseChess()
78static QSharedPointer<QTranslator> g_Translator;
81 Q_INIT_RESOURCE(ResourceChineseChess);
82#if (defined(DEBUG) || defined(_DEBUG)) && !defined (BUILD_SHARED_LIBS)
83 Q_INIT_RESOURCE(translations_ChineseChessQt);
85 g_Translator = RabbitCommon::CTools::Instance()->InstallTranslator(
87 RabbitCommon::CTools::TranslationType::Library,
97 RabbitCommon::CTools::Instance()->RemoveTranslator(g_Translator);
99#if (defined(DEBUG) || defined(_DEBUG)) && !defined (BUILD_SHARED_LIBS)
100 Q_CLEANUP_RESOURCE(translations_ChineseChessQt);
102 Q_CLEANUP_RESOURCE(ResourceChineseChess);
106void CFrmChineseChess::mouseReleaseEvent(QMouseEvent *event)
110 QPoint p =
event->pos();
120void CFrmChineseChess::paintEvent(QPaintEvent *event)
122 QPainter painter(
this);
125 painter.setRenderHint(QPainter::SmoothPixmapTransform);
130void CFrmChineseChess::resizeEvent(QResizeEvent *event)
132 QSize s =
event->size();
136int CFrmChineseChess::onPromptSound(PROMPT_SOUND sound)
142 szFile =
":/sound/CHECK";
145 szFile =
":/sound/EAT";
148 szFile =
":/sound/GO";
151 szFile =
":/sound/DEAD";
154 szFile =
":/sound/SELECT";
159#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
160 static QSoundEffect effect;
161 effect.setSource(QUrl::fromLocalFile(szFile));
164 if(effect.isPlaying())
168 QSound::play(szFile);
175 QMessageBox msg(
this);
179 msg.setText(tr(
"This step cannot be taken, otherwise you will lose"));
180 msg.setWindowTitle(tr(
"checked"));
183 msg.setText(tr(
"This step cannot be taken, otherwise you will lose"));
184 msg.setWindowTitle(tr(
"Opposite"));
213 emit sigGoChess(i, j, chess);
217void CFrmChineseChess::AboutBox()
219 CDlgAbout* pAbout =
new CDlgAbout(
this);
220 pAbout->m_AppIcon = QImage(
":/image/Chess");
221 pAbout->m_szAppName = tr(
"Chinese chess control");
222 pAbout->m_szHomePage =
"https://github.com/KangLin/ChineseChessControl";
223 pAbout->m_szCopyrightTime =
"1994 - " + QString::number(QDate::currentDate().year());
224#ifdef ChineseChessQt_VERSION
225 pAbout->m_szVersion = ChineseChessQt_VERSION;
227#ifdef ChineseChessQt_REVISION
228 pAbout->m_szVersionRevision = ChineseChessQt_REVISION;
230 RC_SHOW_WINDOW(pAbout);
235 time_t t = CChineseChess::GetStartTime();
237 time.setMSecsSinceEpoch(t);
241int CFrmChineseChess::SetStartTime(
const QDateTime &t)
243 return CChineseChess::SetStartTime(t.toMSecsSinceEpoch());
246QDateTime CFrmChineseChess::GetEndTime()
249 t.setMSecsSinceEpoch(CChineseChess::GetEndTime());
253int CFrmChineseChess::SetEndTime(
const QDateTime &t)
255 return CChineseChess::SetEndTime(t.toMSecsSinceEpoch());
258QString CFrmChineseChess::GetRedName()
260 return CChineseChess::GetRedName().c_str();
263int CFrmChineseChess::SetRedName(
const QString &name)
265 return CChineseChess::SetRedName(name.toStdString().c_str());
268QString CFrmChineseChess::GetBlackName()
270 return CChineseChess::GetBlackName().c_str();
273int CFrmChineseChess::SetBlackName(
const QString &name)
275 return CChineseChess::SetBlackName(name.toStdString().c_str());
335 if(
nullptr == pPainter)
343 for (i = 0; i < 9; i++)
345 if (i == 0 || i == 8)
350 pPainter->setPen(pen);
359 pPainter->setPen(pen);
371 for (i = 0; i < 10; i++)
375 if (i == 0 || i == 9)
384 pPainter->setPen(pen);
397 pPainter->setPen(pen);
448 for (i = 0; i < 9; i++)
449 for (j = 0; j < 10; j++)
455 if (IsValidPosition(m_PreviouPositionX, m_PreviouPositionY))
456 DrawTiShiBox(pPainter, m_PreviouPositionX, m_PreviouPositionY);
457 if (IsValidPosition(m_CurrentPositionX, m_CurrentPositionY))
458 DrawTiShiBox(pPainter, m_CurrentPositionX, m_CurrentPositionY);
486 pPainter->setPen(pen);
488 if (xinwei != Left_XinWei)
490 pPainter->drawLine(x + ds, y + ds, x + d, y + ds);
491 pPainter->drawLine(x + ds, y - ds, x + d, y - ds);
493 pPainter->drawLine(x + ds, y + ds, x + ds, y + d);
495 pPainter->drawLine(x + ds, y - ds, x + ds, y - d);
498 if (xinwei != Right_XinWei)
500 pPainter->drawLine(x - ds, y - ds, x - ds, y - d);
502 pPainter->drawLine(x - ds, y + ds, x - ds, y + d);
504 pPainter->drawLine(x - ds, y + ds, x - d, y + ds);
506 pPainter->drawLine(x - ds, y - ds, x - d, y - ds);
526 pPainter->setPen(pen);
529 pPainter->drawLine(m_X - m_L, m_Y - m_L, m_X - m_L, m_Y - m_L / 2);
531 pPainter->drawLine(m_X - m_L, m_Y - m_L, m_X - m_L / 2, m_Y - m_L);
533 pPainter->drawLine(m_X + m_L, m_Y + m_L, m_X + m_L, m_Y + m_L / 2);
535 pPainter->drawLine(m_X + m_L, m_Y + m_L, m_X + m_L / 2, m_Y + m_L);
537 pPainter->drawLine(m_X - m_L, m_Y + m_L, m_X - m_L, m_Y + m_L / 2);
539 pPainter->drawLine(m_X - m_L, m_Y + m_L, m_X - m_L / 2, m_Y + m_L);
541 pPainter->drawLine(m_X + m_L, m_Y - m_L, m_X + m_L, m_Y - m_L / 2);
543 pPainter->drawLine(m_X + m_L, m_Y - m_L, m_X + m_L / 2, m_Y - m_L);
560#pragma warning( disable : 4806 )
610#pragma warning( default : 4806 )
655 pPainter->drawImage(rect, image);
676 QImage mask = image.createMaskFromColor(col.rgb(), Qt::MaskOutColor);
677 image.setAlphaChannel(mask);
689 QBitmap bmp = pixmap.createMaskFromColor(col, Qt::MaskOutColor);
CPiece::ENUM_QiZi m_ChessBoard[9][10]
棋盘描述
bool GoChess(int i, int j, bool bNext=false)
走棋
int m_QiPangStartX
棋盘的开始横坐标
int SetTransparentImage(QImage &image, const QColor &col=QColor(255, 255, 255))
设置 QImage 透明
virtual int onDrawPrompt(int i, int j) override
画提示框
virtual int onGoChess(int i, int j, CPiece::ENUM_QiZi chess) override
走棋事件
QColor m_TiShiBoxColor
提示框的颜色
bool ConvertCoordinate(long *x, long *y, int *i, int *j, ENUM_ConvertCoordinate eCC=XYToIJ)
坐标转换
virtual int onPromptMessage(CGoRule::ENUM_ReturnValue val) override
提示错误消息
int SetTransparentPixmap(QPixmap &pixmap, const QColor &col=QColor(255, 255, 255))
设置 Pixmap 透明
int DrawQiZi(QPainter *pPainter, int i, int j, CPiece::ENUM_QiZi eQiZi)
画棋子
bool DrawTiShiBox(QPainter *pPainter, int i, int j)
画提示框
void DrawQiPang(QPainter *pPainter, QRect rect)
画棋盘
int DrawPicture(QPainter *pPainter, int i, int j, QImage image, bool CHHJKL=false)
画图片
static int CleanResource()
清理资源,仅在程序结束时调用一次
QColor m_QiPangColor
棋盘格的颜色
bool SetQiPang(int width, int height)
设置棋盘位置
virtual int onCleanPrompt(int i, int j) override
清除提示框
int m_QiPangDistance
棋盘格的距离
ENUM_ConvertCoordinate
坐标转换
QDateTime GetStartTime()
得到开始时间
QImage m_QiPangPicture
棋盘背景图片
void DrawXinWei(QPainter *pPainter, int i, int j, ENUM_XINWEI xinwei=XinWei)
画星位
int DrawImage(QPainter *pPainter, QRect rect, QImage image)
在指定位置绘图
int m_QiPangStartY
棋盘的开始横坐标
static int InitResource(const QString szLanguage)
初始化资源,仅在程序开始时调用一次
enum CPiece::_ENUM_QiZi ENUM_QiZi
棋子枚举值 四个位表示棋子,最左1位表示颜色