正在检测何时单击按钮?[C++,WinAPI]

Detecting when a button is clicked? [C++, WinAPI]

本文关键字:C++ WinAPI 按钮 检测 何时 单击      更新时间:2023-10-16

好的,在这个程序中,我使用Code::Blocks IDE和GNU GCC编译器来编译一个可执行文件。它是一个Win32 GUI项目。我的问题是,尽管这一切都在起作用,但我最近试图实现点击按钮来对它们进行编码&让它们发挥作用。然而,我遇到了一个奇怪的错误,因为那个家伙告诉我代码应该可以工作/

错误:||===生成文件:在Agsploit中发布(编译器:GNU GCC编译器)===|C:\Users\PC\Desktop\Agsplit\main.cpp||函数'intWinMain(HINSTANCE,HINSTANCE,LPSTR,int)':|C: \Users\PC\Desktop\Agsploit\main.cpp|14|错误:应为数字常量前的不合格id|C: \Users\PC\Desktop\Agsploit\main.cpp|55|注意:在宏的扩展中"执行"||===生成失败:1个错误,0个警告(0分钟,1秒)===|

代码(抱歉,不知道如何在这里格式化,所以粘贴了它):http://pastebin.com/raw/r6b5NcXK

#if defined(UNICODE) && !defined(_UNICODE)
    #define _UNICODE
#elif defined(_UNICODE) && !defined(UNICODE)
    #define UNICODE
#endif
#include <tchar.h>
#include <windows.h>
LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
TCHAR szClassName[] = _T("WindowClass");
#define Execute 0
#define RunScript 1
#define Clear 2
#define Help 3
#define Credits 4
#define Commands 5
#define Exit 6
int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow) {
    HWND hwnd;
    MSG messages;
    WNDCLASSEX wincl;
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;
    wincl.style = CS_DBLCLKS;
    wincl.cbSize = sizeof (WNDCLASSEX);
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    if (!RegisterClassEx (&wincl)) {
        return 0;
    };
    hwnd = CreateWindowEx(
           0,
           szClassName,
           _T("LightNinG  || v1  || By: [Team AzuL]"),
           WS_OVERLAPPEDWINDOW ^ WS_THICKFRAME,
           400,
           200,
           740,
           390,
           HWND_DESKTOP,
           NULL,
           hThisInstance,
           NULL
    );
    HWND Execute = CreateWindow(
        "BUTTON",
        "Execute",
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
        250,
        315,
        235,
        50,
        hwnd,
        (HMENU)Execute,
        (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
        NULL
    );
    HWND ScriptButton = CreateWindow(
        "BUTTON",
        "Run script",
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
        485,
        315,
        250,
        50,
        hwnd,
        (HMENU)RunScript,
        (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
        NULL
    );
    HWND Clear = CreateWindow(
        "BUTTON",
        "Clear",
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
        0,
        315,
        250,
        50,
        hwnd,
        (HMENU)Clear,
        (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
        NULL
    );
    HWND Help = CreateWindow(
        "BUTTON",
        "Help",
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
        400,
        0,
        85,
        84,
        hwnd,
        (HMENU)Help,
        (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
        NULL
    );
    HWND Credits = CreateWindow(
        "BUTTON",
        "Credits",
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
        400,
        84,
        85,
        84,
        hwnd,
        (HMENU)Credits,
        (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
        NULL
    );
    HWND Commands = CreateWindow(
        "BUTTON",
        "Commands",
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
        400,
        168,
        85,
        84,
        hwnd,
        (HMENU)Commands,
        (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
        NULL
    );
    HWND Exit = CreateWindow(
        "BUTTON",
        "Exit",
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
        400,
        252,
        85,
        64,
        hwnd,
        (HMENU)Exit,
        (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
        NULL
    );
    HWND OutputWindow = CreateWindow("Edit", "Hello, and welcome to LightNinG by Team AzuL.rnCurrent version: 1rnCurrent # of commands: 0", WS_CHILD | WS_VISIBLE | WS_BORDER | WS_HSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | ES_MULTILINE | ES_READONLY, 0, 0, 400, 290, hwnd, NULL, NULL, NULL);
    HWND InputBar = CreateWindow("Edit", "Input commands here.", WS_CHILD | WS_VISIBLE | WS_BORDER, 0, 290, 400, 25, hwnd, NULL, NULL, NULL);
    HWND ScriptBox = CreateWindow("Edit", "Script(s) go here {client-sided}.", WS_CHILD | WS_VISIBLE | WS_BORDER | WS_HSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | ES_MULTILINE, 485, 0, 250, 314, hwnd, NULL, NULL, NULL);
    ShowWindow (hwnd, nCmdShow);
    while (GetMessage(&messages, NULL, 0, 0)) {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    };
    return messages.wParam;
};
LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
   switch (message) {
       case WM_COMMAND:
           switch(LOWORD(wParam)) {
               case Execute:
               break;
               case RunScript:
               break;
               case Clear:
               break;
               case Help:
               break;
               case Credits:
                   MessageBox(NULL, (LPCWSTR)L"Created by team AzuL.", (LPCWSTR)L"Credits", MB_OK);
               break;
               case Commands:
               break;
               case Exit:
               break;
            }
        break;
       case WM_DESTROY:
           PostQuitMessage(0);
           break;
       default:
           return DefWindowProc(hwnd, message, wParam, lParam);
   };
   return 0;
};

第14行(在错误消息中指出)是

#define Execute 0

第55行(也在您的错误消息中指出)是:

    HWND Execute = CreateWindow(

扩展为:

    HWND 0 = CreateWindow(

这不是有效的C++。

专家们强烈建议有一个原因:

  1. 尽可能少地使用预处理器
  2. 如果必须使用它,请对宏使用ALL_UPPER_CASE(不用于其他任何操作)

首选的解决方案是:

enum class Command : int
{
    Execute = 1,  // I'd always reserve 0 for "no such command".
    RunScript,
    Clear,
    Help,
    Credits,
    Commands,
    Exit,
};

然后可以使用(HMENU)Command::Execute创建按钮。