2014-03-30 109 views
0

我有一个用WinAPI编写的程序。 我有登录窗口,然后是实际的程序窗口。 我要摧毁的登录窗口,并创建新的窗口..销毁当前窗口并创建一个新窗口

我一直在使用这样的:

破坏程序:

DestroyWindow(MainHwnd); 

和窗口的WndProc(中MainHwnd窗口):

LRESULT Client::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
switch(msg) 
{ 
    case WM_CREATE: 
    break; 

    case WM_COMMAND: 
    break; 

    case WM_CLOSE: 
     DestroyWindow(hwnd); 
    break; 

    case WM_DESTROY: 
     PostQuitMessage(1); 
    break; 

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

return 0; 
} 

而且在这里StackOverflow的人告诉我,在我刚才的问题,我目前a'int销毁窗口,而我造成A S大头钉溢出结束窗口被销毁的地方(程序仍然运行 - 因此它看起来像所有东西都按照计划运行),但是我不想使用不好的编程(特别是导致堆栈溢出来破坏窗口哈哈)

那么,我该如何正确销毁一个窗口?

而且,有些时候,当我用DestroyWindow(MainHwnd)它变得既WM_DESTROYWM_CLOSE内(在当前的WndProc我上面贴)..这是关系到堆栈溢出问题?

顺便说一句 - 我也知道如何使用#C Windows窗体,我想写类似: this.Close();其关闭当前窗口(也许这使我的问题更清晰)...

谢谢!

+0

我相信你必须回到'返回DefWindowProc函数(HWND,味精,wParam中,lParam的);'和'中的情况下wm_destroy'是'PostQuitMessage(0);返回0;' –

+1

DestroyWindow没问题。如何SSCCE而不是描述。 –

+0

但有人告诉我这里'DestroyWindow'调用'WM_CLOSE',而在'WM_CLOSE'中我再次调用'DestroyWindow' ......是不是一个无限循环? 另外,什么是SSCCE? – Amit

回答

1

微软有关WM_CLOSE

An application can prompt the user for confirmation, prior to destroying a window, by processing the WM_CLOSE message and calling the DestroyWindow function only if the user confirms the choice. By default, the DefWindowProc function calls the DestroyWindow function to destroy the window.

所以调用DestroyWindow(hwnd);或不相同。

LRESULT Client::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(msg) 
    { 
     case WM_CREATE: 
      break; 

     case WM_COMMAND: 
      break; 

     case WM_CLOSE: 
      //DestroyWindow(hwnd); 
      break; 

     or 

     case WM_CLOSE: 
      DestroyWindow(hwnd); 
      return 0; 

     case WM_DESTROY: 
      PostQuitMessage(0); 
      return 0; 

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

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

看到一个例子closing window

基本上就是我说的。

瓦尔特

+0

如果是这样,那么为什么有时我调用'DestroyWindow(hwnd)'使我的代码进入'WM_DESTROY',这会关闭我的应用程序,或者根本不摧毁我的窗口? (在所有的时间,这是相同的代码行准确,在同一个地方!) – Amit

+0

@Amit正常的方法是什么也不做,让'返回DefWindowProc函数(HWND,味精,wParam中,lParam的);'做的工作(如我的评论)。否则,如果你明确地调用'DestroyWindow(hwnd);'你应该返回0. –

+0

那么不要在我的wndproc中提到wm_destroy? – Amit