Хелпикс

Главная

Контакты

Случайная статья





Лекция 8 апреля 2020 года. Разработка интерактивного меню



Лекция 8 апреля 2020 года

Разработка интерактивного меню

Необходимо написать программу, создающую кнопочное меню в графическом режиме. Каждый пункт меню представляет собой заданную объемную фигуру (например, прямоугольник). Перемещение по пунктам меню выполняется с помощью клавиш вверх/вниз с эффектом выделения активного пункта меню. Т.е. Активный пункт меню будет иметь другой фон и цвет шрифта.

Эффект объемности (выпуклости) создается как показано на рисунке:

 

 

 

 


Верхний контур должен быть светлее чем нижний.

Если наоборот, то будет эффект вогнутости.

 

#include "windows.h"

#include<conio.h>

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define up 72

#define down 80

#define enter 13

#define esc 27

 

HDC hDC;

HWND hWnd;

RECT Rect;

HPEN hPen, hOldPen;

HBRUSH hBrush, hOldBrush;

HFONT hFont,hOldFont;

LOGFONT Lf={0};

typedef struct

    {

    int x[4];

     COLORREF col;

    char *text;

    }Knopka;

typedef struct

    {

    Knopka *P;

    int n, m;

    }Menu;

 

void clearscreen()

{

    hPen=CreatePen(PS_SOLID,4,RGB(0,0,255));

hOldPen=(HPEN)SelectObject(hDC,hPen);

    hBrush=CreateSolidBrush(RGB(0,0,255));

hOldBrush=(HBRUSH)SelectObject(hDC,hBrush);

    Rectangle(hDC,Rect.left,Rect.top,Rect.right,Rect.bottom);

    SelectObject(hDC,hOldPen);

DeleteObject(hPen);

    SelectObject(hDC,hOldBrush);

DeleteObject(hBrush);

}

 

void knopka(Knopka *P)

{

  hPen=CreatePen(PS_SOLID,4,RGB(255,255,255));

hOldPen=(HPEN)SelectObject(hDC,hPen);

    hBrush=CreateSolidBrush(RGB(255,255,255));

hOldBrush=(HBRUSH)SelectObject(hDC,hBrush);

    hFont=CreateFontIndirect(&Lf);

    hOldFont=(HFONT)SelectObject(hDC,hFont);

Rectangle(hDC,P->x[0]-4,P->x[1]-4,P->x[0]+P->x[2]+4,P->x[1]+P->x[3]+4);

    SelectObject(hDC,hOldPen);

DeleteObject(hPen);

    SelectObject(hDC,hOldBrush);

DeleteObject(hBrush);

 

    hPen=CreatePen(PS_SOLID,4,RGB(0,0,0));

hOldPen=(HPEN)SelectObject(hDC,hPen);

    hBrush=CreateSolidBrush(RGB(0,0,0));

hOldBrush=(HBRUSH)SelectObject(hDC,hBrush);

    Rectangle(hDC,P->x[0],P->x[1],P->x[0]+P->x[2]+4,P->x[1]+P->x[3]+4);

    SelectObject(hDC,hOldPen);

DeleteObject(hPen);

    SelectObject(hDC,hOldBrush);

DeleteObject(hBrush);

 

    hPen=CreatePen(PS_SOLID,4,P->col);

hOldPen=(HPEN)SelectObject(hDC,hPen);

    hBrush=CreateSolidBrush(P->col);

hOldBrush=(HBRUSH)SelectObject(hDC,hBrush);

    Rectangle(hDC,P->x[0],P->x[1],P->x[0]+P->x[2],P->x[1]+P->x[3]);

    SelectObject(hDC,hOldPen);

DeleteObject(hPen);

    SelectObject(hDC,hOldBrush);

DeleteObject(hBrush);

 

    SetTextColor(hDC,RGB(0,0,0));

    SetBkColor(hDC,P->col);

    TextOut(hDC,P->x[0]+2,P->x[1]+2,(LPCSTR)P->text,strlen(P->text));

    SelectObject(hDC,hOldFont);

DeleteObject(hFont);

}

Menu menu_init(char* punkt[],int l,int top,int width,int height,int n)

{

int i;

Menu M; M.n=n; M.m=0;

M.P=new Knopka[n];

for(i=0;i<n;i++)

{

M.P[i].x[0]=l;

if(i==0)M.P[i].x[1]=top;

else M.P[i].x[1]=M.P[i-1].x[1]+M.P[i-1].x[3]+10;

M.P[i].x[2]=width;

M.P[i].x[3]=height;

M.P[i].text=new char[strlen(punkt[i])+1];

strcpy(M.P[i].text,punkt[i]);

}

return M;

}

void menu_del(Menu *M)

{

int i;

for(i=0;i<M->n;i++)

delete []M->P[i].text;

delete[]M->P;

}

int menu_vert(Menu *M)

{

int i;

char ch;

do

{

for(i=0;i<M->n;i++)

{

    if(M->m==i) M->P[i].col=RGB(0,255,0);

    else M->P[i].col=RGB(255,255,0);

    knopka(&(M->P[i]));

}

ch=getch();

switch(ch)

{

case up: if(M->m==0) M->m=M->n-1;

      else (M->m)--;

      break;

case down: if(M->m==M->n-1) M->m=0;

               else (M->m)++;

}

}

while (ch!=enter && ch!=esc);

if(ch==esc) M->m=M->n-1;

return M->m;

}



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.