mfc基于对话框按下按钮加载图片

问题背景:设计程序在棋盘上放尽可能多的马,以使相互间不能被吃掉。最后给出最大可放置的马的数量及其放置方法。
主要问题:利用MFC基于对话框编写程序,做成可视化,我已在在OnPoint函数中加载了棋盘,想在按下按钮后显示“棋子马”的图片并控制图片大小和位置(就是要放在棋盘的格子里),位于棋盘上方(不用说),

img

//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()(函数的具体细节可以自行百度),强制窗口重新绘制(更新)
采纳采纳采纳

强制窗口重新绘制一下