Jos*_*hua 11 c c++ user-interface winapi visual-c++
我正在尝试使用本机Windows消息队列系统(没有.NET)使用C/C++创建一个简单的窗口.我按照MSDN教程编写了一些创建空窗口的基本代码:
void main()
{
HINSTANCE hinst;
HWND hwndMain;
WNDCLASSEX wnd;
MSG msg;
hinst = GetModuleHandle( NULL );
memset( &wnd, 0, sizeof( wnd ) );
wnd.cbSize = sizeof( wnd );
wnd.lpszClassName = "MainWClass";
wnd.lpfnWndProc = MainWProc;
wnd.hInstance = hinst;
int result = RegisterClassEx( &wnd );
if( !result )
{
printf("RegisterClassEx error: %d\r\n", GetLastError() );
}
hwndMain = CreateWindowEx
(
0, //extended styles
wnd.lpszClassName, //class name
"Main Window", //window name
WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL | WS_MINIMIZEBOX, //style tags
CW_USEDEFAULT, //horizontal position
CW_USEDEFAULT, //vertical position
CW_USEDEFAULT, //width
CW_USEDEFAULT, //height
(HWND) NULL, //parent window
(HMENU) NULL, //class menu
(HINSTANCE) wnd.hInstance, //some HINSTANCE pointer
NULL //Create Window Data?
);
if( !hwndMain )
{
printf("Oh shi- %d\n", GetLastError() );
}
ShowWindow( hwndMain, SW_SHOWDEFAULT );
UpdateWindow( hwndMain );
}
Run Code Online (Sandbox Code Playgroud)
当我运行/调试程序时,CreateWindowEx返回0表示失败.这会触发错误消息"哦shi- [错误代码]".最令人困惑的部分是错误消息打印到控制台:
哦shi- 0
GetLastError()返回的错误代码为0,即ERROR_SUCCESS!
我完全失去了; 怎么了?我很困惑......
PS我在Windows 7 32位上使用Visual C++ Express 2010.我已在其他地方编写过Windows程序,但它只是为所有情况返回0.但是,如果有人想看到它,我将很乐意展示它.
我已将Visual C++项目的Project Default字符集更改为"Not Set".我不应该把L加到我的东西上.
编辑:添加了wnd.hInstance = hinst;
编辑:删除不必要的(WNDPROC)强制转换
编辑:为RegisterClassEx添加了错误检查
事实证明问题出在Visual C++ Express上(或者至少不是代码本身).我将代码复制到另一个项目,它工作.
Han*_*ant 37
wnd.lpfnWndProc = (WNDPROC) MainWProc;
Run Code Online (Sandbox Code Playgroud)
我们无法看到您需要使用演员表的真正原因,但它非常可疑.如果没有看到任何错误,Windows会从GetLastError()返回0.如果窗口过程被破坏,可能会发生这种情况.像这个:
LRESULT CALLBACK MainWProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Windows发送WM_NCCREATE消息以请求创建窗口.如果该消息未得到处理,则将没有窗口.没有错误.固定:
LRESULT CALLBACK MainWProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
Run Code Online (Sandbox Code Playgroud)
根据需要调整以自定义窗口.只需确保为您不想自己处理的每条消息调用DefWindowProc().让Petzold近在咫尺以避免简单的错误.失去了演员.