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



#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;

}

// menu_gr.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include "MENU_win.h"

#include <dos.h>

void vivodtext(int x,int y,char* s)

{

    hFont=CreateFontIndirect(&Lf);

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

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

    SetBkColor(hDC,RGB(255,255,0));

    TextOut(hDC,x,y,(LPCSTR)s,strlen(s));

    SelectObject(hDC,hOldFont);

DeleteObject(hFont);

}

int _tmain(int argc, _TCHAR* argv[])

{

    hWnd=GetConsoleWindow();

    if(!hWnd)

{

   printf("Can't get hWnd of console!\n");

              getch();

   return -1;

}

    MoveWindow(hWnd,0,0,800,600,TRUE);

hDC=GetDC(hWnd);

if(!hDC)

{

   printf("Can't get device context!\n");

              getch();

   return -2;

}

GetClientRect(hWnd,&Rect);

    clearscreen();

char *S[]={"Input ","Output ","Record ","Exit "};

int m=0;

Menu M=menu_init(S,4,4,60,30,4);

Do

{

m=menu_vert(&M);

Switch(m)

{

case 0:

              vivodtext(100,200,"First punkt");

    getch();

    break;

case 1:vivodtext(100,240,"Second punkt");

    getch();

    break;

case 2:vivodtext(100,280,"Three punkt");

    getch();

}

}

while(m!=3);

menu_del(&M);

ReleaseDC(hWnd, hDC);     

    return 0;

}

Функция SetDCPenColor

Функция SetDCPenColor устанавливает цвет пера в текущем контексте устройства (DC) в заданный код цвета. Если устройство не может представить устанавливаемый код цвета, цвет устанавливается в самый близкий реальный цвет.

Синтаксис

COLORREF SetDCPenColor( HDChdc,//дескриптор контекста устройства (DC) COLORREFcrColor //новый цвет пера );

Параметры

Hdc

[in] Дескриптор контекста устройства (DC).

CrColor

[in] Устанавливает новый цвет пера.

Возвращаемые значения

Если функция завершается успешно, возвращаемое значение определяет предыдущий цвет пера контекста устройства (DC) как значение COLORREF. Если функция завершается ошибкой, возвращаемое значение - CLR_INVALID.

Замечания

Функция возвращает предыдущий цвет DC_PEN, даже если предопределенное перо DC_PEN не выбрано в контексте устройства (DC); однако, оно не будет использовано в операциях рисования до тех пор, пока предопределение DC_PEN не будет выбрано в контексте устройства (DC).

Функция GetStockObject с параметром DC_BRUSH или DC_PEN может быть использована взаимозаменяемо с функциями SetDCPenColor и SetDCBrushColor.

ICM: Управление цветом выполняется тогда, когда разрешается Независимое управление цветом ( ICM).

Функция SetDCBrushColor

Функция SetDCBrushColor устанавливает в текущий контекст устройства (DC) цвет кисти по заданному коду цвета. Если устройство не может представить указанный код цвета, цвет устанавливается самый близкий к реальному цвету.

Синтаксис

COLORREF SetDCBrushColor( HDChdc,//дескриптор контекста устройства (DC) COLORREFcrColor//новый цвет кисти );

Параметры

Hdc

[in] Дескриптор контекста устройства (DC).

CrColor

[in] Определяет новый цвет кисти.

Возвращаемые значения

Если функция завершается успешно, возвращаемое значение устанавливает предыдущий цвет кисти в контексте устройства (DC) как значение COLORREF.

Если функция завершается ошибкой, возвращаемое значение - CLR_INVALID.

Замечания

Когда в контексте устройства (DC) выбирается заготовка кисти DC_BRUSH, все последующие рисунки должны использовать цвет этой кисти в контексте устройства (DC) до тех пор, пока не будет отменен её выбор. По умолчанию цвет DC_BRUSH является БЕЛЫМ.

Функция возвращает значение цвета предыдущий DC_BRUSH, даже если предопределенная кисть DC_BRUSH в контексте устройства (DC) не выбрана: однако, она не будет использоваться в операциях рисования до тех пор, пока заготовка DC_BRUSH не будет выбрана в контексте устройства (DC).

Функция GetStockObject с параметром DC_BRUSH или DC_PEN может использоваться попеременно с функциями SetDCPenColor и SetDCBrushColor.

Независимое управление цветом (ICM): Управление цветом выполняется тогда, если ICM включено.

Функция UpdateWindow

Функция UpdateWindow обновляет рабочую область заданного окна, отправляя сообщение WM_PAINT окну, если регион обновления окна не пуст. Функция отправляет сообщение WM_PAINTнепосредственно оконной процедуре указанного окна, обходя очередь приложения. Если регион обновления пуст, никакое сообщение не отправляется.

Синтаксис

BOOL UpdateWindow( HWND hWnd//дескриптор окна);

Параметры

HWnd

[in] Дескриптор обновляемого окна.

Возвращаемые значения

Если функция завершается успешно, возвращаемое значение - не нуль.

Если функция завершается ошибкой, возвращаемое значение - нуль.

Windows NT/2000/XP:Чтобы получить дополнительную информацию об ошибке, вызовитеGetLastError.

 


Дата добавления: 2018-06-01; просмотров: 268; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!