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 窗口绘制了代码不应该绘制的形状的主要内容,如果未能解决你的问题,请参考以下文章

C++ OpenGL,绘制形状返回错误

Directx C++ - 绘制 DNA 形状

如何在 C# 中旋转二维对象

Android:绘制自定义形状

C++ OpenGL/Glut 无法绘制

当我在OpenGL中按下一个键时无法绘制形状