问题描述
这是我的代码:
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 (将#修改为@)