используя модуль, чтобы узнать, делится ли число на переменную, не работающую - PullRequest
0 голосов
/ 18 мая 2019

У меня проблема с использованием оператора%.Это трудно объяснить, поэтому я просто сначала покажу свой код.

#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, хотя он должен запускаться только каждые 15 раз, когда WM_TIMERназывается.Любая помощь будет оценена.Спасибо!

1 Ответ

0 голосов
/ 18 мая 2019

Что ж, в комментариях были сделаны некоторые хорошие замечания, но существенная проблема здесь заключается в том, что Windows продолжает отправлять сообщения (включая сообщения WM_TIMER), пока окно сообщений находится на экране, поэтому вы в конечном итоге вызываете MessageBox каждыйвремя срабатывания таймера (но, поскольку все они располагаются друг над другом, вы видите только один).

Один из способов решить эту проблему - убить таймер, пока на экране отображается окно сообщения, напримертак:

case WM_TIMER:
{
    if (divisible % 15 == 0) {
        KillTimer (hwnd, 1);
        MessageBox (hwnd, "a", "a", MB_ABORTRETRYIGNORE | MB_ICONASTERISK);
        SetTimer (hwnd, 1, 50, NULL);
    }
    divisible++;
    break;
}

Но вы должны отладить это, прежде чем изменять код, чтобы вы полностью понимали, что происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...