【问题标题】:Detecting when a button is clicked? [C++, WinAPI] [closed]检测何时单击按钮? [C++,WinAPI] [关闭]
【发布时间】:2016-03-24 17:12:20
【问题描述】:

好的,所以在这个程序中,我使用 Code::Blocks IDE 和 GNU GCC 编译器来编译一个可执行文件。它是一个 Win32 GUI 项目。我的问题是,尽管一切正常,但我最近尝试实现单击按钮以对其进行编码并使它们工作。但是,我遇到了一个奇怪的错误,因为那个人告诉我代码应该可以工作/

错误:||=== 构建文件:在 Agsploit 中发布(编译器:GNU GCC 编译器)===| C:\Users\PC\Desktop\Agsploit\main.cpp||在函数'int WinMain(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.\r\nCurrent version: 1\r\nCurrent # 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;
};

【问题讨论】:

  • 谢谢你,你能告诉我你是怎么做到的吗?
  • 我将代码粘贴进去,全选,然后按下 control-K。这是一个在每行开头添加 4 个空格的快捷方式。
  • 啊,谢谢,我没有格式化它的原因是因为我不知道如何一次完成所有操作。这需要一段时间。
  • 如果我可以再问一件事,如何使 HWND 变量在我定义的函数之外可访问?
  • 您需要单独提出这个问题。提示:退货。

标签: c++ winapi button onclick click


【解决方案1】:

第 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 创建按钮。

【讨论】:

  • 嗯.. 所以这意味着我需要在顶部以不同的方式定义它们?比如 DEFINED_EXE 而不是 Execute?
  • 即使全部使用大写字母也会给您带来麻烦。我不幸调试了其中包含#define FILE 1 的代码。问题当然是FILE用在&lt;cstdio&gt;中。
  • 我的解决方案是把 Z_VARIABLE 因为 Z_ 不应该被 windows 使用(如果它是 eww)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
  • 2017-12-14
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多