父窗口创建

时间:2009-12-21 16:36:57

标签: c++ winapi

我知道这是一个非常简单的问题,但我目前无法创建父窗口...... 我的代码:

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
static HWND paste;
static HWND update_list;

/*HWND changeuser =  CreateWindow(0, 0,    
                     0,
                     0, 0, x, y,        
                     0, (HMENU)changeuser2, 0, NULL); */

switch(msg)  
{

case WM_CREATE:
     meniu(hwnd);

     CreateWindow(TEXT("static"), TEXT("\nSuckers online:"),    
                     WS_VISIBLE | WS_CHILD | SS_CENTER,
                     0, 0, x, 55,        
                     hwnd, (HMENU)delete, NULL, NULL); 

    connected = CreateWindow(TEXT("edit"), TEXT(""),    
                     WS_VISIBLE | WS_CHILD | WS_VSCROLL| ES_MULTILINE ,
                     0, 60, x, 340,        
                     hwnd, (HMENU)delete2, NULL, NULL); 

    CreateWindow(TEXT("static"), TEXT(""),    
                     WS_VISIBLE | WS_CHILD | SS_CENTER|BS_PUSHBUTTON,
                     0, 405, x, 358,        
                     hwnd, (HMENU) delete3, NULL, NULL); 

    paste = CreateWindow(TEXT("Edit"), TEXT("Paste the ip here"),    
                     WS_VISIBLE | WS_CHILD | SS_CENTER,
                     x/2 - 60, 410, 120, 40,        
                     hwnd, (HMENU) ip, NULL, NULL); 

    CreateWindow(TEXT("Button"), TEXT("Connect!"),    
                     WS_VISIBLE | WS_CHILD | SS_CENTER | BS_PUSHBUTTON,
                     x/2 - 120, 450, 120, 40,        
                     hwnd, (HMENU) connect2, NULL, NULL); 

    update_list = CreateWindow(TEXT("Button"), TEXT("Update the list!"),  
                     WS_VISIBLE | WS_CHILD | SS_CENTER | BS_PUSHBUTTON,
                     x/2, 450, 120, 40,        
                     hwnd, (HMENU) update, NULL, NULL); 

    _beginthread( lista, 0, (void*)(0) );//begin thread lista

     break;

case WM_CTLCOLORSTATIC : {
    HBRUSH br = CreateSolidBrush(RGB(80,67,77)); // change background color
    SetTextColor((HDC)wParam,RGB(0,102,51)); //the controls text color
    return (LRESULT) br;
    }


 case WM_COMMAND:
     switch LOWORD(wParam)
     {

     case exit:
        PostQuitMessage(0);
        break;

     case ip:
        int nr;
        nr = GetWindowTextLength(paste);
        if (nr >= 17)
        SetWindowText(paste, "");
        break;//omor textul, ca sa pot sa fac paste

     case connect2:
         GetWindowText(paste,adresa,16);
        _beginthread( start, 0, (void*)(0) ); //as\ici se face conexiunea principala
        //DestroyWindow(hwnd);
        MessageBox(0,"Connected with the user","Ok",0);

        break;

     case update:
         exit2 = true;
         Sleep(100);
         SetWindowText(connected,"");
         _beginthread( lista, 0, (void*)(0) );//begin thread lista
         break;      
     }
    break;

 case WM_DESTROY:
     PostQuitMessage(0);
     break;

 }
  return DefWindowProc(hwnd, msg, wParam, lParam);

}   

我希望创建的其他窗口是更改用户窗口的子窗口... 我只是不能让它发生...... 任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

要更改父级窗口,请使用SetParent() 但我会考虑结构 - 如果你需要在正常的对话框设置中更改一个或多个窗口的父级,那么这些窗口可能应该有不同的父级。

在您的情况下,您处理窗口消息时会遇到问题:
如果您的消息处理程序收到WM_DESTROY,则会调用PostQuitMessage(),这可能会导致您的应用程序关闭。

有两种方法可以解决这个问题:

  • 为主对话框和子对话框(最好)使用不同的窗口过程
  • 或使用hwnd参数决定是否致电PostQuitMessage()

答案 1 :(得分:0)

你不能'替换'一个窗口。如果您需要拆除并更换主窗口,请将其删除并重新制作。 Windows只有在有孩子时才会获得父标志,而不是因为你告诉他们。