#define WIN32_LEAN_AND_MEAN#include <windows.h>
#include <windowsx.h>
#include <stdio.h>     
#include <math.h>#define WINDOW_CLASS_NAME "WINCLASS1"LRESULT CALLBACK WindowProc(HWND hwnd, 
UINT msg, 
WPARAM wparam, 
LPARAM lparam)
{
PAINTSTRUCT ps;
HDC hdc; switch(msg)
{
case WM_CREATE: 
{
return(0);
} break; case WM_PAINT: 
{
hdc = BeginPaint(hwnd,&ps);  
EndPaint(hwnd,&ps);
return(0);
} break; case WM_DESTROY: 
{
PostQuitMessage(0);
return(0);
} break; default:break; } // end switch return (DefWindowProc(hwnd, msg, wparam, lparam));} // end WinProc
int WINAPI WinMain( HINSTANCE hinstance,
   HINSTANCE hprevinstance,
   LPSTR lpcmdline,
   int ncmdshow)
{ WNDCLASSEX winclass;
HWND    hwnd;
MSG    msg; winclass.cbSize         = sizeof(WNDCLASSEX);
winclass.style = CS_DBLCLKS | CS_OWNDC | 
CS_HREDRAW | CS_VREDRAW;
winclass.lpfnWndProc = WindowProc;
winclass.cbClsExtra = 0;
winclass.cbWndExtra = 0;
winclass.hInstance = hinstance;
winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
winclass.hCursor = LoadCursor(NULL, IDC_ARROW);
winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
winclass.lpszMenuName = NULL;
winclass.lpszClassName = WINDOW_CLASS_NAME;
winclass.hIconSm        = LoadIcon(NULL, IDI_APPLICATION); if (!RegisterClassEx(&winclass))
return(0); // create the first window
if (!(hwnd = CreateWindowEx(NULL,
WINDOW_CLASS_NAME,
"Window 1 Based on WINCLASS1",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
0,0,
400,400,
NULL, 
NULL,
hinstance,
NULL)))
return(0); // create the second window
if (!(hwnd = CreateWindowEx(NULL,
WINDOW_CLASS_NAME,
"Window 2 Also Based on WINCLASS1",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
100,100,
400,400,
NULL, 
NULL,
hinstance,
NULL)))
return(0); while(TRUE)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))

if (msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
} // end if
} // end while
return(msg.wParam);
} // end WinMain///////////////////////////////////////////////////////////问题:
这个程序时这样子的,当你关闭了两个窗口中的任意一个,另外一个也随之关闭...
我想实现的理想效果----每次只关闭一个窗口,并且仅当两个窗口都关闭以后才发送WM_QUIT消息!奖励:结贴单独给分!!!

解决方案 »

  1.   


    #define WIN32_LEAN_AND_MEAN#include <windows.h>
    #include <windowsx.h>
    #include <stdio.h> 
    #include <math.h>#define WINDOW_CLASS_NAME "WINCLASS1"HWND HWndPtr_1;
    HWND HWndPtr_2;LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
    {
        PAINTSTRUCT ps; 
        HDC hdc;    switch(msg)
        { 
            case WM_CREATE: 
            {
                return(0);
            } break;        case WM_PAINT: 
            {
                hdc = BeginPaint(hwnd,&ps); 
                EndPaint(hwnd,&ps);
                return(0);
            } break;        case WM_DESTROY: 
            {
                if ( HWndPtr_1 ==  hwnd )
                    HWndPtr_1 = 0;
                else
                    HWndPtr_2 = 0;
                PostQuitMessage(0);
                return(0);
            } break;        default:break;    } // end switch    return (DefWindowProc(hwnd, msg, wparam, lparam));} // end WinProc
    int WINAPI WinMain( HINSTANCE hinstance,HINSTANCE hprevinstance,LPSTR lpcmdline,int ncmdshow)
    {    WNDCLASSEX winclass;
        HWND hwnd;
        MSG msg;     winclass.cbSize = sizeof(WNDCLASSEX);
        winclass.style = CS_DBLCLKS | CS_OWNDC | 
        CS_HREDRAW | CS_VREDRAW;
        winclass.lpfnWndProc = WindowProc;
        winclass.cbClsExtra = 0;
        winclass.cbWndExtra = 0;
        winclass.hInstance = hinstance;
        winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        winclass.hCursor = LoadCursor(NULL, IDC_ARROW);
        winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
        winclass.lpszMenuName = NULL;
        winclass.lpszClassName = WINDOW_CLASS_NAME;
        winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);    if (!RegisterClassEx(&winclass))
            return(0);    // create the first window
        if (!(HWndPtr_1 = CreateWindowEx(NULL,WINDOW_CLASS_NAME,"Window 1 Based on WINCLASS1",
                                    WS_OVERLAPPEDWINDOW | WS_VISIBLE,0,0,
                                    400,400,NULL, NULL,hinstance,NULL))) 
            return(0);    // create the second window
        if (!(HWndPtr_2 = CreateWindowEx(NULL,WINDOW_CLASS_NAME,"Window 2 Also Based on WINCLASS1",
                                    WS_OVERLAPPEDWINDOW | WS_VISIBLE,100,100,400,400,NULL, NULL,hinstance,NULL))) 
            return(0);    while(TRUE)
        {
            if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
            { 
                if ( HWndPtr_1 == 0 && HWndPtr_2 == 0 )
                {
                    if (msg.message == WM_QUIT){
                        break;
                    }
                }
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            } // end if
        } // end while
        return(msg.wParam);
    } // end WinMain///////////////////////////////////////////////////////////
      

  2.   

    你用同一个窗口类创建两个窗口,那么窗口过程是相同的,也就是说消息处理代码是共享的。在处理WM_DESTROY消息时,就不能直接调用PostQuitMessage,先要检查hwnd1或hwnd2(hwnd1和hwnd2是CreateWindow的返回值,保存为全局变量)是否有一个等于零,如果是则调用PostQuitMessage结束程序。如果不成立就检查窗口过程参数hwnd是hwnd1或hwnd2中的哪个,然后把hwnd赋值给它,并令它为零.
      

  3.   

    LRESULT SendMessage(          
        HWND hWnd,   //你要关闭窗口句柄
        UINT Msg,    
        WPARAM wParam,
        LPARAM lParam
    );
    SendMessage(hwnd1,WM_CLOSE,0,0,); //关闭第1个
    SendMessage(hwnd2,WM_CLOSE,0,0,); //关闭第2个