Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МП 1,2.doc
Скачиваний:
9
Добавлен:
05.11.2018
Размер:
2.77 Mб
Скачать

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. Схема диалога

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]