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

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

Восстановить пароль Регистрация
 
mock
0 / 0 / 0
Регистрация: 13.05.2014
Сообщений: 9
13.05.2014, 12:55     С++ - диалог для работы со структурами данных, определяющими списки #1
Написать программу, в которой используется диалог для работы со структурами данных, определяющими списки. Ввод элементов данных осуществляется с помощью окна редактирования 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++
Нужен пример работы со структурами C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 16:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru