C++ GUI 窗口绘制了代码不应该绘制的形状
Posted
技术标签:
【中文标题】C++ GUI 窗口绘制了代码不应该绘制的形状【英文标题】:C++ GUI window has shapes drawn that the code isn't supposed to draw 【发布时间】:2018-01-12 11:07:01 【问题描述】:我正在使用 GUI 库制作井字游戏。我将我的游戏数据存储在一个称为 CP 的二维数组中。在CP中,0为空槽,1为O,2为X。清空CP后,重新绘制棋盘,使数组等于:
000
000
000
窗口看起来像这样,其中的那些代表之前存在的 X 或 O:
010
101
010
这里附上重置CP,刷板的代码:
switch( message )
case WM_PAINT:
HDC hdc;
PAINTSTRUCT ps;
hdc = BeginPaint( hwnd, &ps );
Rectangle( hdc, 0, 0, 200, 200 );
Rectangle( hdc, 200, 400, 0, 600 );
Rectangle( hdc, 600, 0, 400, 200 );
Rectangle( hdc, 600, 400, 400, 600 );
Rectangle( hdc, 200, 200, 400, 400 );
for(int i = 0; i < 3; i++)
for(int j = 0; j < 3; j++)
if(CP[i][j] == 1)
Ellipse(hdc, 200 * i, 200 * j, 200 * (i + 1), 200 * (j + 1));
if(CP[i][j] == 2)
MoveToEx(hdc, 200 * i, 200 * j, NULL);
LineTo(hdc, 200 * (i + 1), 200 * (j + 1));
MoveToEx(hdc, 200 * (i + 1), 200 * j, NULL);
LineTo(hdc, 200 * i, 200 * (j + 1));
EndPaint( hwnd, &ps );
return 0;
break;
case WM_KEYDOWN:
for(int b = 0; b < 3; b++)
for(int c = 0; c < 3; c++)
CP[c][b] = 0;
std::cout << "RESET\n";
RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE);
turn = 1;
break;
【问题讨论】:
【参考方案1】:要么
-
使用
RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE);
告诉 Windows 擦除背景
自己擦除所有网格背景。目前,您为其中五个单元格绘制填充矩形以创建网格,四个未擦除的单元格是网格中您未填充背景的单元格 - 将画笔更改为不同的颜色会使这一点变得明显:
【讨论】:
以上是关于C++ GUI 窗口绘制了代码不应该绘制的形状的主要内容,如果未能解决你的问题,请参考以下文章