微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何刷新 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 举报,一经查实,本站将立刻删除。