我是c ++的新手,我一直坚持要显示窗口。我没有收到任何错误,但我的窗口没有显示在桌面上。当我打开任务管理器时,它出现在“过程”下。标签。我还没有找到解决这个问题的方法,所以任何帮助都会受到赞赏。谢谢! :)
**注意:我使用的是Microsoft Visual Studio 2012 **注意:不完全是c ++的新手,但更多的是创建一个win32应用程序
#include <Windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
static TCHAR WindowClass[] = L"Window";
LRESULT CALLBACK WindowProc(
HWND WinH,
UINT Msg,
WPARAM wParam,
LPARAM lParam
)
{
switch (Msg)
{
PAINTSTRUCT pntStruct;
static HDC hdc;
case WM_PAINT:
{
BeginPaint(
WinH,
&pntStruct
);
TextOut(hdc,
5, 5,
L"Hello, World!", _tcslen(L"Hello, World!"));
//pntStruct.rcPaint
EndPaint(
WinH,
&pntStruct
);
} break;
case WM_SIZE:
{
} break;
case WM_MOVE:
{
} break;
case WM_DESTROY:
{
} break;
case WM_CLOSE:
{
} break;
default:
{
return DefWindowProc(WinH, Msg, wParam, lParam);
} break;
case WM_ACTIVATEAPP:
{
if (WM_ACTIVATEAPP)
{
OutputDebugStringA("WM_ACTIVEAPP->TRUE");
}
else
{
OutputDebugStringA("WM_ACTIVEAPP->FALSE");
}
} break;
}
return 0;
};
int WINAPI WinMain(
HINSTANCE Window,
HINSTANCE PrevInstance,
LPSTR Cmd,
int CmdShow
)
{
WNDCLASSEX wclass;
//wclass.cbSize = sizeof(WNDCLASS);
wclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wclass.lpfnWndProc = WindowProc;
wclass.cbClsExtra = 0;
wclass.cbWndExtra = 0;
wclass.hInstance = Window;
//wclass.hIcon; TODO: CREATE ICON
//wclass.hCursor;
//wclass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wclass.lpszMenuName = NULL;
wclass.lpszClassName = (LPCTSTR)WindowClass;
// HICON hIconSm;
RegisterClassEx(&wclass);
HWND CreateWin = CreateWindow(
WindowClass,
L"NAME OF WINDOW",
WS_VISIBLE | WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,//WIDTH:[TODO]->Make custom width to fit window
CW_USEDEFAULT,//HEIGHT:[TODO]->Make custom width to fit window
0,
0,
Window,
0
);
ShowWindow(CreateWin, CmdShow);
UpdateWindow(CreateWin);
MSG message;
while (GetMessage(&message, NULL, 0, 0) > 0)
{
TranslateMessage(&message);
DispatchMessage(&message);
};
return 0;
};
答案 0 :(得分:7)
此代码存在许多问题。
您将WindowClass
声明为TCHAR[]
,但使用wchar_t[]
进行初始化。与lpString
的{{1}}参数相同。只有在为项目定义TextOut()
时才会有效,否则会出现编译错误。使用UNICODE
时,需要使用TCHAR
宏包装字符串文字,以便它们使用正确的字符类型。否则,请停止使用TEXT()
并仅使用Unicode API。如果您的代码需要同时支持ANSI(Win9x / ME)和Unicode(NT4 +)编译,则只需使用TCHAR
。没有人真的支持Win9x / Me,所以新代码应该只关注Unicode API。
您没有将TCHAR
结构的内容归零,因此您有意注释掉但未将值分配给(最重要的是WNDCLASSEX
字段)的所有字段都将包含随机值。这可能会导致cbSize
失败,您没有检查。要避免此问题,请务必在使用之前将API结构清零。这对于随时间增长的结构(当较新的Windows版本引入新的结构字段时)尤为重要。此类结构通常具有RegisterClassEx()
字段,因此API知道您正在使用的结构版本,因此您必须提供准确的值。并且您需要将所有未使用的字段清零,这样您就不会从API中获得意外行为。
您没有检查cbSize
是否失败,例如CreateWindow()
失败的副作用。
您的RegisterClassEx()
应该将未处理的邮件传递给WindowProc()
,但您没有这样做。大多数DefWindowProc()
块只是丢弃消息,因此Windows无法处理它们。那是你真正想要的吗?我对此表示怀疑。特别是case
DefWindowProc()
的默认行为是销毁窗口,触发WM_CLOSE
消息。
您的WM_DESTROY
处理程序未调用WM_DESTROY
将PostQuitMessage()
消息放入调用线程的消息队列中,因此WM_QUIT
可以返回0以中断您的消息循环并让应用程序退出。
您的GetMessage()
处理程序未使用WM_PAINT
为您提供的HDC
,您正在使用未初始化的BeginPaint()
变量进行绘制。
所有这些都说,尝试更像这样的事情:
HDC