【问题标题】:Tic Tac Toe: Winapi painting井字游戏:Winapi 绘画
【发布时间】:2015-04-04 07:54:47
【问题描述】:

每当我将布尔值设为真时,我都无法在客户区绘画,尝试制作井字游戏,一旦我正确完成初始绘画,我就可以继续前进。

主要问题是它没有正确绘制低行,或者在单击 3 或 4 后绘制它们,目前我不在乎圆圈,只是想知道我有什么问题。

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        static BOOL fState[DIVISIONS][DIVISIONS];
        bool  XorO = false;
        static int  cxBlock, cyBlock;`

        HDC         hdc;
        int         x, y, iPosX , iPosY;
        PAINTSTRUCT ps;
        RECT        rect;

        static const int grid = 1000;
        static const int block = grid / DIVISIONS;
        static const int width = 1200;
        static const int height =1200;

        switch (message)
        {
        case WM_SIZE:

                cxBlock = LOWORD (lParam) / DIVISIONS ;
                cyBlock = HIWORD (lParam) / DIVISIONS ;

            return 0;

        case WM_LBUTTONDOWN:
            x = LOWORD(lParam)/ cxBlock;
            y = HIWORD(lParam)/cyBlock;

            if (x < DIVISIONS && y < DIVISIONS)
            {
                //Click in the first cuadrant x = 0 and y = 0 , so both false
                //second x = 1, y = 0
                //third x 2 , y = 0 and so on.
                fState[x][y] ^= 1;
                rect.left = x * block;
                rect.top = y * block;
                rect.right = (x + 1) * block;
                rect.bottom = (y + 1) * block;

                InvalidateRect(hwnd, &rect, FALSE);

            }
            else
                MessageBeep(0); 

            return 0;

        case WM_PAINT:

            hdc = BeginPaint(hwnd, &ps);


            //paint X or ellipses here
            for (x = 0; x < DIVISIONS; x++)
                for (y = 0; y < DIVISIONS; y++)
                {

                    if (fState[x][y] )
                    {
                        MoveToEx(hdc, x     * block, y       *  block, NULL);
                        LineTo(hdc,  (x + 1) * block, (y + 1) *  block);
                        MoveToEx(hdc, x     * block, (y + 1) *  block, NULL);
                        LineTo(hdc,  (x + 1) * block, y       *  block);
                    }
                }


            //main grid
            for (int i = block; i < grid - 1; i += block) {
                MoveToEx(hdc, i, 0, NULL); 
                LineTo(hdc, i, grid);
                MoveToEx(hdc, 0, i, NULL);
                LineTo(hdc, grid, i);


            }

            EndPaint(hwnd, &ps);
            return 0;

        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        }
        return DefWindowProc(hwnd, message, wParam, lParam);
    }

我什至尝试通过为每个场景制作一个 if 语句来使绘画更加直接和原始,但是,一旦程序运行,它就无法在第二行和第三行正确绘制。或者如果我点击空间 2,2(网格上的最后一个),它不会绘制,直到我点击其他地方......

【问题讨论】:

  • 你在哪里给EndPaint打电话?
  • 此外,除非实际绘制代码在逻辑上存在问题,否则您发布的内容对于 Windows 消息处理是不够的。我们看不到您是否为未处理的消息调用了DefWindowProc,我们不知道WM_PAINT 处理在哪里结束等等。您在处理消息时出错,则可能会发生各种奇怪或不良的影响,无论油漆代码看起来多么完美。
  • 我使用了块,因为网格是对称的 333 * 333 ... cxBlock 和 cyBlock 仅用于激活器来更改布尔值。这真的是一个问题吗?在测试网格中的每个“盒子”时,会将它们应该返回给布尔值。
  • @PaulMcKenzie 添加了整个 wndprc
  • 我总是发现为 CloseHandle、EndPaint 等创建一些模板 RAII 包装器很有用。

标签: c++ winapi


【解决方案1】:

您需要调用 SelectObject 将合适的笔选择到 DC 中,否则 LineTo 将随机使用剩余的任何笔(可能是不可见的或其他东西)。

【讨论】:

  • 别忘了画笔。
猜你喜欢
  • 1970-01-01
  • 2015-06-12
  • 2015-01-08
  • 1970-01-01
  • 2014-04-12
  • 2015-12-06
相关资源
最近更新 更多