|
|||||
Лекция 8 апреля 2020 года. Разработка интерактивного менюСтр 1 из 2Следующая ⇒ Лекция 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; }
|
|||||
|