2016-10-25 57 views
0

我在主窗口(hwnd)中制作一个按钮,当你点击一个按钮时,它会打开一个可以由主窗口控制的新窗口(hwndSec)! 当我点击一个按钮时,hwndSec出现了!当我点击其他按钮时,它可以被修改......但是当我关闭它并尝试重新打开它时,它不响应!所以按钮变得毫无用处!
这是一个简单的例子,一个按钮只是打开窗口,然后试图再次打开它。如何用Windows API重新打开一个关闭的窗口

我的hwndSec中的设定:

wincl.hInstance = hInstance; 
wincl.lpszClassName = "HwndSecClass"; 
wincl.lpfnWndProc = WindowProcedureSec;  
wincl.style = CS_DBLCLKS;     
wincl.cbSize = sizeof (WNDCLASSEX); 

/* Use default icon and mouse-pointer */ 
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); 
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); 
wincl.hCursor = LoadCursor (NULL, IDC_ARROW); 
wincl.lpszMenuName = NULL;     
wincl.cbClsExtra = 0;      
wincl.cbWndExtra = 0;      
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; 

if (!RegisterClassEx (&wincl)) 
    return 0; 

hwnd = CreateWindowEx (
     0,     
     wincl.lpszClassName,   
     _T("Window 2"),  
     WS_OVERLAPPEDWINDOW, 
     CW_USEDEFAULT,  
     CW_USEDEFAULT,  
     500,     
     500,     
     HWND_DESKTOP,   
     NULL,     
     hInstance,  
     NULL     
     ); 

我提出两个窗口程序:

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); 
LRESULT CALLBACK WindowProcedureSec (HWND, UINT, WPARAM, LPARAM); 

当我点击一个按钮,我把这个fonction:

ShowWindow(hwndSec,SW_SHOW); 

,然后第二个窗口正常显示,当我关闭窗口时,它不会再出现。

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
switch (message)     /* handle the messages */ 
{ 
case WM_CREATE: 
    CreateWindow("BUTTON", 
       "open", 
       WS_CHILD | WS_VISIBLE , 
       200,100, 
       100,50, 
       hwnd, 
       (HMENU) ID_BUTTON, 
       NULL, 
       NULL); 
    break; 
case WM_COMMAND: 
    switch(LOWORD(wParam)) 
    { 
    case ID_BUTTON : 
     //printf("%s",(char*)GetLastError()); 
     ShowWindow(hwndSec,SW_SHOW); 
     break; 
    } 
    break; 
    case WM_DESTROY: 
     PostQuitMessage (0); 
     break; 
    default: 
     return DefWindowProc (hwnd, message, wParam, lParam); 
} 

return 0; 
} 


LRESULT CALLBACK WindowProcedureSec (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
switch (message) 
{ 
    case WM_DESTROY: 
     PostMessage(hwnd, WM_CLOSE, 0, 0); 
     break; 
    default: 
     return DefWindowProc (hwnd, message, wParam, lParam); 
} 
return 0; 
} 
+6

它已关闭。没有更多。它已不复存在。它已经过期,并已去见其制造商。它是一只死鹦鹉。你将不得不再次调用CreateWindow()。 –

+0

或者您可以隐藏该窗口并使用ShowWindow再次显示它 – Asesh

+2

该代码表明缺乏洞察力。你真的需要重新开始,并首先获得基本知识。获取一本好书,比如Petzold的[编程Windows®,第五版](https://www.amazon.com/dp/157231995X)。 – IInspectable

回答

0

当正在关闭的窗口中,它接收到一个WM_CLOSE消息。如果该消息被传递到DefWindowProc(),缺省行为是销毁窗口

一个应用程序可提示用户进行确认,之前销毁一个窗口,通过处理WM_CLOSE消息并调用DestroyWindow功能只有当用户确认选择。

默认情况下,DefWindowProc函数调用DestroyWindow函数销毁该窗口。

这进一步MSDN上的讨论:

Closing the Window

所以,你将不得不与CreateWindow/Ex()重新创建你的第二个窗口要显示它已关闭后各一次:

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
    ... 
    case WM_COMMAND: 
     switch (LOWORD(wParam)) 
     { 
     case ID_BUTTON : 
      if (!hwndSec) 
      { 
       hwndSec = CreateWindowEx(
        0, 
        _T("HwndSecClass"), 
        _T("Window 2"), 
        WS_OVERLAPPEDWINDOW, 
        CW_USEDEFAULT, 
        CW_USEDEFAULT, 
        500, 
        500, 
        HWND_DESKTOP, 
        NULL, 
        hInstance, 
        NULL 
       ); 
      } 
      ShowWindow(hwndSec, SW_SHOW); 
      break; 
     } 
     break; 
    ... 
    } 

    return 0; 
} 

LRESULT CALLBACK WindowProcedureSec (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
    case WM_DESTROY: 
     hwndSec = NULL; 
     break; 
    } 

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

如果你不想这样做,那么你需要做的辅助窗口办理WM_CLOSE消息并没有传递给DefWindowProc()。例如,请拨打ShowWindow(SW_HIDE),然后在需要时再拨打ShowWindow(SH_SHOW)

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
    ... 
    case WM_COMMAND: 
     switch (LOWORD(wParam)) 
     { 
     case ID_BUTTON : 
      ShowWindow(hwndSec, SW_SHOW); 
      break; 
     } 
     break; 
    ... 
    } 

    return 0; 
} 


LRESULT CALLBACK WindowProcedureSec (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
    case WM_CLOSE: 
     ShowWindow(hwnd, SW_HIDE); 
     break; 

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

    return 0; 
} 
+0

感谢您的帮助!这两个作品! 我刚开始使用C++(windows.h include ...)所以我不知道可以在WindowProcedure()上接收的所有消息,如WM_CLOSE ..:p 正在做我最好的:D – WaldErcer

+0

您可以接收的一些基本的常见窗口消息在此处列出:[窗口通知](https://msdn.microsoft.com/en-us/library/windows/desktop/ff468922.aspx)。 –

相关问题