鱼C论坛

 找回密码
 立即注册
查看: 72|回复: 5

[已解决]第一个窗口程序

[复制链接]
发表于 2025-1-7 21:10:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我编写的第一个窗口程序显示出来无法移动,最大最小关闭按钮全部用不了,横拉上下拉也不动,就是一个死板的窗口啥都动不了,代码看了几遍并没有问题,求大神解惑
#include <Windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
        static TCHAR szAppName[] = TEXT("My Window");
        WNDCLASS wndclass;
        HWND hWnd;
        MSG msg;
        wndclass.style = CS_VREDRAW | CS_HREDRAW;
        wndclass.lpfnWndProc = WndProc;
        wndclass.cbClsExtra = 0;
        wndclass.cbWndExtra = 0;
        wndclass.hInstance = hInstance;
        wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
        wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
        wndclass.lpszMenuName = NULL;
        wndclass.lpszClassName = szAppName;
        if (!RegisterClass(&wndclass))
        {
                MessageBox(NULL, TEXT("要在Windows XT下进行"), TEXT("警告"), MB_OK);
                return 0;
        }
        hWnd = CreateWindow(szAppName, TEXT("我的窗口"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
        ShowWindow(hWnd, iCmdShow);
        UpdateWindow(hWnd);
        while (GetMessage(&msg, NULL, 0, 0));
        {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
        }

        return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd , UINT message , WPARAM wParam, LPARAM lParam)
{
        HDC hdc;
        PAINTSTRUCT ps;
        RECT rect;
        switch (message)
        {
        case WM_PAINT:
                hdc = BeginPaint(hWnd, &ps);
                GetClientRect(hWnd, &rect);
                DrawText(hdc, TEXT("我的第一个窗口"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
                EndPaint(hWnd, &ps);
                return 0;
        case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
        }
        return DefWindowProc(hWnd, message, wParam, lParam);
}
最佳答案
2025-1-7 21:11:05
你好,从代码来看,问题可能出现在以下几个地方:

1. **RegisterClass使用了错误的变量类型**:
static TCHAR szAppName = TEXT("My Window");
   这里应该使用数组类型,而不是单个TCHAR:
static TCHAR szAppName[] = TEXT("MyWindow");

2. **GetMessage循环中的分号**:
   在`while`循环之后有一个多余的分号,这会导致循环之外的代码块始终执行,调整如下:
while (GetMessage(&msg, NULL, 0, 0))
   {
       TranslateMessage(&msg);
       DispatchMessage(&msg);
   }

尝试做以上调整后,再运行程序看看问题是否解决。如果还有其他问题,欢迎继续提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2025-1-7 21:11:05 | 显示全部楼层    本楼为最佳答案   
你好,从代码来看,问题可能出现在以下几个地方:

1. **RegisterClass使用了错误的变量类型**:
static TCHAR szAppName = TEXT("My Window");
   这里应该使用数组类型,而不是单个TCHAR:
static TCHAR szAppName[] = TEXT("MyWindow");

2. **GetMessage循环中的分号**:
   在`while`循环之后有一个多余的分号,这会导致循环之外的代码块始终执行,调整如下:
while (GetMessage(&msg, NULL, 0, 0))
   {
       TranslateMessage(&msg);
       DispatchMessage(&msg);
   }

尝试做以上调整后,再运行程序看看问题是否解决。如果还有其他问题,欢迎继续提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-1-7 21:28:20 | 显示全部楼层
FishC 发表于 2025-1-7 21:11
你好,从代码来看,问题可能出现在以下几个地方:

1. **RegisterClass使用了错误的变量类型**:

感谢感谢,就是while 循环后分号的问题,我看了好几遍都没发现o(╯□╰)o,还是对语句不熟悉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-1-7 21:28:30 | 显示全部楼层
1006150804 发表于 2025-01-07 21:28
FishC 发表于 2025-1-7 21:11
你好,从代码来看,问 ...


不客气!在编程中,这类小问题很常见,随着经验的增加,你会越来越敏锐地发现这些问题。有什么其他问题或者需要帮助的地方,随时可以问我,加油!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-1-7 21:38:13 | 显示全部楼层
FishC 发表于 2025-1-7 21:28
不客气!在编程中,这类小问题很常见,随着经验的增加,你会越来越敏锐地发现这些问题。有什么其他问题 ...

还有个问题,我点关闭按钮×的时候,getmessage返回的是零值还是非零值,如果后面有个分号,什么情况下可以跳出这个错误循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-1-7 21:38:53 | 显示全部楼层
1006150804 发表于 2025-01-07 21:38
FishC 发表于 2025-1-7 21:28
不客气!在编程中,这 ...


在Windows编程中,`GetMessage`函数的返回值是很重要的:

- 当`GetMessage`函数返回一个非零值时,表示从消息队列中获取到了一个消息,你的程序应该继续处理这些消息。
- 当`GetMessage`返回零时,表示接收到了`WM_QUIT`消息,此时程序的消息循环应该结束。

由于`GetMessage`的零返回值标志着程序应该退出,因此如果你的`while`循环后面有一个误加的分号,就会导致`while`语句实际上不包含你希望执行的代码块,而导致程序不能正常退出。这会形成一个无限循环,只有当关闭程序进程或者修正代码后再次编译运行才能离开这个循环。

因此,将`while (GetMessage(&msg, NULL, 0, 0));`改为没有分号的形式`while (GetMessage(&msg, NULL, 0, 0))`,然后用大括号围住需要执行的循环代码块,即可避免这个问题。希望这个解释能帮助到你!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-23 07:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表