#include<windows.h>
HINSTANCE hinst;
HWND hwnd1;
HWND childhwnd[2];
TCHAR szAppName[]=TEXT("MTW"),szChild[]=TEXT("CHILD");
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK ChildWndProc(HWND,UINT,WPARAM,LPARAM);
int x=1;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow)
{
MSG msg;
WNDCLASS wndclass,wndclass1;
wndclass.cbClsExtra =0;
wndclass.cbWndExtra =0;
wndclass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor =LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon =LoadIcon(NULL,IDI_APPLICATION);
wndclass.hInstance =hInstance;
wndclass.lpfnWndProc =WndProc;
wndclass.lpszClassName =szAppName;
wndclass.style =CS_HREDRAW|CS_VREDRAW;
wndclass.lpszMenuName =NULL;
//x=RegisterClass(&wndclass);
 if( !(RegisterClass (&wndclass)))
    {
          MessageBox (NULL, TEXT ("error 100"), 
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }
hwnd1=CreateWindow(szAppName,
  TEXT("子窗口"),
  WS_OVERLAPPEDWINDOW,
  CW_USEDEFAULT,CW_USEDEFAULT,
  CW_USEDEFAULT,CW_USEDEFAULT,
  NULL,NULL,NULL,NULL);
wndclass.lpfnWndProc =ChildWndProc;
wndclass.lpszClassName =TEXT("CHILD");
wndclass.hbrBackground =(HBRUSH)GetStockObject(GRAY_BRUSH);
wndclass.cbWndExtra =20;
if( !(RegisterClass (&wndclass)))
    {
          MessageBox (NULL, TEXT ("error 101"), 
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }
ShowWindow(hwnd1,iCmdShow);
UpdateWindow(hwnd1);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_CREATE:
for(int i=0;i<2;i++)
{
childhwnd[i]=CreateWindow(TEXT("CHILD"),
  NULL,
      WS_VISIBLE | WS_CHILD,
  0,0,0,0,
  hwnd,
  (HMENU)i,
  (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
  NULL);
// MessageBox(NULL,"Success!",NULL,0);
}
x=GetLastError();
return 0;
case WM_SIZE:
x=MoveWindow(childhwnd[0],0,0,LOWORD(lParam)/2,HIWORD(lParam),TRUE);
MoveWindow(childhwnd[1],LOWORD(lParam),0,LOWORD(lParam),HIWORD(lParam),TRUE);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
LRESULT CALLBACK ChildWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch(message)
{
case WM_CREATE:
MessageBox(NULL,"success!",NULL,0);
case WM_SIZE:
InvalidateRect(hwnd,NULL,true);
return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
GetClientRect(hwnd,&rect);
Rectangle(hdc,0,0,rect.right,rect.bottom);
EndPaint(hwnd,&ps);
return 0;
case WM_LBUTTONDOWN:
MessageBox(NULL,"第一个子窗口","fist",0);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}

解决方案 »

  1.   

    刚才我把第一个CreateWindwow跟第二个RegisterWindow换过来就没事了,如果按照上面的代码的话,子窗口就创建失败GetLastError的结果是1407,查了资料是窗口类不存在。
      

  2.   

    要把
    wndclass.lpfnWndProc  =ChildWndProc;
    wndclass.lpszClassName  =TEXT("CHILD");
    wndclass.hbrBackground  =(HBRUSH)GetStockObject(GRAY_BRUSH);
    wndclass.cbWndExtra  =20;
    if( !(RegisterClass (&wndclass)))
      {
      MessageBox (NULL, TEXT ("error 101"),  
      szAppName, MB_ICONERROR) ;
      return 0 ;
      }
    放到
    hwnd1=CreateWindow(szAppName,
    TEXT("子窗口"),
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,CW_USEDEFAULT,
    CW_USEDEFAULT,CW_USEDEFAULT,
    NULL,NULL,NULL,NULL);
    前面
    并不造成冲突
    把注册"CHILD"那段的wndclass改成wndclass1原因是WM_CREATE发生在CreateWindow创建窗口的过程中,此时CreateWindow还没执行完的
      

  3.   

    窗口类设计完,也就是把WNDCLASS结构体填完之后是要先注册的
    不然无法创建窗口
    看这段SDK代码好亲切,想起当年默窗口过程的经历
      

  4.   

    也就是说我这段代码在第一个CreateWindow中触发了WM_CREATE,然后执行窗口过程中的CreateWindow函数,但是此时第一个CreateWindow还没执行完,而修改后的窗口类还没注册,所以就出现就出现了窗口类没找到的的错误.