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