Реализовать закрытие программы клавишей ESCAPE - C (СИ)
Формулировка задачи:
всем привет, кто поможет реализовать закрытие данной программы клавишей ESCAPE?
т.е. при нажатии эскапе окно должно закрываться
заранее спасибо, код ниже
#include <windows.h> /* ïðîòîòèï ГґГіГ*êöèè îêГ*Г* */ LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM); /* ïðîòîòèï ГґГіГ*êöèè îòðèñîâêè ГЈГ°Г*ГґГЁГ·ГҐГ±ГЄГЁГµ ïðèìèòèâîâ ГЁ âûâîäГ* ГІГҐГЄГ±ГІГ* */ void DrawMessageAndEllipse(HWND hwnd,int x,int y,char *msg); char szWinName[] ="MyWin"; /* èìÿ ГЄГ«Г*Г±Г±Г* îêГ*Г* */ /* ГЈГ«Г*ГўГ*Г*Гї ГґГіГ*êöèÿ */ int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode ) { /* äåñêðèïòîð îêГ*Г* */ HWND hwnd; /* ñîîáùåГ*ГЁГҐ */ MSG msg; /* ГЄГ«Г*Г±Г± îêГ*Г* */ WNDCLASSEX wcl; /* îïðåäåëåГ*ГЁГҐ ГЄГ«Г*Г±Г±Г* îêГ*Г* */ wcl.hInstance=hThisInst; /* äåñêðèïòîð Г¤Г*Г*Г*îãî ýêçåìïëÿðГ* */ wcl.lpszClassName=szWinName; /* èìÿ ГЄГ«Г*Г±Г±Г* îêГ*Г* */ wcl.lpfnWndProc=WindowFunc; /* ГґГіГ*êöèÿ îêГ*Г* */ wcl.style=0; /* ñòèëü ГЇГ® óìîë÷Г*Г*ГЁГѕ */ wcl.cbSize = sizeof(WNDCLASSEX); /*Г°Г*çìåð ñòðóòêòóðû */ /* WNDCLASSEX */ wcl.hIcon = LoadIcon(NULL,IDI_WINLOGO);/* áîëüøГ*Гї */ /* ïèêòîðãðГ*ììГ* */ wcl.hIconSm = LoadIcon(NULL,IDI_WINLOGO); /* Г¬Г*Г«Г*Гї */ /* ïèêòîãðГ*ììГ* */ wcl.hCursor = LoadCursor(NULL,IDC_ARROW); /* ôîðìГ* êóðñîðГ* */ wcl.lpszMenuName = NULL; /* ìåГ*Гѕ Г*ГҐ èñïîëüçóåòñÿ */ wcl.cbClsExtra = 0; /* äîïîëГ*èòåëüГ*Г*Гї ГЁГ*ôîðìГ*öèÿ îòñóòñòâóåò */ wcl.cbWndExtra = 0; /* ГґГ®Г* îêГ*Г* Г§Г*Г¤Г*ГҐГІГ±Гї áåëûì */ wcl.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); /* ðåãèñòðГ*öèÿ ГЄГ«Г*Г±Г±Г* îêГ*Г* */ if(!RegisterClassEx(&wcl)) return 0; /* ÑîçäГ*Г*ГЁГҐ îêГ*Г* */ hwnd = CreateWindow ( szWinName, /* èìÿ ГЄГ«Г*Г±Г±Г* îêГ*Г* */ "ÄåìîГ*Г±ГІГ°Г*öèÿ ðèñîâГ*Г*ГЁГї ГЈГ°Г*ГґГЁГ·ГҐГ±ГЄГЁГµ ïðèìèòèâîâ ГЁ Г°Г*áîòû Г± ìûøüþ", /* Г§Г*ãîëîâîê */ WS_CAPTION|WS_BORDER|WS_SYSMENU, /* ñòèëü îêГ*Г* */ CW_USEDEFAULT, /* êîîðäèГ*Г*ГІГ* Г• - îïðåäåëÿåòñÿ Windows */ CW_USEDEFAULT, /* êîîðäèГ*Г*ГІГ* Y - îïðåäåëÿåòñÿ Windows */ CW_USEDEFAULT, /* øèðèГ*Г* - îïðåäåëÿåòñÿ Windows */ CW_USEDEFAULT, /* âûñîòГ* - îïðåäåëÿåòñÿ Windows */ HWND_DESKTOP, /* ðîäèòåëüñêîãî îêГ*Г* Г*ГҐГІ */ NULL, /* ìåГ*Гѕ Г*ГҐГІ */ hThisInst, /* äåñêðèïòîð Г¤Г*Г*Г*îãî ýêçåìïëÿðГ* ïðèëîæåГ*ГЁГї */ NULL /* äîïîëГ*èòåëüГ*ûõ Г*ðãóìåГ*òîâ Г*ГҐГІ */ ); /* îòîáðГ*æåГ*ГЁГҐ îêГ*Г* */ ShowWindow(hwnd,nWinMode); UpdateWindow(hwnd); /* öèêë ñîîáùåГ*ГЁГ© */ while (GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); /* Г°Г*çðåøГ*ГҐГІ èñïîëüçîâГ*Г*ГЁГҐ ГЄГ«Г*ГўГЁГ*òóðû */ DispatchMessage(&msg); /* âîçâðГ*Г№Г*ГҐГІ ГіГЇГ°Г*âëåГ*ГЁГҐ Windows */ } return msg.wParam; } /* ГќГІГ* ГґГіГ*êöèÿ âûçûâГ*ГҐГІГ±Гї Windows 95, êîòîðГ*Гї ïåðåäГ*ГҐГІ ГҐГ© */ /* ñîîáùåГ*ГЁГї ГЁГ§ î÷åðåäè ñîîáùåГ*ГЁГ© */ LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { /* ГЄГ®Г*ГІГҐГЄГ±ГІ óñòðîéñòâГ* */ HDC hDC; int xPos,yPos; char buf[100]; switch (message){ case WM_DESTROY: /* Г§Г*âåðøåГ*ГЁГҐ ïðîãðГ*ììû */ PostQuitMessage(0); break; /*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/ /*ËÅÂÀß ГЉГЌГЋГЏГЉГЂ*/ case WM_LBUTTONDOWN: xPos = LOWORD(lParam); yPos = HIWORD(lParam); if(((xPos>=20)&&(yPos>=20))&&((xPos<=200)&&(yPos<=100))) { wsprintf(buf,"Âû ïîïГ*ëè Гў ïðÿìîóãîëüГ*ГЁГЄ!"); } else wsprintf(buf,"ÇäðГ*ГўГ±ГІГўГіГ© ìèð! "); hDC=GetDC(hwnd); TextOut(hDC,1,1,buf,lstrlen(buf)); ReleaseDC(hwnd,hDC); break; /*ÏÐÀÂÀß ГЉГЌГЋГЏГЉГЂ*/ case WM_RBUTTONDOWN: xPos = LOWORD(lParam); yPos = HIWORD(lParam); //650,380,950,680 if(((xPos>=650)&&(yPos>=380))&&((xPos<=950)&&(yPos<=680))) { wsprintf(buf,"Âû ïîïГ*ëè Гў ýëëèïñ! "); } else wsprintf(buf,"ÇäðГ*ГўГ±ГІГўГіГ© ìèð! "); hDC=GetDC(hwnd); TextOut(hDC,1,1,buf,lstrlen(buf)); ReleaseDC(hwnd,hDC); break; /*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/ /* îáðГ*áîòêГ* ñîîáùåГ*ГЁГї ïåðåðèñîâêè */ case WM_PAINT: /* îòðèñîâêГ* ГЈГ°Г*ГґГЁГ·ГҐГ±ГЄГЁГµ ïðèìèòèâîâ ГЁ âûâîä ñîîáùåГ*ГЁГї*/ DrawMessageAndEllipse(hwnd,0,0,""); break; default: /* ïîçâîëÿåò Windows îáðГ*ГЎГ*òûâГ*ГІГј ëþáûå ñîîáùåГ*ГЁГї Г*ГҐГіГЄГ*Г§Г*Г*Г*ûå Гў ïðåäûäóùåì ñëó÷Г*ГҐ */ return DefWindowProc(hwnd, message,wParam,lParam); } return 0; } /* âûâîäèò ñîîáùåГ*ГЁГҐ Гў îêГ*Г® Гў ïîçèöèþ Г± êîîðäèГ*Г*ГІГ*ìè x,y */ void DrawMessageAndEllipse(HWND hwnd,int x,int y,char *msg) { HDC hDC; PAINTSTRUCT paintStruct; RECT clientRect; /* îáúÿâëåГ*ГЁГҐ ГЄГЁГ±ГІГЁ*/ HBRUSH br1; HBRUSH br2; HBRUSH br3; /* îáúÿâëåГ*ГЁГҐ öâåòîâ */ COLORREF color1,color2,color3,color4,color5; /* îáúÿâëåГ*ГЁГҐ */ HPEN pen1; HPEN pen2; HPEN pen3; /* 32 ГЎГЁГІГ*Г*Гї ñòðóêòóðГ* öâåòГ* */ /* Г±ГІГ*ðøèå äâГ* ГЎГ*éòГ* = 0 ñëåäóþùèå Г§Г*Г¤Г*ГѕГІ Г±ГЁГ*ГѕГѕ êîìïîГ*ГҐГ*ГІГі ñëåäóùèå çåëåГ*ГіГѕ ñëåäóþùèå ГЄГ°Г*Г±Г*ГіГѕ */ /* 0x00bbggrr */ color1=0x00990000;//blue color2=0x00009900;//green color3=0x00009999;//yellow color4=0x00000099;//red color5=0x00000000;//black /* ñîçäГ*Г*ГЁГҐ ГЄГЁГ±ГІГҐГ© */ br1=CreateSolidBrush(color1); br2=CreateSolidBrush(color2); br3=CreateSolidBrush(color3); /* ñîçäГ*Г*ГЁГҐ ГЇГҐГ°Г* 1-ûé ГЇГ*Г°Г*ìåòð Г§Г*Г¤Г*ГҐГІ ñòèëü PS_DASH - øòðèõ PS_DOT - ГЇГіГ*ГЄГІГЁГ° PS_SOLID - ñïëîøГ*îé PS_DASHDOT - øòðèõ - ГЇГіГ*ГЄГІГЁГ° PS_NULL - Г*ГҐГІ ГЇГҐГ°Г* 2-îé òîëùèГ*Гі 3-ГЁГ© öâåò */ pen1=CreatePen(PS_SOLID,3,color4); pen2=CreatePen(PS_SOLID,5,color2); pen3=CreatePen(PS_SOLID,2,color5); /* ïîëó÷åГ*ГЁГҐ ГЄГ®Г*ГІГҐГЄГ±ГІГ* îêГ*Г* */ hDC = BeginPaint(hwnd, &paintStruct); if (hDC != NULL) { // ïîëó÷åГ*ГЁГҐ ïðÿìîóãîëüГ*ГЁГЄГ* êëèåГ*òñêîãî îêГ*Г* GetClientRect(hwnd, &clientRect); // âûáîð ГЄГЁГ±ГІГЁ SelectObject(hDC,br1); // âûáîð ГЇГҐГ°Г* SelectObject(hDC,pen1); /* ðèñóåò ïðÿìîóãîëüГ*ГЁГЄ */ Rectangle(hDC,20,20,200,100); // âûáîð ГЄГЁГ±ГІГЁ SelectObject(hDC,br3); SelectObject(hDC,pen2); /* ðèñóåò ýëëèïñ */ Ellipse(hDC,650,380,950,680); SelectObject(hDC,pen3); // Г§Г*Г¤Г*ГҐГІ öâåò ГІГҐГЄГ±ГІГ* SetTextColor(hDC, RGB(255,0,0)); /* âûâîä ñîîáùåГ*ГЁГї */ TextOut(hDC,x,y,msg,lstrlen(msg)); /* ðèñóåò òðåóãîëüГ*ГЁГҐ ГЇГ® ëèГ*ГЁГїГ¬ */ /* Г§Г*Г¤Г*ГҐГІ ГІГҐГЄГіГ№ГіГѕ ïîçèöèþ */ /* 1-ûé ГЇГ*Г°Г*ìåòð - ГЄГ®Г*ГІГҐГЄГ±ГІ îêГ*Г* */ /* 2-îé ГЁ 3-ГЁГ© êîîðäèГ*Г*ГІГ» ïîçèöèè */ /* 4-Г*Гї ГіГЄГ*Г§Г*òåëü Г*Г* ñòðóêòóðó - ïðåä ïîçèöèþ */ MoveToEx(hDC,350,350,NULL); /* ðèñóåò ëèГ*ГЁГѕ îò ïðåä ïîçèöèè ГЄ Г§Г*Г¤Г*Г*Г*îé ГЁ ïåðåГ*îñèò ГІГҐГЄГіГ№ГіГѕ ïîçèöèþ Гў Г*îâóþ òî÷êó 1-ûé ГЇГ*Г°Г*ìåòð - ГЄГ®Г*ГІГҐГЄГ±ГІ îêГ*Г* 2-îé ГЇГ*Г°Г*ìåòð - Г*îâГ*Гї òî÷êГ* */ LineTo(hDC,350,200); LineTo(hDC,550,350); LineTo(hDC,350,350); /* ГіГ¤Г*ëÿåò ïåðî */ DeleteObject(pen1); DeleteObject(pen2); DeleteObject(pen3); /* ГіГ¤Г*ëÿåò ГЄГЁГ±ГІГЁ */ DeleteObject(br1); DeleteObject(br2); /* îêîГ*Г·Г*Г*ГЁГї îòðèñîâêè */ EndPaint(hwnd, &paintStruct); } }
Решение задачи: «Реализовать закрытие программы клавишей ESCAPE»
textual
Листинг программы
case WM_KEYDOWN: switch (wParam) { case VK_ESCAPE: PostQuitMessage(0); break; } /* ну и далее если что-то еще нужно будет сделать */
Объяснение кода листинга программы
case WM_KEYDOWN:
- Означает, что обработчик сообщения будет выполняться при нажатии клавишиswitch (wParam)
- Определяет, какая именно клавиша была нажатаcase VK_ESCAPE:
- Если нажата клавиша ESCAPE, то выполняется следующий кодPostQuitMessage(0);
- Запускается функция PostQuitMessage, которая сообщает Windows, что программа хочет завершитьсяbreak;
- Код выхода из цикла switch/* ну и далее если что-то еще нужно будет сделать */
- Дополнительный код, который может быть добавлен для дополнительных действий при нажатии клавиши ESCAPE
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д