使用模数来找出数字是否可以被变量整除

时间:2019-05-17 21:53:31

标签: c++ winapi

我在使用%运算符时遇到问题。这很难解释,所以我只先显示我的代码。

#include <windows.h>
const char ClassName[] = "WindowClass";
int divisible = 1;
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_CREATE:
        SetTimer(hwnd, 1, 50, NULL);
        break;
    case WM_TIMER:
    {
        if (divisible % 15 == 0) {
            MessageBox(hwnd, "a", "a", MB_ABORTRETRYIGNORE | MB_ICONASTERISK);
        }
        divisible++;
        break;
    }
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wc;
    HWND hwnd;
    MSG Msg;

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = 0;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_SHIELD);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = ClassName;
    wc.hIconSm = LoadIcon(NULL, IDI_SHIELD);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        ClassName,
        "Tank Survival",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 820, 642,
        NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while (GetMessage(&Msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}

因此,发生的情况是,每次调用WM_TIMER时,WM_TIMER中的消息框都会重复,尽管它仅应在调用WM_TIMER时每15次运行一次。 任何帮助,将不胜感激。 谢谢!

1 个答案:

答案 0 :(得分:0)

好吧,注释中已经指出了一些好处,但是这里的本质问题是Windows在消息框显示在屏幕上的同时继续调度消息(包括WM_TIMER消息),因此您最终递归调用{{1} }每次触发计时器(但是,由于这些计时器彼此重叠,因此您只能看到一个)。

解决此问题的一种方法是在屏幕上显示消息框时终止计时器,如下所示:

MessageBox

但是您应该在更改代码之前进行调试,以使您完全了解正在发生的事情。