Реализовать закрытие программы клавишей 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