Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
mock
0 / 0 / 0
Регистрация: 13.05.2014
Сообщений: 9
#1

С++ - диалог для работы со структурами данных, определяющими списки - C++

13.05.2014, 12:55. Просмотров 275. Ответов 0
Метки нет (Все метки)

Написать программу, в которой используется диалог для работы со структурами данных, определяющими списки. Ввод элементов данных осуществляется с помощью окна редактирования Edit Box. Состояние списка выводится в окно списка List Box. Элемент списка удаляется, если по нему дважды щелкнуть курсором мыши.
Виды структур данных: стек (S2).Тип данных элементов: char (T1). Вид диалога: модальный (D1).
Подскажите как подредактировать код программы под свои условия задачи, пример выполнения с использованием не модального диалога:

Файл rgz12.h

C++
1
2
3
4
5
6
7
#define IDM_DIALOG1 100
#define IDM_HELP 102
#define ID_EB1 400
#define ID_LB1 301
#define IDM_INSERT 200
#define IDM_DELETE 201
#define IDM_SHOW 202
Файл ресурсов rgz12.rc

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <windows.h>
#include "list.h"
// немодальный диалог
MYMENU MENU     
{
  MENUITEM "&Dialog", IDM_DIALOG1
  POPUP "&List"
  {
        MENUITEM "&Insert",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 "Диалог"        //заголовок окна
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE 
{
  DEFPUSHBUTTON  "Ввод",IDOK,52,45,60,14,   //кнопка ввод
    WS_CHILD | WS_VISIBLE | WS_TABSTOP
  PUSHBUTTON "Завершение диалога",IDCANCEL,52,65,80,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 ID_LB1, 2,10,47,80, LBS_NOTIFY |      //list box
    WS_CHILD | WS_VISIBLE | WS_BORDER |
    WS_VSCROLL | WS_TABSTOP
}
Текст программы rgz12.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include "list.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;
TEXTMETRIC tm;
HWND hDlg; // немодальный диалог
char str[80];
int i;
struct slink {char *e; slink *next;};
slink* list1=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;
}
slink *del_num( slink *lst, int n)
{
  slink *p=lst, *q;
  if (n==0) return lst=del(lst);
  for(i=0; i<n; i++)
  {
     q=p;   p = p->next;
  }
  if (p!=NULL)
  {
   q->next=p->next;
   delete p;
  }
  return lst;
}
void sh(HDC hdc, slink *lst )
{
          Y=0;
          PatBlt(hdc,0,0,maxX,maxY,PATCOPY);
          while(lst!=NULL)
          {
                sprintf(str, "%s", lst->e);
                TextOut(memdc, X, Y, str, strlen(str));
                Y = Y+ tm.tmHeight+tm.tmExternalLeading;
                lst=lst->next;
          }
}
 
 
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 (!IsDialogMessage(hDlg, &msg)) // немод
   {
    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;
  char *txt;
  switch(message)
  {
    case WM_CREATE:
        maxX= GetSystemMetrics(SM_CXSCREEN);
        maxY= GetSystemMetrics(SM_CYSCREEN);
      X=maxX/2;
    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);
      GetTextMetrics(memdc,&tm);
      ReleaseDC(hwnd,hdc);  //освободить  DC
      break;
    case WM_COMMAND:
      switch (LOWORD (wParam))
    {
        case IDM_DIALOG1:
        //DialogBox(hInst,"MYDB",hwnd, (DLGPROC)DialogFunc);
       CreateDialog(hInst, "MYDB",hwnd, (DLGPROC)DialogFunc); // немод
        break;
        case IDM_INSERT:
         txt=new char[4];
         sprintf(txt, "%3d", random(1000));
         list1=insert(list1,txt);
         sh(memdc,list1);
         InvalidateRect(hwnd,NULL,1);
         break;
        case IDM_DELETE:
                list1=del(list1);
            sh(memdc, list1);
        InvalidateRect(hwnd,NULL,1);
        break;
        case IDM_SHOW:
          GetTextMetrics(memdc,&tm);
          sh(memdc, list1);
        InvalidateRect(hwnd,NULL,1);
          break;
      case IDM_HELP:
        MessageBox(hwnd,"\nПосле ввода данных"
       "\n в окно редактирования нажмите ENTER","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;
}
 
void list_show (slink *lst, HWND hwnd)
{
slink*  lst_tmp = lst;
    while (lst_tmp!=NULL)
    {
        SendDlgItemMessage(hwnd, ID_LB1,
        LB_ADDSTRING,0,(LPARAM)(lst_tmp->e));
            lst_tmp = lst_tmp->next;
    } ;
}
 
BOOL CALLBACK DialogFunc(HWND hdwnd,
    UINT message,
    WPARAM wParam,
    LPARAM lParam)
{
  long i;
  slink* lst_tmp;
  switch(message)
  {
    case WM_COMMAND:
      switch (LOWORD(wParam))
      {
        case IDCANCEL:
        //EndDialog(hdwnd,0);
        DestroyWindow(hdwnd); // немод
          return 1;
        case ID_LB1:
          if(HIWORD(wParam)==LBN_DBLCLK)
          {
            i = SendDlgItemMessage(hdwnd,ID_LB1,LB_GETCURSEL,0,0L);
            sprintf(str,"Индекс выбранного элемента = %d",i);
            MessageBox(hdwnd,str,"Выбор сделан",MB_OK);
            list1=del_num(list1,i);
            SendDlgItemMessage(hdwnd,ID_LB1,LB_DELETESTRING,i,0L);
          }
       return 1;
        case IDOK:
        GetDlgItemText(hdwnd, ID_EB1, str,80);
          if (strlen(str))
        {
                list1 = insert(list1,str);
            SendDlgItemMessage(hdwnd, ID_LB1,
            LB_ADDSTRING,0,(LPARAM)str);
          }
      }
      return 1;
    case WM_INITDIALOG:
    list_show(list1, hdwnd);
      return 1;
  }
  return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2014, 12:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос С++ - диалог для работы со структурами данных, определяющими списки (C++):

Классы для работы с динамическими структурами данных - C++
Задали такую задачу, сделал почти все лабы из этой главы, но вот эт и еще одну никак не могу понять... не понимаю что имеется ввиду под...

Разработка программы для работы со структурами и файлами данных - C++
не получается сделать корректный вывод запросов. например: при запросе на номер один, должно выводиться характеристика первого датчика ...

Разработать объектно-ориентированную библиотеку для работы со структурами данных - C++
постановка задачи Разработать объектно-ориентированную библиотеку для работы со структурами данных по одной из следующих тем в...

Разработать объектно-ориентированную библиотеку для работы со структурами данных - C++
Постановка задачи: Разработать объектно-ориентированную библиотеку для работы со структурами данных по одной из следующих тем в...

Создать объектно-ориентированную библиотеку для работы со структурами данных - C++
Вторая: Сделать объектно-ориентированную библиотеку (программу, которую будет просто подключать в другие программы для использования её...

Указатели, работа с динамическими структурами данных и динамические списки, стеки - C++
1)Указатели, работа с динамическими структурами данных. Динамическое управление памятью Динамические массивы. Массив должен быть...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2014, 12:55
Привет! Вот еще темы с ответами:

Класс для работы со структурами типа "Множество" - C++
Необходимо создать класс для работы со структурами типа &quot;Множество&quot;. Тип элемента структуры должен предоставляться параметром шаблона. ...

Списки: функции для работы со списками - C++
Помогите пожааааааалуйста с задачками!!!! ;) ОПИШИТЕ ФУНКЦИИ ТИПОВЫХ ОПЕРАЦИЙ С СПИСКАМИ: 1. Функция AddHead (int d) добавление узла...

Работы с динамическими структурами - C++
что то не нравится в объявлении класса, когда пишу функцию добавления, удаления элементов списка struct TList { TList** next;//...

Нужен пример работы со структурами - C++
Здравствуйте, не могли ли вы мне привести пример простой программы, в которой происходят простые действия, в которой присутствует структура...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru