c++ - 我用 c 编写了一些代码来制作简单的 win32 窗口,但失败了

标签 c++ c winapi

我收到此错误:

LNK1120:第 1 行有 1 个未解析的外部

错误 LNK2019:函数 _WinMain@16 C:\Users\giorgi\Documents\Visual Studio 2013\Projects\Hello\Hello\Source.obj Hello 中引用了无法解析的外部符号 _winproc@20

我是 WinApi 新手,请帮忙。

#include <windows.h>


LRESULT CALLBACK winproc(WNDPROC lpPrevWndFunc, HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR LpCmdLine, int nCmdShow)
{

WNDCLASSEX class;
ZeroMemory(&class, sizeof(WNDCLASSEX));

class.cbSize = sizeof(WNDCLASSEX);
class.style = CS_HREDRAW | CS_VREDRAW;
class.lpfnWndProc = (WNDPROC)winproc;
class.cbClsExtra = 0;
class.cbWndExtra = 0;
class.hInstance = hInstance;
class.hIcon = NULL;
class.hCursor = LoadCursor(NULL, IDC_ARROW);
class.hbrBackground = (HBRUSH)COLOR_WINDOW;
class.lpszClassName = "window class";
class.lpszMenuName = NULL;
class.hIconSm = NULL;

RegisterClassEx(&class);



HWND hwnd = CreateWindowEx
    (
    WS_EX_ACCEPTFILES,
    "window class",
    "window",
    WS_OVERLAPPED,
    200,
    200,
    800,
    600,
    NULL,
    NULL,
    hInstance,
    NULL
    );


ShowWindow(hwnd, nCmdShow);


MSG msg;
ZeroMemory(&msg, sizeof(MSG));


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

return 0;
}


LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg)
{
case WM_DESTROY:
{
    PostQuitMessage(0);
    return 0;
}
    break;
}

return DefWindowProc(hwnd, msg, wp, lp);

}

最佳答案

正如其他人所说,C 区分大小写,因此 winprocWinProc 将是两个不同的函数。您还需要确保 Windows 过程的签名与 Windows 期望的相符,因此请进行以下更改:

  1. LRESULT CALLBACK winproc(WNDPROC lpPrevWndFunc, HWND hwnd, UINT msg, WPARAM wp, LPARAM lp); 更改为 LRESULT CALLBACK winProc(HWND, UINT, WPARAM, LPARAM) ;

  2. class.lpfnWndProc = (WNDPROC)winproc; 更改为 class.lpfnWndProc = (WNDPROC)winProc;

  3. LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) 更改为 LRESULT CALLBACK winProc(HWND hwnd, UINT mgs, WPARAM wp, LPARAM lp)

最后,自从我在 win32-API 级别编程以来已经有一段时间了,但我相信您的 Windows 程序应该如下所示:

    LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
    {
        switch (msg)
        {
            case WM_DESTROY:
            {
                PostQuitMessage(0);
                return 0;
            }
            break;

            default:
                return DefWindowProc(hwnd, msg, wp, lp);
        }
    }

换句话说,如果您自己不处理该消息,您只想返回默认窗口过程 (DefWindowProc)。

关于c++ - 我用 c 编写了一些代码来制作简单的 win32 窗口,但失败了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27928878/

相关文章:

c++ - 编译 vector 类型的类的私有(private)成员时出错 - C++

c++ - 如何避免将 volatile 用于无锁程序?

将结构复制到相同类型结构的数组中

c++ - 你必须注册一个对话框吗?

c++ - 代码下面是哪种排序技术?

c - cast 中的中间指针必须是 "const qualified"- 为什么?

c - 建议用c实现数据库系统?

windows - 取消 RegNotifyChangeKeyValue 的正确方法是什么?

c++ - fstream .open() Win32

c++ - OpenGL - 使用变换矩阵确定平面上的投影