问题背景:设计程序在棋盘上放尽可能多的马,以使相互间不能被吃掉。最后给出最大可放置的马的数量及其放置方法。
主要问题:利用MFC基于对话框编写程序,做成可视化,我已在在OnPoint函数中加载了棋盘,想在按下按钮后显示“棋子马”的图片并控制图片大小和位置(就是要放在棋盘的格子里),位于棋盘上方(不用说),
//CDialog::OnPaint();
//添加代码对话框背景贴图
CPaintDC dc(this);
CDC dcBmp; //定义并创建一个内存设备环境
dcBmp.CreateCompatibleDC(&dc); //创建兼容性DC
CBitmap bmpBackground;
bmpBackground.LoadBitmap(IDB_BITMAP1); //载入资源中图片
BITMAP m_bitmap; //图片变量
bmpBackground.GetBitmap(&m_bitmap); //将图片载入位图中
//将位图选入临时内存设备环境
CBitmap* pbmpOld = dcBmp.SelectObject(&bmpBackground);
//调用函数显示图片StretchBlt显示形状可变
dc.StretchBlt(0, 0, 861, 740 , &dcBmp, 0, 0, m_bitmap.bmWidth, m_bitmap.bmHeight, SRCCOPY);
错误描述:以下为我写的关于“显示结果”按钮的代码,按照这个代码运行的结果是没有任何的变化。
//CString转化为int 函数
int CString_int(CEdit* m_n)
{
CString nn;
m_n->GetWindowText(nn);
return _ttoi(nn);
}
//显示结果按钮
void C放马问题可视化Dlg::OnBnClickedButton1()
{
//CString转化为int类型
int x = CString_int(&m_x);//列数
int y = CString_int(&m_y);//行数
if ( x < 1 || y < 1 || x > 8 || y > 8)
{
MessageBox(TEXT("输入错误!请输入1~8之间的整数。"),TEXT("错误"), MB_ICONHAND);
}
else
{
my_main(x, y);
}
}
//显示象棋马的 主要代码
//-----------------------------------------------------------
void C放马问题可视化Dlg::my_main(int x, int y)//x为列数,y为行数
{
bool (*board)[MAX_X] = new bool[MAX_Y][MAX_X];
//第一种情况:只有一行或一列
if (x == 1 || y == 1)find1(x, y, board);
//第二种情况:只有两行或两列
if (x == 2 || y == 2)find2(x, y, board);
//第三种情况:大于两行且大于两列
if (x > 2 && y > 2)find3(x, y, board);
delete[] board;
}
//第一种情况:只有一行或一列
void C放马问题可视化Dlg::find1(int x, int y, bool board[][MAX_X])
{
for (int i = 0; i < y; i++)
{
for (int j = 0; j < x; j++)
{
*(*(board + i) + j) = 1;
}
}
printall(x, y, board);
}
//第二种情况:只有两行或两列
void C放马问题可视化Dlg::find2(int x, int y, bool board[][MAX_X])
{
if (x == 2)
{
for (int i = 0; i < y; i++)
{
for (int j = 0; j < x; j++)
{
*(*(board + i) + j) = (i % 4 == 0 || i % 4 == 1) ? 1 : 0;
}
}
printall(x, y, board);
}
else
{
for (int i = 0; i < y; i++)
{
for (int j = 0; j < x; j++)
{
*(*(board + i) + j) = (j % 4 == 0 || j % 4 == 1) ? 1 : 0;
}
}
printall(x, y, board);
}
}
//第三种情况:大于两行且大于两列
void C放马问题可视化Dlg::find3(int x, int y, bool board[][MAX_X])
{
for (int i = 0; i < y; i++)
{
for (int j = 0; j < x; j++)
{
if (i % 2 == 0)
{
*(*(board + i) + j) = (j % 2 == 0) ? 1 : 0;
}
if (i % 2 == 1)
{
*(*(board + i) + j) = (j % 2 == 1) ? 1 : 0;
}
}
}
printall(x, y, board);
}
//输出所有要求
void C放马问题可视化Dlg::printall(int x, int y, bool board[][MAX_X])
{
printboard(x, y, board); //放置方式
get_numhorse(x, y, board);
}
//得到最大可放置的马的数量
void C放马问题可视化Dlg::get_numhorse(int x, int y, bool board[][MAX_X])
{
int num = 0;
{
for (int i = 0; i < y; i++)
{
for (int j = 0; j < x; j++)
{
if (*(*(board + i) + j) == 1)
num++;
}
}
}
CString csnum;
csnum.Format(TEXT("可以放置马的最大数量为 %d"), num);
MessageBox(csnum);
}
//输出放置方法
void C放马问题可视化Dlg::printboard(int x, int y, bool board[][MAX_X])
{
for (int i = 0; i < y; i++)
{
for (int j = 0; j < x; j++)
{
if (*(*(board + i) + j) == 0)
{
pointhorse(i, j);
}
}
}
}
//显示棋子函数
void C放马问题可视化Dlg::pointhorse(int i,int j)
{
if ((i + j) % 2 == 0)(区别格子背景颜色不同的马)
{
CPaintDC dc(this);
CDC dcBmp; //定义并创建一个内存设备环境
dcBmp.CreateCompatibleDC(&dc); //创建兼容性DC
CBitmap horse;
horse.LoadBitmap(IDB_BITMAP2); //载入资源中图片
BITMAP m_bitmap; //图片变量
horse.GetBitmap(&m_bitmap); //将图片载入位图中
//将位图选入临时内存设备环境
CBitmap* pbmpOld = dcBmp.SelectObject(&horse);
//调用函数显示图片StretchBlt显示形状可变
dc.StretchBlt(64 + i * 50, 50 + j * 50, 50, 50, &dcBmp, 0, 0, m_bitmap.bmWidth, m_bitmap.bmHeight, SRCCOPY);
}
else
{
CPaintDC dc(this);
CDC dcBmp; //定义并创建一个内存设备环境
dcBmp.CreateCompatibleDC(&dc); //创建兼容性DC
CBitmap horse;
horse.LoadBitmap(IDB_BITMAP3); //载入资源中图片
BITMAP m_bitmap; //图片变量
horse.GetBitmap(&m_bitmap); //将图片载入位图中
//将位图选入临时内存设备环境
CBitmap* pbmpOld = dcBmp.SelectObject(&horse);
//调用函数显示图片StretchBlt显示形状可变
dc.StretchBlt(64 + i * 50, 50 + j * 50, 50, 50, &dcBmp, 0, 0, m_bitmap.bmWidth, m_bitmap.bmHeight, SRCCOPY);
}
}
想要的结果是:
最理想的话改一改 void C放马问题可视化Dlg::pointhorse(int i,int j) 函数就可以了,当然只要能按照预想的结果运行,怎么改都可以。
并且想学一下底层逻辑。
可以看一下我的博文,里面有类似的,只是连子棋的
GDI:BitBlt
GDI+:DrawImage
个人理解,仅供参考,望采纳
在painthorse中你只是把他绘制出来了,但是并没有更新到窗口上,可以尝试最小化窗口再打开,如果它显示出来了,应该就是这个问题
解决方法是在paintall的最后一行调用Invalidate()和UpdateWindow()(函数的具体细节可以自行百度),强制窗口重新绘制(更新)
望采纳 望采纳望采纳
强制窗口重新绘制一下