用API编写的一个windows程序,可是出现错误信息,请问是哪里错了,怎么解决?
发布网友
发布时间:2022-05-20 22:11
我来回答
共2个回答
热心网友
时间:2023-10-05 04:32
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
看到你的函数声明了吗,这个WndProc的P是大写的。
再看看你的函数定义:
LRESULT CALLBACK Wndproc(HWND hwnd,UINT message,WPARAM wParam,LPARAM IParam)
{
。。。。
Wndproc!是小写的!
把你的函数定义的p改为大写的WndProc问题就解决了。
具体想知道为什么有这个错误我们可以慢慢聊,不过如果如果你觉得这样就已经解释了你的疑惑的话就算了,呵呵。
另外,黄金叶说的这个问题也是存在的,用未正确初始化的结构体来调用函数很容易导致运行期的崩溃,不过相比他说的方法,我更推荐的方法是将结构体先初始化为零:
ZeroMemory(&wc,sizeof wc);
最后改成:
int WINAPI
WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR IpCmdLine,int nCmdShow)
{
WNDCLASS wc;
MSG msg;
HWND ghWnd = NULL;
ghInst = hInstance;
ZeroMemory(&wc,sizeof wc);
wc.style = CS_HREDRAW|CS_VREDRAW;
。。。。
windows中需要填的结构体太多了,而多数时候很多项里直接填零就可以了,所以我个人认为凡是用结构体,先用ZeroMemory函数来初始化为零会比较好。像是他说的lpszMenuName就属于这种填0就可以了的数据。
另外WinMain函数收到的 hPrevInstance这个数据在windows 3.1以后再也用不到了,可以利用C++的语法将它直接删去形参名,只留下参数类型。
热心网友
时间:2023-10-05 04:32
Win32API是涉及到很多类型和传递结构体参数的问题,注册窗口类的信息必须完整。
你只要在wc...这些代码后增加一个:
wc.lpszMenuName = NULL ;
就够了。
完整代码是:
#include<windows.h>
HINSTANCE ghInst = NULL;
char *szAppName = "SimpleAPI";
char *szAppTitle = "用API编制的一个简单的窗口";
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE, HINSTANCE,LPSTR,int);
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM IParam)
{
char * msgCreate = "收到WM_CREATE消息!";
char *msgCaption = "提示消息";
char *msgDestroy = "收到WM_DESTROY消息";
char *msgLBTN = "鼠标左键被按下";
switch(message)
{
case WM_CREATE:
MessageBox(GetFocus(),msgCreate,msgCaption,MB_OK|MB_ICONINFORMATION);
break;
case WM_LBUTTONDOWN:
MessageBeep(MB_ICONINFORMATION);
MessageBox(GetFocus(),msgDestroy,msgCaption,MB_OK|MB_ICONINFORMATION);
break;
case WM_DESTROY:
MessageBox(GetFocus(),msgDestroy,msgCaption,MB_OK|MB_ICONINFORMATION);
PostQuitMessage(0);
break;
default:return DefWindowProc(hwnd,message,wParam,IParam);
}
return FALSE;
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR IpCmdLine,int nCmdShow)
{
WNDCLASS wc;
MSG msg;
HWND ghWnd = NULL;
ghInst = hInstance;
wc.style = CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszClassName = szAppName;
wc.lpszMenuName = NULL ;
RegisterClass(&wc);
ghWnd = CreateWindow(szAppName,szAppTitle,WS_OVERLAPPEDWINDOW,0,0,400,350,NULL,NULL,hInstance,NULL);
if(NULL == ghWnd)
return 0;
ShowWindow(ghWnd,nCmdShow);
UpdateWindow(ghWnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}