【问题标题】:What changes have to be done to make this Windows textbox from 2011, work now, in 2019?必须进行哪些更改才能使此 Windows 文本框从 2011 年开始在 2019 年正常工作?
【发布时间】:2019-05-25 17:19:06
【问题描述】:

必须进行哪些更改才能使此 Windows 文本框从 2011 年开始在 2019 年正常工作?

我尝试编译 this question from 2011 中关于制作 C++ 文本框的代码...

#include <windows.h>

#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR nCmdLine, int nCmdShow)
{
    LPTSTR windowClass = TEXT("WinApp");
    LPTSTR windowTitle = TEXT("Windows Application");
    WNDCLASSEX wcex;

    wcex.cbClsExtra = 0;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.cbWndExtra = 0;
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    wcex.hInstance = hInstance;
    wcex.lpfnWndProc = WndProc;
    wcex.lpszClassName = windowClass;
    wcex.lpszMenuName = NULL;
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    if (!RegisterClassEx(&wcex))
    {
        MessageBox(NULL, TEXT("RegisterClassEx Failed!"), TEXT("Error"), MB_ICONERROR);
        return EXIT_FAILURE;
    }

    HWND hWnd;

    if (!(hWnd = CreateWindow(windowClass, windowTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL)))
    {
        MessageBox(NULL, TEXT("CreateWindow Failed!"), TEXT("Error"), MB_ICONERROR);
        return EXIT_FAILURE;
    }

    HWND hWndEdit = CreateWindow(TEXT("Edit"), TEXT("test"), WS_CHILD | WS_VISIBLE | WS_BORDER, 100, 20, 140, 20, hWnd, NULL, NULL, NULL);

    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    MSG msg;

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return EXIT_SUCCESS;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_DESTROY:
        PostQuitMessage(EXIT_SUCCESS);
    default:
        return DefWindowProc(hWnd, msg, wParam, lParam);
    }
    return FALSE;
}

但尝试在 Visual Studio 2019 中构建它时,我收到有关无法将“t_char”转换为“LPTSTR”的错误。

那么,如何更新代码才能正常工作?是否可以不包含任何其他文件?

【问题讨论】:

  • 旧代码可能需要 Project > Properties > C/C++ > Language > Conformance Mode = "No" 才能编译干净。

标签: c++ winapi visual-studio-2019


【解决方案1】:

使用LPCTSTR 代替LPTSTR

LPCTSTR windowClass = TEXT("WinApp");
LPCTSTR windowTitle = TEXT("Windows Application");

LPTSTRTCHAR *

LPCTSTRconst TCHAR *

TEXT("literal") 产生一个const TCHAR []

字符串文字是常量数据。从 C++11 开始,您不能再将字符串文字分配给指向非 const 的指针。

【讨论】:

  • 我是否必须包含 Windows.h 之外的内容?因为我的 Visual Studio 没有将 LPTCSTR 注册为已定义的内容。
  • 它是LPCTSTR(或者,你知道,wchar_t const *)。
  • @Malandy 我的错,我把C 放在了错误的位置。我已经修好了
  • @quent TCHAR const*,因为 TCHAR 根据构建设置可以是不同的类型。
  • @Yakk 旧的 ASCII API 已经坏掉了,所以最好还是忘记它。
【解决方案2】:

完全退出 TCHAR 业务。这些 TEXT 宏用于与在 Windows 9x 上运行的代码进行交叉编译。

更改这些行:

LPTSTR windowClass = TEXT("WinApp");
LPTSTR windowTitle = TEXT("Windows Application");

到这里:

LPCWSTR windowClass = L"WinApp";
LPCWSTR windowTitle = L"Windows Application";

然后是 TEXT 宏的所有后续用法,如下所示:

MessageBox(NULL, TEXT("RegisterClassEx Failed!"), TEXT("Error"), MB_ICONERROR);

只是宽字符串:

MessageBox(NULL, L"RegisterClassEx Failed!", L"Error", MB_ICONERROR);

【讨论】:

  • 我给人们他们需要的答案。并不总是他们想要的答案。
  • 虽然这个答案包含技术上正确的信息,但它并没有试图解释为什么 OP 的代码无法编译,更不用说解释实际的修复是什么。此外,所描述的更改要求将项目设置为使用 Unicode 字符集,因为代码仍在使用非基于TCHAR 的数据调用基于TCHAR 的函数宏。为了避免这种情况,它需要直接调用Wide函数,即MessageBoxW(NULL, L"...",...)
  • 为什么要用LPCWSTR字母汤?此外,MBCS(其中 TCHAR 是 8 个但)代码可以在现代 Windows 操作系统上运行;不明智,但可能。
  • @Yakk-AdamNevraumont 通常,在使用给定 API 时,您应该使用该 API 定义的类型。当然,您可以直接使用基本语言类型,但是如果/当 API 将来发生变化时,需要更新代码以匹配变化。
  • @remy 我认为使用TCHAR const*TCHAR 改回 8 位的可能性比 LPCWSTR 改回 WCHAR const* 的可能性高 9999 倍,而且两者都不太可能。
猜你喜欢
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 2011-07-20
相关资源
最近更新 更多