•Due: in three weeks
•DoubleWnd.c creates two windows with the same window class.
•One window is closed, the other is closed too.
•Requirement: Modify the DoubleWnd.c to implement the following functions:
• Can close the two windows respectively.
• The two windows have different actions to the same window message.
The two windows have different actions to the same window message.
我的答案:
//DoubleWnd.c;定义应用程序的入口点。
#include <windows.h>
// 全局变量:
static TCHAR szAppName[] = TEXT ("DoubleWnd") ;//应用程序名;
HWND hwnd1 ; //窗口一的句柄;
HWND hwnd2 ; //窗口二的句柄;
UINT check = 0 ; //此无符号整型用于判断某个窗口关闭后,是否应结束程序;
// 此代码模块中包含的函数的前向声明:
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
ATOM MyRegisterClass(HINSTANCE hInstance) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
MSG msg ;
//窗口初始化;
if (!MyRegisterClass(hInstance))
{
MessageBox (NULL, TEXT ("This program is error!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
//建立第一个窗口;
hwnd1 = CreateWindow (szAppName, // window class name
TEXT ("The first window-张磊"), // window caption
WS_OVERLAPPEDWINDOW, // window style
40, // initial x position
40, // initial y position
300, // initial x size
300, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
//建立第二个窗口;
hwnd2 = CreateWindow (szAppName, // window class name
TEXT ("The second window-张磊"), // window caption
WS_OVERLAPPEDWINDOW|WS_VISIBLE, // window style
400, // initial x position
40, // initial y position
300, // initial x size
300, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
//显示两个窗口并使窗口一处于激活状态;
ShowWindow (hwnd2, iCmdShow) ;
UpdateWindow (hwnd2) ;
ShowWindow (hwnd1, iCmdShow) ;
UpdateWindow (hwnd1) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
//函数 MyRegisterClass(HINSTANCE hInstance);
//目的:初始化并注册窗口;
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
return RegisterClass(&wndclass) ;
}
// 函数: WndProc(HWND, unsigned, WORD, LONG);
// 目的: 处理主窗口的消息;
// WM_LBUTTONDOWN - 响应鼠标左键;
// WM_PAINT - 绘制主窗口;
// WM_DESTROY - 关闭当前窗口或发送退出消息并返回;
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
switch (message)
{
case WM_LBUTTONDOWN:
PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
return 0 ;
case WM_CREATE:
return 0 ;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect (hwnd, &rect) ;
if (hwnd == hwnd1)
{
DrawText (hdc, TEXT ("Hello, the first window!"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
}
else
{DrawText (hdc, TEXT ("Hello, the second window!"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
}
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DESTROY:
if(check == 0)
{
DestroyWindow(hwnd) ;
check = check + 1 ;
}
else
{PostQuitMessage(0) ;
check = check + 1 ;
}
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}