Полезные исходники для DOS

Всё, что касается программирования на старых языках или для старых систем

Re: Полезные исходники для DOS

Сообщение oldpcfan82 » 16 июл 2026, 20:15

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;
}


Скоро дальше продолжу, наверное на выходных...
Последний раз редактировалось oldpcfan82 16 июл 2026, 20:36, всего редактировалось 2 раз(а).
Аватара пользователя
oldpcfan82
Мастер Даунгрейда
 
Сообщения: 676
Зарегистрирован: 01 окт 2023, 22:57

Re: Полезные исходники для DOS

Сообщение clihlt » 16 июл 2026, 21:25

oldpcfan82 писал(а):Вы утверждали что x86 архитектура не очень
"Не очень" это весьма мягко и деликатно сказано -- после архитектуры PDP-11 и MACRO-11 программирование на MASM под 8086, поначалу кроме рвотных позывов никаких других чувств не вызывала, потом попривык, но осадочек остался.
oldpcfan82 писал(а):утверждали что MacOS 1-9 хорошая, хотя многие утверждают что MacOS с 1-9 до MacOS X были не очень, даже хуже Windows 9X / ME.
Я и сейчас это могу повторить -- для любых одногодок MacOS лучше Windows. Нравится вам это, или нет, но это так.
С уважением,
Владислав Васильев (aka clihlt).
Аватара пользователя
clihlt
Мастер Даунгрейда
 
Сообщения: 616
Зарегистрирован: 20 мар 2023, 21:17
Откуда: Брянск, СССР

Re: Полезные исходники для DOS

Сообщение downgrader » 17 июл 2026, 10:09

Надо говорить, по каким параметрам. Потому что если "по всем" - ну точно ж нет :) Как минимум если говорить про MAC OS X - ну "анальная огороженность" же куда круче чем в винде. Я так думаю, что уже у первых версий Х она была примерно как сейчас у десяточки винды. Но в ТО время же были XP и Vista, когда они выходили. Так что для "тупых юзеров" кнопкодавов - оно лучше да. и картиночки\значки покрасивее, да. Для тех же, кто хочет и любит "лазить под капот", как я - точно нет. А на значки мне плевать, пусть хоть как в Win 3.11 будут, норм.
Последний раз редактировалось downgrader 17 июл 2026, 10:11, всего редактировалось 1 раз.
downgrader
 


Re: Полезные исходники для DOS

Сообщение clihlt » 17 июл 2026, 20:26

downgrader писал(а):Так что для "тупых юзеров" кнопкодавов
Не всякий, кто использует компьютер по его прямому назначению в своей профессиональной деятельности, а не предаётся детской забаве "а сейчас посмотрим, что у моей игрушечной машинки внутри", является "тупым юзером" и "кнопкодавом", хотя с точки зрения экзальтированного молодого поколения с гормональным штормом в голове он конечно же таковой и никак иначе.

Кстати, то, что MscOS была изначально спроектирована именно для работы, а не для вечного копания внутри и нескончаемого процесса настройки всегда выгодно отличало её от той же Windows.
С уважением,
Владислав Васильев (aka clihlt).
Аватара пользователя
clihlt
Мастер Даунгрейда
 
Сообщения: 616
Зарегистрирован: 20 мар 2023, 21:17
Откуда: Брянск, СССР

Re: Полезные исходники для DOS

Сообщение oldpcfan82 » 19 июл 2026, 16:18

Вот код, который разрешает делать как в Java, в PHP, и в Python под Windows, ну язык Си придумал вроде бы Денис Риичи а юникс Кен Томпсон, они и над Юниксом работали, поэтому в Си escape-последовательности были так \\ \n \t \\b \\0x07, поэтому в Юникс был выбран путь через /, для DOS и Windows была головной болью так путь \, в PHP, Python, и Java под Windows разрешают так:C:/windows/readme.txt, я именно так в PHP, Java, и Python и пишу, т.е. вместо C:\\windows\\readme.txt, я пишу C:/windows/readme.txt. А в C# сделали так: string str_path = @"C:\windows\readme.txt"; но если без @, то надо корячиться string str_path = "C:\\indows\\readme.txt"; Кстати, и в URL http://www.../ а не http:\\www
Код: Выделить всё
/* Из юникс стиля в DOS стиль */
void conv_from_unix_to_dos_path(char *str_path) {
  int j;
  /* Цикл крутится, пока не дойдет до конца строки */
  for(j=0; str_path[j] != '\0'; j++) {
        if(str_path[j] == '/') {
            str_path[j]='\\'; /* Экранируем обратный слэш */
        }
}


Теперь можно писать как в Java и PHP:
Код: Выделить всё
char str_path[] = "C:/windows/readme.txt";
FILE *f;
conv_from_unix_to_dos_path(str_path); /* Заменяет с C:/windows/readme.txt в переменной str_path, на C:\\windows\\readme.txt */
f = fopen(str_path, "r"); /* Открывает файл не C:/windows/readme.txt а C:\Windows\readme.txt */


Кстати теперь можно так:
Код: Выделить всё
char* conv_from_unix_to_dos_path(char *str_path) {
    int j;
    for(j = 0; str_path[j] != '\0'; j++) {
        if(str_path[j] == '/') {
            str_path[j] = '\\';
        }
    }
    return path; /* Возвращаем указатель */
}
#define _fopen(p, a) (conv_from_unix_to_dos_path(p), fopen(p, a))
Последний раз редактировалось oldpcfan82 19 июл 2026, 16:41, всего редактировалось 3 раз(а).
Аватара пользователя
oldpcfan82
Мастер Даунгрейда
 
Сообщения: 676
Зарегистрирован: 01 окт 2023, 22:57

Re: Полезные исходники для DOS

Сообщение StoYazykov » 19 июл 2026, 16:42

oldpcfan82 писал(а): \\0x07

\\0x07? Полное незнание Си обнаружено...

Надо \07 или \x07.
Самое тёмное дело - это строки в C

Объектно-ориентированное программирование -- метод изготовления граблей по принципу матрешки.

http://revival.narod.ws

Изображение
Аватара пользователя
StoYazykov
Мастер Даунгрейда
 
Сообщения: 278
Зарегистрирован: 25 дек 2023, 11:25
Откуда: Казань
Железо: Intel Pentium MMX 166 MHz, 8 и 2 ГБ HDD, 80 MB RAM; AMD A8-6410 APU with Radeon R5 Graphics, 16 ГБ

Re: Полезные исходники для DOS

Сообщение oldpcfan82 » 19 июл 2026, 17:43

StoYazykov, мой отец против программирования на си, и врачи запрещали программированием вообще заниматься, т.к. я получил в 2013 году инвалидность, если работать можешь, то это противоречит инвалидности, это у нас в Германии только такое, в других странах можно спокойно программировать, там это не значит что не инвалид, да и лекарства вызввали у меня лень. Просто у нас инвалидов очень много, поэтому строго было. В этом году всё резко изменилось, и врачи разрешают мне теперь работать. Да и \07 или \x07 это такая мелочь.
Аватара пользователя
oldpcfan82
Мастер Даунгрейда
 
Сообщения: 676
Зарегистрирован: 01 окт 2023, 22:57

Re: Полезные исходники для DOS

Сообщение StoYazykov » 19 июл 2026, 20:16

Ладно, погорячился. Но вообще, вам на заметку - из "String \\0x07" получится "String \0x07" (то есть, это будет в строковой переменной или в терминале).
Не то, что хотелось бы.
Самое тёмное дело - это строки в C

Объектно-ориентированное программирование -- метод изготовления граблей по принципу матрешки.

http://revival.narod.ws

Изображение
Аватара пользователя
StoYazykov
Мастер Даунгрейда
 
Сообщения: 278
Зарегистрирован: 25 дек 2023, 11:25
Откуда: Казань
Железо: Intel Pentium MMX 166 MHz, 8 и 2 ГБ HDD, 80 MB RAM; AMD A8-6410 APU with Radeon R5 Graphics, 16 ГБ

Пред.

Вернуться в Программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

cron