【发布时间】:2013-08-30 12:07:51
【问题描述】:
您好,我用这个创建了一个窗口:
WNDCLASSEX WndClass = {0};
if (WndClass.cbSize == 0)
{
WndClass.cbSize = sizeof(WNDCLASSEX);
WndClass.style = CS_DBLCLKS;
WndClass.lpfnWndProc = WindowProcedure;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hInstance = GetModuleHandle(NULL);
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hbrBackground = HBRUSH(COLOR_WINDOW+1);
WndClass.lpszMenuName = NULL;
WndClass.lpszClassName = ClassName.c_str();
WndClass.hIconSm = LoadIcon( NULL, IDI_APPLICATION);
}
if (RegisterClassEx(&WndClass))
{
WindowHandle = CreateWindowEx(0, ClassName.c_str(), WindowName.c_str(), WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL,
CW_USEDEFAULT, CW_USEDEFAULT, Width, Height, NULL, NULL, GetModuleHandle(NULL), NULL);
if(WindowHandle)
{
ShowWindow(WindowHandle, SW_SHOWDEFAULT);
}
}
并尝试添加一个按钮。使用这个:
HWND child = CreateWindowEx(0, L"BUTTON", NULL, WS_CHILD | WS_VISIBLE, n * CHILDS_OFSET, posY, GetWidth(), h, window, NULL, NULL, NULL);
执行代码后,我的窗口保持清晰,但如果我移动它或调整它的大小,按钮变得可见,可能是什么问题?
我试过了:
RECT rc;
GetClientRect(window, &rc);
InvalidateRect(window, &rc, TRUE);
尝试window 是否是主窗口和按钮的句柄。
【问题讨论】:
-
您的 WindowProcedure 中有什么?如果您没有正确处理
WM_PAINT,可能会发生这种情况。 -
@jlahd 可能这里是错误的,我是 WinAPI GUI 的新手,所以找到了一个没有
WM_PAINT处理的示例,只有break,应该如何处理? -
@user2623967 我强烈建议您阅读这里的分步教程:winprog.org/tutorial
-
使用 string::c_str() 生成必须在应用程序的生命周期内保持稳定的 C 字符串是你有一天会后悔的做法。
-
@Hans 我不明白为什么当
RegisterClassEx和CreateWindowEx返回后,这两个std::strings 需要稳定甚至还活着。