- •Введение
- •1. Общие принципы создания интерфейса
- •1.1. Эргономические характеристики интерфейса
- •1.2. Составные части интерфейса
- •1.3. Виды диалога
- •1.4. Процессы ввода – вывода
- •1.5. Методы разработки подпрограмм нижнего уровня
- •Int int86(int num, union regs *inregs, union regs *outregs);
- •Void pokeb(unsigned seg, unsigned off, char value);
- •Int getch();
- •2. Исчезающее меню
- •2.1. Алгоритм создания исчезающего меню
- •2.2. Сохранение и восстановление экрана
- •2.3. Вывод меню и рамки
- •2.4. Определение выбора пользователя
- •2.5. Подпрограмма исчезающего меню
- •3. Иерархическое меню
- •3.1. Фреймы меню
- •3.2. Подпрограмма активизации меню
- •3.3. Организация иерархического меню
- •3.4. Всплывающие окна
- •Void window(int num);
- •Void deactivate(int num);
- •4. Графический интерфейс
- •4.1. Организация меню в графическом режиме
- •Void outtextxy ( int X, int y, char *s);
- •4.2. Организация графического диалога
- •4.3. Особенности графического режима
- •Void putpixel (int color, int X, int y)
- •4.4. Форматы хранения графических файлов
- •5. Прикладной интерфейс для windows
- •5.1. Приложения Windows
- •5.2. Каркас приложения
- •5.3. Обработка сообщений в системе Windows
- •Int ReleaseDc(hwnd hwnd, hdc hdc);
- •Int MessageBox(hwnd hwnd, lpcstr lpText, lpcstr lpCaption, uint wMbType);
- •Int response;
- •5.4. Меню в системе Windows
- •5.5. Диалоги в системе Windows
- •Int DialogBox(hinstance hThisInst,
- •5.6. Пример программы, использующей список и окно ввода
- •6. Лабораторная 1
- •Варианты заданий
- •Пример выполнения задания
- •7 Лабораторная 2
- •Варианты заданий
- •Пример выполнения задания
5.6. Пример программы, использующей список и окно ввода
Рассмотрим циклический список, элементы которого находятся в окне LISTBOX. Запись элементов в список производится из окна EDITTEXT. Вывод оконной функцией элементов циклического списка на экран осуществляется с помощью обработки сообщения WM_PAINT. Остальные опции в оконной функции заканчиваются генерацией сообщения о перерисовке окна.
Определения числовых идентификаторов содержатся в mydialog.h:
#define IDM_DIALOG1 100
#define IDM_DIALOG2 101
#define IDM_HELP 102
#define IDD_RED 103
#define IDD_GREEN 104
#define ID_EB1 400
#define ID_LB1 301
#define IDM_INSERT 200
#define IDM_DELETE 201
#define IDM_SHOW 202
Файл ресурсов mydialog.rc:
#include <windows.h>
#include "mydialog.h"
MYMENU MENU //меню
{
POPUP "List"
{
MENUITEM "I&nsert",IDM_INSERT
MENUITEM "&Delete",IDM_DELETE
MENUITEM "&Show",IDM_SHOW
}
MENUITEM "Help",IDM_HELP
}
MYMENU ACCELERATORS //акселераторы
{
VK_F2,IDM_INSERT,VIRTKEY
VK_F1,IDM_HELP,VIRTKEY
}
MYDB DIALOG 18,18,142,92
CAPTION "Insert & Show" //заголовок окна
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
{
PUSHBUTTON "Конец ввода",IDCANCEL,52,65,60,14, //кнопка Конец ввода
WS_CHILD | WS_VISIBLE | WS_TABSTOP
EDITTEXT ID_EB1, 68, 8, 72, 12, ES_LEFT | //editbox
ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER |
WS_TABSTOP
LISTBOX 301, 2,10,47,80, LBS_NOTIFY | //list box
WS_CHILD | WS_VISIBLE | WS_BORDER |
WS_VSCROLL | WS_TABSTOP
}
Текст программы mydialog.cpp
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include "mydialog.h"
//объявим прототипы функций и глобальные переменные
LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK DialogFunc (HWND,UINT,WPARAM,LPARAM);
char szWinName[] = "Lists";
HINSTANCE hInst;
int X=0, Y=0;
int maxX,maxY;
HDC memdc;
HBITMAP hbit;
HBRUSH hbrush;
char str[80];
int i=1;
struct slink {char *e; slink *next;};
slink* abc1=NULL;
//операции со списком, вставка нового элемента, удаление элемента
slink *insert( slink *lst, char *a)
{
slink *prev=lst, *p= new slink;
p->e = new char[strlen(a)+1];
strcpy(p->e,a); p->e[strlen(a)+1]='\0';
p->next = NULL;
if(lst==NULL) return p;
while(lst->next!=NULL)
{
lst =lst->next;
}
lst->next = p;
return prev;
}
//удаление элемента
slink *del( slink *lst)
{
slink *p=lst;
if(lst)
{
lst = lst->next; delete p;
}
return lst;
}
int WINAPI WinMain(HINSTANCE hThisInst,
HINSTANCE hPrevinst,
LPSTR lpszArgs,
int nWinMode)
{
HWND hwnd;
MSG msg;
WNDCLASS wcl;
HACCEL hAccel;
wcl.hInstance = hThisInst;
wcl.lpszClassName = szWinName;
wcl.lpfnWndProc= WindowFunc;
wcl.style = 0;
wcl.hIcon = LoadIcon (NULL, IDI_APPLICATION); //иконка
wcl.hCursor = LoadCursor(NULL,IDC_ARROW); //курсор
wcl.lpszMenuName = "MYMENU"; //меню
wcl.cbClsExtra = 0;
wcl.cbWndExtra = 0;
//фон
wcl.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
if(!RegisterClass(&wcl))
return 0;
//создадим окно
hwnd = CreateWindow(szWinName,
"Dialogs",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
HWND_DESKTOP,
NULL,
hThisInst,
NULL);
hInst = hThisInst;
hAccel = LoadAccelerators(hThisInst,"MYMENU");//подключим акселераторы
ShowWindow(hwnd,nWinMode); //отобразить окно
UpdateWindow(hwnd);
//обработка акселераторов
while(GetMessage(&msg,NULL,0,0))
{
if(!TranslateAccelerator(hwnd,hAccel,&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
LRESULT CALLBACK WindowFunc(HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT paintstruct;
static TEXTMETRIC tm;
SIZE size;
slink* abc3 = abc1;
switch(message)
{
case WM_CREATE:
// получаем размеры окна
maxX= GetSystemMetrics(SM_CXSCREEN);
maxY= GetSystemMetrics(SM_CYSCREEN);
// строим растр, совместимый с окном
hdc = GetDC(hwnd); //получить DC
memdc= CreateCompatibleDC(hdc);
hbit= CreateCompatibleBitmap(hdc,maxX,maxY);
SelectObject(memdc,hbit);
hbrush=(HBRUSH)GetStockObject(WHITE_BRUSH);
SelectObject(memdc,hbrush);
PatBlt(memdc,0,0,maxX,maxY,PATCOPY);
ReleaseDC(hwnd,hdc); //освободить DC
break;
case WM_COMMAND:
switch (LOWORD (wParam))
{
case IDM_INSERT:
DialogBox(hInst,"MYDB",hwnd, (DLGPROC)DialogFunc);
break;
case IDM_DELETE:
GetTextMetrics(memdc,&tm);
X=Y=0;
PatBlt(memdc,0,0,maxX,maxY,PATCOPY);// очистка экрана
abc1=del(abc1);
abc3=abc1;
while(abc3!=NULL)
{
sprintf(str, "%s", abc3->e);
TextOut(memdc, X, Y, str, strlen(str));
Y = Y+ tm.tmHeight+tm.tmExternalLeading;
abc3=abc3->next;
}
InvalidateRect(hwnd,NULL,1);
break;
case IDM_SHOW:
GetTextMetrics(memdc,&tm);
X=Y=0;
PatBlt(memdc,0,0,maxX,maxY,PATCOPY);
abc3=abc1;
while(abc3!=NULL)
{
sprintf(str, "%s", abc3->e);
TextOut(memdc, X, Y, str, strlen(str));
Y = Y+ tm.tmHeight+tm.tmExternalLeading;
abc3=abc3->next;
}
InvalidateRect(hwnd,NULL,1);
break;
case IDM_HELP:
MessageBox(hwnd,"Help","Help",MB_OK);
break;
}
break;
case WM_PAINT:
hdc=BeginPaint(hwnd,&paintstruct); //get dc
BitBlt(hdc,0,0,maxX,maxY,memdc,0,0,SRCCOPY);
EndPaint(hwnd,&paintstruct); //release DC
break;
case WM_DESTROY:
DeleteDC(memdc);
PostQuitMessage(0); //сообщение о завершении
break;
default: //обработка остальных сообщений
return DefWindowProc(hwnd,message,wParam,lParam);
}
return 0;
}
BOOL CALLBACK DialogFunc(HWND hdwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
long i;
HDC hdc;
slink* abc2;
switch(message)
{
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDCANCEL:
EndDialog(hdwnd,0);
return 1;
case ID_LB1:
if(HIWORD(wParam)==LBN_DBLCLK)
{
i = SendDlgItemMessage(hdwnd,ID_LB1,LB_GETCURSEL,0,0L);
sprintf(str,"Index of choused %d",i);
MessageBox(hdwnd,str,"Choice made",MB_OK);
}
return 1;
case IDOK:
GetDlgItemText(hdwnd, ID_EB1, str,80);
if (strlen(str))
{
abc1 = insert(abc1,str);
SendDlgItemMessage(hdwnd, ID_LB1,
LB_ADDSTRING,0,(LPARAM)str);
}
}
return 1;
case WM_INITDIALOG:
abc2 = abc1;
while (abc2!=NULL)
{
SendDlgItemMessage(hdwnd, ID_LB1,
LB_ADDSTRING,0,(LPARAM)(abc2->e));
abc2 = abc2->next;
} ;
return 1;
}
return 0;
}
Результат работы этой программы приведён на рис. 5.1.
Рис. 5.1. Схема диалога