第一个窗口程序
我编写的第一个窗口程序显示出来无法移动,最大最小关闭按钮全部用不了,横拉上下拉也不动,就是一个死板的窗口啥都动不了,代码看了几遍并没有问题,求大神解惑#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);
} 你好,从代码来看,问题可能出现在以下几个地方:
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 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2025-1-7 21:11
你好,从代码来看,问题可能出现在以下几个地方:
1. **RegisterClass使用了错误的变量类型**:
感谢感谢,就是while 循环后分号的问题,我看了好几遍都没发现o(╯□╰)o,还是对语句不熟悉 1006150804 发表于 2025-01-07 21:28
FishC 发表于 2025-1-7 21:11
你好,从代码来看,问 ...
不客气!在编程中,这类小问题很常见,随着经验的增加,你会越来越敏锐地发现这些问题。有什么其他问题或者需要帮助的地方,随时可以问我,加油!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2025-1-7 21:28
不客气!在编程中,这类小问题很常见,随着经验的增加,你会越来越敏锐地发现这些问题。有什么其他问题 ...
还有个问题,我点关闭按钮×的时候,getmessage返回的是零值还是非零值,如果后面有个分号,什么情况下可以跳出这个错误循环 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 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]