Получение ошибки «ожидается ')'» в win32 api c++

Я определил ID_BUTTON как 1, и когда я пытаюсь запустить код:

CreateWindow(L"Button", L"TEst", style, monitor.right / 2 - 100, 200, 100, 50, m_hWnd, (HMENU) ID_BUTTON, NULL, NULL);

Я получаю сообщение об ошибке "ожидается ')'"

Он отлично работает, если я поставлю NULL вместо "(HMENU) ID_BUTTON", что я упускаю?

#include "Window.h"

#define ID_BUTTON 1;
RECT monitor; // deminsions of monitor


Window::Window() : m_hInst(GetModuleHandle(nullptr)) //creates the window
{
    WNDCLASS wc = {};

    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hInstance = m_hInst;
    wc.lpszClassName = ClassName;
    wc.lpfnWndProc = WindProc;

    RegisterClass(&wc);
    
    DWORD style = WS_OVERLAPPEDWINDOW | WS_VISIBLE;

    GetWindowRect(GetDesktopWindow(), &monitor);

    m_hWnd = CreateWindow(ClassName, WindowTitle, style, 0, 0, 0, 0, NULL, NULL, NULL, NULL);
    ShowWindow(m_hWnd, SW_MAXIMIZE);
}

Window::~Window()
{
    UnregisterClass(ClassName, m_hInst);
}

LRESULT CALLBACK WindProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) // gets input from user
{
    switch (msg) {
    case WM_CREATE:
        AddControls(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    case WM_WINDOWPOSCHANGED:
        std::cout << "1";
        break;
    default:
        return DefWindowProcW(hwnd, msg, wp, lp);
    }
    return 1;
}

bool Window::ProcessMessage()
{
    MSG msg = {};
    while (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE)) {
        if (msg.message == WM_QUIT)
            return false;

        TranslateMessage(&msg);
        DispatchMessageW(&msg);
    }
    
    return true;
}

void AddControls(HWND m_hWnd)
{
    DWORD style = WS_VISIBLE | WS_CHILD | SS_CENTER;

    HWND title = CreateWindow(L"static", L"Welcome", style, monitor.right/2 - 100, 100, 200, 100, m_hWnd, NULL, NULL, NULL);
    SendMessage(title, WM_SETFONT, WPARAM(CreateFont(50, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, ANSI_CHARSET,
        OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, L"Arial")), true);
    CreateWindow(L"Button", L"TEst", style, monitor.right / 2 - 100, 200, 100, 50, m_hWnd, (HMENU) ID_BUTTON, NULL, NULL);

}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
#define ID_BUTTON 1;

Вы определили макрос ID_BUTTON как «1;». Макросы работают как не что иное, как функция поиска/замены. Таким образом, после раскрытия макроса соответствующая строка теперь выглядит так:

CreateWindow(L"Button", L"TEst", style, monitor.right / 2 - 100, 200, 100,
50, m_hWnd, (HMENU) 1;, NULL, NULL);

Синтаксическая ошибка теперь должна быть очевидна. Просто опустите точку с запятой. Макро-директивы не являются операторами C++, за которыми должна следовать точка с запятой. Они живут в своем собственном маленьком пузыре вселенной C++.

или просто напишите const int ID_BUTTON = 1;. Если это обычный оператор C++, вы добавляете точку с запятой.

MSalters 14.11.2022 14:01

Или даже constexpr int ID_BUTTON = 1; и reinterpret_cast<HMENU>(ID_BUTTON)

Ted Lyngmo 14.11.2022 14:11

Другие вопросы по теме