z_g_j_ 2019-07-14 16:03 采纳率: 0%
浏览 301

如何解决在定义UNICODE(_UNICODE)宏后无法编译Windows窗口应用程序?

我将创建窗口的代码封装成一个SimpleWindow类,放在SimpleWindow.h和SimpleWindow.cpp文件中,然后在main.cpp中写了如下一段测试SimpleWindow类的代码,然后用VS2010命令行的方式编译,编译命令如下
cl /D UNICODE /D UNICODE main.cpp SimpleWindow.cpp /link /subsystem:windows /entry:wmain user32.lib gdi32.lib
发现报如下截图所示错误,
如果我改用如下命令就可以成功编译并运行
cl main.cpp SimpleWindow.cpp /link /subsystem:windows /entry:main user32.lib gdi32.lib
为什么会这样呢?

图片说明

/*
 * File name: main.cpp
 * 测试SimpleWindow类
 */
#include "SimpleWindow.h"

/*
 * 窗口过程函数
 */
LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {       
        case WM_LBUTTONDOWN:
            MessageBox(hWnd, TEXT("Left button is pressed."), TEXT(""), MB_OK);
            return 0;

        case WM_CLOSE:
            if(MessageBox(hWnd, TEXT("Sure to close?"), TEXT(""), MB_YESNO) == IDYES)
                DestroyWindow(hWnd);
            return 0;

        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;

        default:
            return DefWindowProc(hWnd, msg, wParam, lParam);
    }
}

int _tmain()
{
    /*
     * 创建窗口,设置标题和窗口大小
     */
    SimpleWindow myWindow(TEXT("My First Window"), 600, 400);

    /*
     * 显示窗口
     */
    myWindow.Show();

    /*
     * 设置窗口过程函数
     */
    myWindow.SetCallback(WindowProcedure);

    /*
     * 进入消息循环
     */
    myWindow.LoopForRequest();
    return 0;
}

下面为SimpleWindow.h代码

/*
 * File name: SimpleWindow.h
 * SimpleWindow类的接口定义
 */

#ifndef _SimpleWindow_h
#define _SimpleWindow_h


#include <windows.h>
#include <tchar.h>

class SimpleWindow
{
public:
    SimpleWindow(PTSTR windowTitle, int windowWidth, int windowHeight);
    void Show() const;
    void LoopForRequest() const;
    void SetCallback(WNDPROC WindowProcedure);


private:
    bool registerWindowClass(LPTCH windowClassName);


private:
    WNDCLASS wndClass;
    HWND hWnd;
    HINSTANCE hCurrentInstance;
};

#endif

下面为SimpleWindow.cpp代码

/*
 * File name: SimpleWindow.cpp
 * SimpleWindow类的实现
 */
#include "SimpleWindow.h"
/*
 * 创建窗口句柄,指定窗口标题和窗口大小
 */
SimpleWindow::SimpleWindow(PTSTR windowTitle, int windowWidth, int windowHeight)
{
    hCurrentInstance = GetModuleHandle(NULL);
    if(!registerWindowClass(TEXT("SimpleWindow")))
    {
        MessageBox(NULL, TEXT("Can't register a window class."), windowTitle, MB_OK);
        exit(EXIT_FAILURE);
    }
    hWnd = CreateWindow(TEXT("SimpleWindow"),
                        windowTitle,
                        WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        windowWidth,
                        windowHeight,
                        NULL,
                        NULL,
                        hCurrentInstance,
                        NULL);
}

/*
 * 显示窗口
 */
void SimpleWindow::Show() const
{
    ShowWindow(hWnd, SW_SHOW);
    UpdateWindow(hWnd);
}

/*
 * 进入消息循环
 */
void SimpleWindow::LoopForRequest() const
{
    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

/*
 * 设置窗口过程函数
 */
void SimpleWindow::SetCallback(WNDPROC WindowProcedure)
{
    SetWindowLong(hWnd, GWL_WNDPROC, (LONG)WindowProcedure);
}

/*
 * 注册窗口类,注册成功则返回true,否则返回false
 */
bool SimpleWindow::registerWindowClass(LPTCH windowClassName)
{
    wndClass.style = CS_HREDRAW|CS_VREDRAW;
    wndClass.lpfnWndProc = DefWindowProc;
    wndClass.cbClsExtra = 0;
    wndClass.cbWndExtra = 0;
    wndClass.hInstance = hCurrentInstance;
    wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndClass.lpszMenuName = NULL;
    wndClass.lpszClassName = windowClassName;
    if(!RegisterClass(&wndClass))
        return false;
    else
        return true;
}
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-10-25 18:54
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥15 arduino控制ps2手柄一直报错
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥85 maple软件,solve求反函数,出现rootof怎么办?
  • ¥15 求chat4.0解答一道线性规划题,用lingo编程运行,第一问要求写出数学模型和lingo语言编程模型,第二问第三问解答就行,我的ddl要到了谁来求了
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿