CreateWindow在什么情况下返回0??

ericqxg007 2006-04-30 03:52:19
在使用CreateWindow函数的时候,得到的hWnd总是返回0。所以程序一直都没有能够运行起来。请问一下造成这样的原因是什么?
(自己搜到一篇关于CreateWindow这方面的解释是:
///////////////////////////////////////////
5.1前,为了模拟一个程序的测试,从那个程序里copy出来一段代码,功能就是调用CreateWindow创建一个窗口;但是怎么也通过不了,CreateWindow老是返回NULL;查了MSDN,上面的代码也基本一样,没找到任何问题,郁闷的要命。
STDMETHODIMP CSetReady::Init( long hInst)
{
HWND s_wndPump = NULL;

WNDCLASS wc;
wc.style = 0;
wc.lpfnWndProc = PumpWndProc;
wc.cbClsExtra = wc.cbWndExtra = 0;
wc.hInstance = (HINSTANCE)hInst;
wc.hIcon = NULL;
wc.hCursor = NULL;
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = _T("Test_Window");

RegisterClass(&wc);
s_wndPump = CreateWindow(wc.lpszClassName, NULL,
WS_DISABLED, 0, 0, 0, 0, NULL, NULL, wc.hInstance, NULL);

return S_OK;
}
原来问题出在传给WNDCLASS的窗口处理函数PumpWndProc上;调用CreateWindow时,CreateWindow会调用一次PumpWndProc,并且要求PumpWndProc返回TRUE。由于代码是copy过来的所以调试CreateWindow,没注意PumpWndProc的返回是什么,造成一直在CSetReady::Init里找原因,白忙活了半天。

//////////////////////////http://blog.csdn.net/toleon/archive/2005/05/24/372491.aspx

照它上面的解释是我的窗口处理函数的问题吗?于是我想跟踪一下程序运行 在我自己的WndProc中加了断点(不过好像单步执行的时候,并没有看见在CreateWindow函数中显示的调用了WndProc)那我该怎么修改我的程序呢?另外怎么才能知道在调用CreateWindow函数的时候WndProc 返回的值。
下面是我自己的程序
大家帮看看哪里出错了
//////////////
HWND hWnd;
hWnd = CreateWindow("5_1",
"Program",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
NULL);
if (!hWnd)
return FALSE;
hWndMain = hWnd;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
////////////////////
//下面是WndProc函数
long WINAPI WndProc(HWND hWnd, UINT iMessage, UINT wParam, LONG lParam)
{
HDC hDC;
PAINTSTRUCT ps;
HPEN hPen;
HBRUSH hBrush;

switch (iMessage)
{
case WM_KEYDOWN :
....
break;
case WM_KEYUP :
InvalidateRect(hWnd, NULL, FALSE);
break;
case WM_CHAR :
.....
break;
case WM_PAINT :
.....
break;
case WM_DESTROY :
PostQuitMessage(0);
return 0;
default :
return DefWindowProc(hWnd, iMessage, wParam, lParam);

}
return 0;
}

///
哪位大哥能说说~~~ 先谢谢了
...全文
438 7 打赏 收藏 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
longge520 2006-05-03
  • 打赏
  • 举报
回复
UP
ericqxg007 2006-05-03
  • 打赏
  • 举报
回复
up
皮皮鲁 2006-05-01
  • 打赏
  • 举报
回复
处理WM_CREATE 并返回 0
ericqxg007 2006-05-01
  • 打赏
  • 举报
回复
看看RegisterClass(&wc)的返回值,是否注册成功?
//////返回应该是成功的


拜托哪位大哥能帮我再考虑这个问题
ericqxg007 2006-05-01
  • 打赏
  • 举报
回复
不知道大家理解我的意思了没有?

我的意思是在InitWindowsClass函数中漏掉了一句 wndclass.hInstance = hInstance;
在缺少的情况下 InitWindowsClass函数返回语句是 return RegisterClass(&wndclass);
我跟踪的时候发现这里返回非零值,也就是说RegisterClass注册wndclass成功。
但是在执行InitWindows函数返回是FALSE。 按理说应该是InitWindowsClass返回FALSE才对啊。
ericqxg007 2006-04-30
  • 打赏
  • 举报
回复
-_-!! -_-!!
今天仔细再查了一次 发现问题了

在窗口类初始化的时候没有把hInstance句柄赋给wndclass的hInstance
加上上面一句之后程序可以运行了


现在我不明白的是:
我在WinMain函数中是这样调用这些函数的
//InitWindowsClass(HINSTANCE hInstance);初始化窗口类
//InitWindows(HINSTANCE hInstance , int nShowCmd);初始化窗口
WinMain函数如下:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd)
{
MSG Message;
if (!InitWindowsClass(hInstance)) //我在InitWindowsClass函数中少了wndclass.hInstance = hInstance这条语句,为什么RegisterClass(&wndclass);返回的值不是FALSE ,并且程序并没有在这里结束//// InitWindowsClass函数代码在下面给出。
{
MessageBeep(0);
return FALSE;
}
if (!InitWindows(hInstance, nShowCmd))//这里程序返回FALSE 这个又是为什么??
{
MessageBeep(0);
return FALSE;
}
while (GetMessage(&Message, 0, 0, 0))
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.wParam;
}


//InitWindowsClass
BOOL InitWindowsClass(HINSTANCE hInstance)
{
WNDCLASS WndClass;

WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hbrBackground =(HBRUSH) GetStockObject(WHITE_BRUSH);
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
WndClass.lpfnWndProc = (WNDPROC)WndProc;
WndClass.lpszClassName = szWindowClass;
WndClass.lpszMenuName = NULL;
WndClass.style = CS_HREDRAW | CS_VREDRAW;
WndClass.hInstance=hInstance;//原来少了这句
return RegisterClass(&WndClass);
}

//InitWindows
BOOL InitWindows(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hWnd = CreateWindow(szWindowClass, "2", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
int i=GetLastError();
if (!hWnd)
return FALSE; // 这里就返回了FALSE
hWndMain = hWnd;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}


不知道我描述的是否清楚 ,mintwlf(Programmer)大哥请帮我看看 分数可以再加,只要问题我弄清楚就可以了。 谢谢
mintwlf 2006-04-30
  • 打赏
  • 举报
回复
看看RegisterClass(&wc)的返回值,是否注册成功?
还有CreateWindow的时候指定WS_POPUP属性。

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧