Реализовать закрытие программы клавишей 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;
  }
  /* ну и далее если что-то еще нужно будет сделать */

Объяснение кода листинга программы

  1. case WM_KEYDOWN: - Означает, что обработчик сообщения будет выполняться при нажатии клавиши
  2. switch (wParam) - Определяет, какая именно клавиша была нажата
  3. case VK_ESCAPE: - Если нажата клавиша ESCAPE, то выполняется следующий код
  4. PostQuitMessage(0); - Запускается функция PostQuitMessage, которая сообщает Windows, что программа хочет завершиться
  5. break; - Код выхода из цикла switch
  6. /* ну и далее если что-то еще нужно будет сделать */ - Дополнительный код, который может быть добавлен для дополнительных действий при нажатии клавиши ESCAPE

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4 из 5
Похожие ответы