clihlt писал(а):Полезность этого кода разве что в том, что он показывает как не надо писать.
Если Вам не нравится что я пишу просто игнорируйте меня, т.е. не читайте и всё. У меня нет времени т.к. из-за друзей пришлось устроится на работу, они завидовали мне что я нигде не работаю и на шеи у родителей сижу, я с пн. по пт. с 8 утра, по 18 вечера занимаюсь работой вёрсткой сайтов, мой дальний родственник-шеф запрещает во время работы заниматься посторонними делами, как у меня появится свободное время так я улучшу тот код, тут бесконечно можно править. Программировать под MS-DOS на старом BC++ сильно сложно, это хардкор, в современных ЯП есть синтаксический сахар, и кучу готовых из коробки библиотек, которые упрощают жизнь программистам.
P.S.:Мне с Вами не интересно говорить, т.к. Вы утверждали что x86 архитектура не очень, и утверждали что MacOS 1-9 хорошая, хотя многие утверждают что MacOS с 1-9 до MacOS X были не очень, даже хуже Windows 9X / ME.
StoYazykov писал(а):В общем, переписал я ваш код на более правильный. Размер массива переменных - теперь, не ограничен!
Вы сделали какую-то обфускацию, у нас в IT-колледже за такой код ставили двойку, а на работе за такой код с работы уволят. Код должен быть чистый, и читаемый, с коментариями, без обфускации. А у вас он не чистый и не читаемый.
Исходники GUI под DOS, компилируется на BC++ 4.5, выбераем проект для DOS, модель SMALL, отключаем Float Point Emulation, если не собираемся заниматься полиморфизмом и переопределять методы paint, то не включаем BGI, убераем отладку чтобы программа была компактной, иначе exe-шник будет огромный где-то 36KB-56KB:
Код menuitem.h
Развернуть: menuitem.h- Код: Выделить всё
// Автор:oldpcfan82
#ifndef _MENUITEM_H_
#define _MENUITEM_H_
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
class MenuItem {
private:
int left;
char item[15];
char mnemonic;
int hotkey;
public:
MenuItem(int left, const char *item, char mnemonic, int hotkey);
int get_left();
char *get_item();
char get_mnemonic();
char get_hotkey();
};
#endif
Код menuitem.cpp:
Развернуть: menuitem.cpp- Код: Выделить всё
// Класс MenuItem для менюшки (пункт меню)
// Автор:oldpcfan82
#include "menuitem.h"
// Конструктор MenuItem, т.е. пункт меню, left - размещение слева, item - название, mnemonic - мнемоника, hotkey - см. bios.h функцию bioskey
MenuItem::MenuItem(int left, const char *item, char mnemonic, int hotkey) {
this->left = left;
if(strlen(item) < 15)
strcpy(this->item, item);
else
strncpy(this->item, item, 15);
this->mnemonic = mnemonic;
this->hotkey = hotkey;
}
// Получить позицию по X
int MenuItem::get_left() {
return this->left;
}
// Получить текст
char *MenuItem::get_item() {
return this->item;
}
// Получить hotkey см. bios.h функцию bioskey
char MenuItem::get_hotkey() {
return this->hotkey;
}
// Получить мнемонику
char MenuItem::get_mnemonic() {
return this->mnemonic;
}
Код menubar.h
Развернуть: menubar.h// Автор:oldpcfan82
- Код: Выделить всё
#ifndef _MENUBAR_H_
#define _MENUBAR_H_
#define MAX_MENU_ITEMS 20
#define MAX_MENU_ITEM_TEXT 15
#include <string.h>
#include "menuitem.h"
class MenuBar {
private:
MenuItem* menu_items[MAX_MENU_ITEMS];
int count_items;
int index_items;
int selected_menu_index;
int left;
int top;
int width;
public:
MenuBar(int left, int top, int width, int count_items);
void add_item(int left, char mnemonic, int hotkey, char *item);
MenuItem *get_item(int index);
void set_left(int left);
int get_left();
void set_top(int top);
int get_top();
int get_count_menu_items();
void set_selected_menu_index(int index);
int get_selected_menu_index();
void paint(int text_attr, int sel_text_attr);
};
#endif
Код menubar.cpp
Развернуть: menubar.cpp- Код: Выделить всё
// Класс MenuBar для меню
// Автор:oldpcfan82
#include "menubar.h"
#include "menuitem.h"
#include <conio.h>
// Конструктор: left - месторасположение меню слева, top - месторасположение меню сверху, width - ширина меню, count_items - количество меню
MenuBar::MenuBar(int left, int top, int width, int count_items) {
this->left = left;
this->top = top;
this->width = width;
this->count_items = count_items;
this->index_items = 0;
this->selected_menu_index = -1;
}
// Добавляет пункт меню в меню т.е. в MenuBar, left - позиция влево, mnemonic - мнемоник, hotkey - горячия клавиша см. bios.h и функцию bioskey, item - текст
void MenuBar::add_item(int left, char mnemonic, int hotkey, char *item) {
// Нужно исправить
// if(this->index_items < 1 && this->index_items < this->count_items) {
this->menu_items[this->index_items] = new MenuItem(left, item, mnemonic, hotkey);
this->index_items ++;
//}
}
// Получить пункт меню, index - индекс, который хотим получить
MenuItem *MenuBar::get_item(int index) {
return this->menu_items[index]; // Возвращаем объект
}
// Установить меню влево, left - на сколько влево
void MenuBar::set_left(int left) {
this->left = left;
}
// Получить позицию меню влево
int MenuBar::get_left() {
return this->left;
}
// Установить меню вверх, top - на сколько вверх
void MenuBar::set_top(int top) {
this->top = top;
}
// Получить позицию меню вверху
int MenuBar::get_top() {
return this->top;
}
// Получить количество меню
int MenuBar::get_count_menu_items() {
return this->count_items;
}
// Выделить пункт меню
void MenuBar::set_selected_menu_index(int index) {
this->selected_menu_index = index;
}
// Получить выделенный пункт меню
int MenuBar::get_selected_menu_index() {
return this->selected_menu_index;
}
// Рисовать меню, достаточно этот метод переопределить (полиморфизм)
void MenuBar::paint(int text_attr, int sel_text_attr) {
int j=0;
textattr(text_attr);
gotoxy(this->left, this->top);
for(j=0; j<this->width; j++)
cprintf(" ");
gotoxy(this->left, this->top);
for(j=0; j<this->index_items; j++) {
textattr(text_attr);
if(this->selected_menu_index >= 0) {
if(this->selected_menu_index == j)
textattr(sel_text_attr);
}
MenuItem *item = this->get_item(j);
gotoxy(this->get_left() + item->get_left(), this->get_top());
cprintf("%s", item->get_item());
}
}
Код statusbr.h:
Развернуть: statusbr.h- Код: Выделить всё
// Автор:oldpcfan82
#ifndef _STATUSBAR_H_
#define _STATUSBAR_H_
#include <string.h>
#include <stdio.h>
#include <conio.h>
class StatusBar {
private:
int left;
int top;
int width;
char text[80];
public:
StatusBar(char *text, int left, int top, int width);
void set_text(char *text);
char *get_text();
void set_left(int left);
int get_left();
void set_top(int top);
int get_top();
void set_width(int width);
int get_width();
void paint(int attr);
};
#endif
Код statusbr.cpp:
Развернуть: statusbr.cpp- Код: Выделить всё
// Класс StatusBar для окна статуса
// Автор:oldpcfan82
#include "statusbr.h"
// Конструктор StatusBar, text - текст, left - позиция влево, width - ширина
StatusBar::StatusBar(char *text, int left, int top, int width) {
if(strlen(text) <= 80)
strcpy(this->text, text);
else
strncpy(this->text, text, 80);
this->left = left;
this->top = top;
this->width = width;
}
// Установить текст
void StatusBar::set_text(char *text) {
if(strlen(text) <= 80)
strcpy(this->text, text);
else
strncpy(this->text, text, 80);
}
// Получить текст
char *StatusBar::get_text() {
return this->text;
}
// Установить позицию влево, left - позиция влево
void StatusBar::set_left(int left) {
this->left = left;
}
// Получить позицию влево
int StatusBar::get_left() {
return this->left;
}
// Установить позицию вверх, top - позиция вверх
void StatusBar::set_top(int top) {
this->top = top;
}
// Получить позицию вверх
int StatusBar::get_top() {
return this->top;
}
// Установить ширину, width - ширина
void StatusBar::set_width(int width) {
this->width = width;
}
// Получить ширину
int StatusBar::get_width() {
return this->width;
}
// Метод paint, рисует StatusBar, достаточно переобределить этот метод.
void StatusBar::paint(int attr) {
int j=0;
textattr(attr);
gotoxy(this->left, this->top);
for(j=0; j<this->width; j++)
{
cprintf(" ");
}
gotoxy(this->left, this->top);
cprintf("%s", this->text);
}
Код window.h:
Развернуть: window.h- Код: Выделить всё
// Автор:oldpcfan82
#ifndef _WINDOW_H_
#define _WINDOW_H_
#include <string.h>
#include <stdio.h>
#include <conio.h>
class Window {
private:
int left, top, width, height;
char title[20];
public:
Window(char *title, int left, int top, int width, int height);
void set_title(char *title);
char *get_title();
void set_left(int left);
int get_left();
void set_top(int top);
int get_top();
void set_width(int width);
int get_width();
void set_height(int height);
int get_height();
void resize(int width, int height);
void move(int left, int top);
void paint(int attr);
};
#endif
Код window.cpp:
Развернуть: window.cpp- Код: Выделить всё
// Класс Window для окна
// Автор:oldpcfan82
#include "window.h"
Window::Window(char *title, int left, int top, int width, int height) {
if(strlen(title) < 20)
strcpy(this->title, title);
else
strncpy(this->title, title, 20);
this->left = left;
this->top = top;
this->width = width;
this->height = height;
}
void Window::set_title(char *title) {
if(strlen(title) < 20)
strcpy(this->title, title);
else
strncpy(this->title, title, 20);
}
char *Window::get_title() {
return this->title;
}
void Window::set_left(int left) {
this->left = left;
}
int Window::get_left() {
return this->left;
}
void Window::set_top(int top) {
this->top = top;
}
int Window::get_top() {
return this->top;
}
void Window::set_width(int width) {
this->width = width;
}
int Window::get_width() {
return this->width;
}
void Window::set_height(int height) {
this->height = height;
}
int Window::get_height() {
return this->height;
}
void Window::resize(int width, int height) {
this->width = width;
this->height = height;
}
void Window::move(int left, int top) {
this->left = left;
this->top = top;
}
void Window::paint(int attr) {
window(this->left, this->top, this->width, this->height);
textattr(attr);
clrscr();
}
Код для тестирования main.cpp:
Развернуть: main.cpp- Код: Выделить всё
// Автор:oldpcfan82
// Пример
#include <conio.h>
#include <stdio.h>
#include "menubar.h"
#include "menuitem.h"
#include "statusbr.h"
#include "window.h"
int main(void) {
MenuBar *mb = new MenuBar(1, 1, 79, 2); // Создаём меню в самом верхнем углу, ширина меню 79, 2 - меню
StatusBar *sb = new StatusBar("Это StatusBar", 1, 25, 79); // Создаём окно статуса, надпись
Window *w = new Window("Окно 1", 1, 2, 20, 20); //Создаём окно слева, чуть ниже меню, шириной 20, и высотой 20
mb->add_item(1, 'Ф', 0x10, "Файл"); // Добавляем меню Файл
mb->add_item(10, 'Р', 0x10, "Редактирование"); // Добавляем меню Редактирование
mb->add_item(50, 'П', 0x10, "Помощь"); // Добавляем меню Помощь
textattr(BLACK * 0x10 + LIGHTGRAY); // Устанавливаем чёрный цвет фона, и серые буквы
clrscr(); // Очищаем экран
mb->set_selected_menu_index(0); // Устанавливаем что меню Файл выделено
mb->paint(LIGHTGRAY * 0x10 + BLACK, BLACK * 0x10 + WHITE); // Отображаем меню, серого фона и чёрные буквы, и при выделение чёрный фон и белые буквы
sb->paint(LIGHTGRAY * 0x10 + BLACK); // Отображаем StatusBar, устанавливаем серого фона, и чёрные буквы
w->paint(BLUE * 0x10 + YELLOW); // Отображаем окно, устанавливаем синего фона, жёлтые буквы
getch(); // Ждём нажате любой клавиши...
return 0;
}
Скоро дальше продолжу, наверное на выходных...