此程序本只是通过CreateWindows()函数生成一个标准的windows窗口
     (有最大化,最小化按钮,关闭按钮,通过WS_OVERLAPPEDWINDOW参数定义的风 
     格),可不知怎么原因,执行了下面的return语句:
           if (!hWnd)
                return 0;
         显然,窗口没有创建成功,按F5调试时,不见反应,去掉上面的判断语句,
     不见窗口,但程序驻在内存,通过windows任务管理器可看到.     我猜测是wndclass结构体信息填写有问题
     
     新手上路,帮我分析一下.
  #include<windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);int WINAPI WinMain(HINSTANCE hInstance,
   HINSTANCE hPrevInstance,
   LPSTR lpCmdLine,
   int nCmdShow)
{
MSG msg;
WNDCLASS wndclass;
HWND hWnd;   //填写窗口结构体信息
wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
  wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
  wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName="demo"; if (!RegisterClass(&wndclass))//
return 0; hWnd=CreateWindow("demo","a sample",WS_OVERLAPPEDWINDOW,
              CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
  CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
    
if (!hWnd)
return 0;//每次都执行到这里,也就是说hWnd根本没有创建成 
                           //功
                                                  
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&msg,NULL,NULL,NULL))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
MessageBox(NULL,"after the main","check",0);//此处只用来检测程序                                                     //是否执行到这里 return (msg.wParam);}
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{ switch(message)
{
case WM_CREATE:
 MessageBox(NULL,"sub function","winproc",0);
 break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return 0;
}

解决方案 »

  1.   

    修改一下窗口回调函数!
    LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
    {

    switch(message)
    {
    case WM_CREATE:
    MessageBox(NULL,"sub function","winproc",0);
    break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
    }
      

  2.   

    LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
    { switch(message)
    {
    case WM_CREATE:
     MessageBox(NULL,"sub function","winproc",0);
     break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;         //加
             default:
                 return DefWindowProc(hWnd, message, wParam, lParam); }
    return 0;
    }
      

  3.   


     
        是我把default去掉的.    为什么不加default,hWnd不能注册成功顺便问一个问题,这些疑问我也在vc/mfc基础类问过用SDK大部分要调用API,MFC要用到很多系统自带的类,API与类库到底有什么样的关系?想到书店买一本vc参考书,有:类库参考手册,运行库参考手册,有模板库参考手册,没找到 API ,不知怎么回事
      

  4.   

    "为什么不加default,hWnd不能注册成功"因为在CreateWindow执行过程中就会向窗口发若干消息这些消息如果得不到正确处理会导致CreateWindow失败
      

  5.   

    "API与类库到底有什么样的关系?"MFC 是对 API 的封装使得开发人员可以用一种不同的编程模型来开发程序
      

  6.   

    "没找到 API ,不知怎么回事"书名不一定有 API 这样的字眼找一下书名里有 "WIN32","WINDOWS 编程" 之类的书
      

  7.   

    很多人都忘了default 属于克扣军粮的家伙这种人是要挨罚的
    为了完整
    建议 
    switch编程时先加上default再写其他
      

  8.   

    switch编程时先加上default再写其他,^_^
      

  9.   


        有没有一本书名叫:<<windows api 参考手册>>?
      

  10.   

    有API参考大全,,,我有几本电子的!
    还有一本书,,好厚!!
    价格要在100以上!!
      

  11.   

    return DefWindowProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam);
    就OK了 !