【问题标题】:How to create a button c++如何创建一个按钮 C++
【发布时间】:2021-06-07 16:35:18
【问题描述】:

我正在尝试创建一个按钮,但总是出错

“无法将参数 '2' 的 'const wchar_t*' 转换为 'LPCSTR {aka const char*}' 到 'HWND__* CreateWindowExA(DWORD, LPCSTR, LPCSTR, DWORD, int, int, int, int, HWND, HMENU、HINSTANCE、LPVOID)'"

我试过了:

HWND hwndButton = CreateWindow( 
    L"BUTTON",  
    L"OK",      
    WS_TABSTOP | WS_VISIBLE | BS_DEFPUSHBUTTON,  // Styles 
    10,         
    10,        
    100,       
    100,        
    NULL,     
    NULL,       
    (HINSTANCE)GetWindowLongPtr(NULL, GWLP_HINSTANCE), 
    NULL);     

谁能帮我解决这个问题???

【问题讨论】:

  • 您必须在您的项目设置中启用 unicode 支持,否则您不应该使用 wchar 而是使用 ASCII 字符串。
  • L 前缀将创建 wchar_t (see here),如果您打算支持 unicode,这可能是可取的,但如果您想要 LPCSTR,只需通过 "BUTTON"
  • 另一种选择是将字符串包装在 _T("BUTTON") 宏中。
  • @CoryKramer 成功了,谢谢你的帮助
  • 致电CreateWindowW(注意尾随W)。完成后,请务必阅读What is the HINSTANCE passed to CreateWindow and RegisterClass used for?。更好的选择是获得真正的学习材料,例如 Petzold 的Programming Windows

标签: c++ windows winapi


【解决方案1】:
#include <Windows.h>

int main(INT argc, WCHAR* argv[])
{
    MSG msg;
    HWND hWnd = CreateWindowExW(0L, L"button", L"Hello, World!!!", WS_VISIBLE | WS_POPUP, 10, 10, 100, 25, NULL, NULL, NULL, NULL);
    ShowWindow(hWnd, SW_SHOW);
    UpdateWindow(hWnd);

    while (GetMessageW(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessageW(&msg);
    }

    return msg.wParam;
}

【讨论】:

  • 请解释您的解决方案。没有解释且只有代码的答案会被标记为省力。
  • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
【解决方案2】:

它扩展到A (ANSI) 函数的事实表明您的项目配置为使用多字节字符集而不是Unicode。 Windows 使用 W 函数更快,您并不需要“字符集不可知论”TCHAR_T 宏:Is TCHAR still relevant?

您尚未说明您使用的是哪个 IDE 或编译器,因此很难建议如何将其默认为 Unicode 字符集。尝试查找“项目属性”或类似内容。

如果您打算使用W 函数,只需直接调用它们即可。我明确地说我打电话说wWinMain,而不是_tWinMainSetWindowTextW,不是SetWindowTextMAKEINTRESOURCEW,不是MAKEINTRESOURCE,等等。定位和支持A函数是一个问题这些天非常非常非常少相关。由于您将字符串参数硬编码为L"",因此我假设您也不关心支持 ANSI。

HWND hwndButton = CreateWindowW( 
    L"BUTTON",  
    L"OK",      
    WS_TABSTOP | WS_VISIBLE | BS_DEFPUSHBUTTON,  // Styles 
    10,         
    10,        
    100,       
    100,        
    NULL,     
    NULL,       
    (HINSTANCE)GetWindowLongPtr(NULL, GWLP_HINSTANCE), 
    NULL
);     

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2012-01-29
    • 2014-05-21
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多