请问大家:
          如何创建一个子窗口?子窗口类该何时定义?何时注册?
  我随便写的一个程序,凭感觉写的,我知道肯定是错的:
   希望大家帮我改一下  谢谢啦!!#include<windows.h>LRESULT CALLBACK WndProc(
 HWND,UINT,WPARAM,LPARAM
 );   //窗口函数说明;LRESULT CALLBACK WndProc2(
 HWND,UINT,WPARAM,LPARAM
 );   //窗口函数说明;
/*********************************************************/
int WINAPI WinMain(
   HINSTANCE hInstance,
   HINSTANCE hPrevInstance,
   LPSTR     lpszCmdLine,
   int       nCmdShow
   )
{
HWND  hwnd;

MSG   Msg;
WNDCLASS  wndclass;
WNDCLASS  wndclass2;
char  lpszClassName[]="窗口";    //窗口类名;
char  lpszTitle[]="My Windows";  //窗口标题名; //窗口类的定义;
wndclass.style         = 0;
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 = lpszClassName;  //窗口类名; //子窗口类的定义;
wndclass2.style         = 0;
wndclass2.lpfnWndProc   = WndProc2;
wndclass2.cbClsExtra    = 0;         //窗口类无扩展;
wndclass2.cbWndExtra    = 0;         //窗口实例无扩展;
wndclass2.hInstance     = hInstance; 
    wndclass2.hIcon         = LoadIcon(NULL,IDI_APPLICATION);
wndclass2.hCursor       = LoadCursor(NULL,IDC_ARROW);
wndclass2.hbrBackground =(HBRUSH ) GetStockObject(WHITE_BRUSH);
wndclass2.lpszMenuName  = NULL;      //窗口中无菜单;
wndclass2.lpszClassName = lpszClassName;  //窗口类名; //进行窗口类的注册;
if(!RegisterClass( &wndclass ))  //如果注册失败则发出警告的声音;
{
MessageBeep(0);
return FALSE;
} //进行窗口类的注册;
if(!RegisterClass( &wndclass2 ))  //如果注册失败则发出警告的声音;
{
MessageBeep(0);
return FALSE;
} //创建窗口;
hwnd=CreateWindow(
               lpszClassName,
   lpszTitle,
   WS_OVERLAPPEDWINDOW,  //窗口的风格;
   CW_USEDEFAULT,
   CW_USEDEFAULT,        //窗口左上角的坐标为默认值;
   CW_USEDEFAULT,
   CW_USEDEFAULT,        //窗口的宽度和高度都为默认值;
   NULL,                 //此窗口有父窗口;
   NULL,                 //此窗口无主菜单;
   hInstance,            //创建此窗口的应用程序的当前句柄;
   NULL
);
//显示窗口和刷新窗口;
ShowWindow(hwnd,nCmdShow);
    UpdateWindow(hwnd);
   
//消息循环;
while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);
DispatchMessage (&Msg); } return Msg.wParam;    //消息循环结束即程序终止时将信息返回系统;
}//end of WinMain;  //窗口函数;
   LRESULT CALLBACK WndProc( 
   HWND hwnd,
   UINT message,
   WPARAM wParam,
   LPARAM lParam)
   {
   HWND  hwnd2;
   char  lpszClassName[]="窗口";    //窗口类名;
   char  lpszTitle[]="My Windows";  //窗口标题名;
   switch(message)
   {
   case WM_PAINT:
//创建子窗口;
        hwnd2=CreateWindow(
               lpszClassName,
   lpszTitle,
   WS_OVERLAPPEDWINDOW,  //窗口的风格;
   CW_USEDEFAULT,
   CW_USEDEFAULT,        //窗口左上角的坐标为默认值;
   CW_USEDEFAULT,
   CW_USEDEFAULT,        //窗口的宽度和高度都为默认值;
   hwnd,                 //此窗口无父窗口;
   NULL,                 //此窗口无主菜单;
   NULL,            //创建此窗口的应用程序的当前句柄;
   NULL
);           break;           case WM_DESTROY:
   PostQuitMessage(0);
   default:
   return DefWindowProc(hwnd,message,wParam,lParam);
   }
   return 0;
   }
 LRESULT CALLBACK WndProc2( 
   HWND hwnd,
   UINT message,
   WPARAM wParam,
   LPARAM lParam)
   {
   switch(message)
   {
   case WM_DESTROY:
   PostQuitMessage(0);
   default:
   return DefWindowProc(hwnd,message,wParam,lParam);
   }
   return 0;
   }

解决方案 »

  1.   

    if(!RegisterClass( &wndclass2 )) 
    前修改,别用lpszClassName
    wndclass2.lpszClassName = lpszClassName2;  //窗口类名; case WM_PAINT:最好改为
       case WM_CREATE:
      

  2.   

    子窗口只要在使用前(CreateWindow()之前)注册就可以了,至于定义窗口句柄,看你需要使用的作用域了,比如,可以在全局定义。
      

  3.   

    你的子窗口重复定义了,lpszClassName已经被wndclass注册了,给个别的名字吧
      

  4.   

    你用VC的菜单File--New创建一个新工程。
    选择Win32 Application,再选择A typical "Hello World!" application。
    就可以自动生成你想要的代码。
      

  5.   

    我是楼住
       是窗口类定义重名啦~~
       我把名字改啦~~把子窗口类名和标题名全部设为全局变量,就没什么问题啦~
        
        不过还有一点就是:在定义窗口时有个参数:HINSTANCE   并且在创建窗口时也有这个参数 
        HINSTANCE
        我该怎么设置呀?HINSTANCE在程序中有什么用吗?  上面两个值要设成相同的值吗?
        (把这个问题问完了   我就结帖啦~~  谢谢大家帮忙啦~~)