如何刷新 OnPaint() 函数;窗口更新不起作用

问题描述

这是我的代码

void CChildView::OnPaint() 
{
    CPaintDC dc(this);
    CBitmap b; b.LoadBitmap(IDB_BITMAP1);
    CDC memdc; memdc.CreateCompatibleDC(&dc);
    auto prev = memdc.SelectObject(&b);
    BITMAP bmp; b.GetBitmap(&bmp);

    int bitmap_height = bmp.bmHeight;
    int bitmap_width = bmp.bmWidth;

    if (!painted) {

        nrows = divide(bitmap_height,8);
        ncols = divide(bitmap_width,8);

        piece_height = bitmap_height / nrows;
        piece_width = bitmap_width / ncols;

        int number_of_tiles = nrows * ncols;

        positions.resize(number_of_tiles);
        std::iota(positions.begin(),positions.end(),0);
        empty = positions.size() - 1;//prazna pločica je zadnja
        std::shuffle(positions.begin(),std::mt19937{ std::random_device{}() });

        painted = true;

    }

    

    for (int i = 0; i < positions.size()-1; ++i) {

        int row_dest = positions[i] / ncols;
        int col_dest = positions[i] % ncols;
        int row_src = i / ncols;
        int col_src = i % ncols;

        int x_src = col_src * piece_width;
        int y_src = row_src * piece_height;
        int x_dest = col_dest * piece_width;
        int y_dest = row_dest * piece_height;

        dc.BitBlt(x_dest,y_dest,piece_width,piece_height,&memdc,x_src,y_src,SRCcopY);
     dc.SelectObject(prev);
    }
}

void CChildView::OnLButtonDown(UINT nFlags,CPoint point)
{
    // Todo: Add your message handler code here and/or call def

    CWnd::OnLButtonDown(nFlags,point);

    //koordinate gdje je korisnik kliknuo

    int row = point.y / piece_height;
    int col = point.x / piece_width;

    int empty_row = empty / ncols;
    int empty_col = empty % ncols;

    bool slide = false;

    switch (abs(row - empty_row)) {
    case 1:
        if (abs(col==empty_col))
            slide = true;
        break;
    case 0:
        if (abs(col-empty_col==1))
            slide = true;
        break;
    }

    if (slide) {
        int old_index = row * ncols + col;
        positions[old_index] = positions[empty];
        empty = old_index;


        CWnd::InvalidateRect(NULL,FALSE);
        CWnd::UpdateWindow();
    }
}

我正在尝试编写一个名为 SlidingPuzzle 的程序。我设法将位图分成矩形并随机打乱它们。但是,当我单击一个矩形时,没有任何变化。我想 UpdateWindow() 不起作用。它应该刷新 OnPaint() 函数。有人可以帮我吗,我做错了什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)