C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Создание окна только ф-циями API, беz описания
Dr.Phoenix
Отправлено: 22.05.2003, 14:54


Дежурный стрелочник

Группа: Участник
Сообщений: 48



Сама по себе форма без всякого кода и компонентов жрет дофига места sad.gif если в опциях компилятора поставить Release, то размер уменьшается незначительно. Вопрос: как создать форму средствами API, чтоб потом не нее можно было компоненты наставить динамически?
Admin
Отправлено: 22.05.2003, 18:03


Владимир

Группа: Администратор
Сообщений: 1190



Нет wink.gif
Здесь надо не смешивать понятие формы и окна.

Форма — объект, обладающий множеством свойств и методов
а окно — лишь кусок экрана

Создать с помощью API можно окно и размещать в окне
некоторые другие окна (кнопки и т.д.), но не
объекты VCL

Отсюда и размер формы
Георгий
Отправлено: 22.05.2003, 18:35


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



место занимают рисунки, которых в ресурсах проги очень много, но что они (рисунки) там делают, причём такие, какие нигде в проге не используются я не знаю.
Проверить это можно любым редактором ресурсов и косвенно это подтверждает высокая степень сжатия exe любым упаковщиком (2-3 раза, что соответствует коэффициенту сжатия рисунков)
Dr.Phoenix
Отправлено: 27.05.2003, 23:47


Дежурный стрелочник

Группа: Участник
Сообщений: 48



1) не знаю скока там рисунков, но если у билдеровской пустой формы поубирать все рисунки ResHack'ом, которые он тока видит, и скомпилить в режиме Release со всеми dll, то весить она будет 437 kb, а если то же самое сделать с формой, скомпиленной на VC++.NET, тока не убирая картинки, т.к. лень было, то она будет весить 157kb.

2) ладно, если форма и окно это не одно и то же, то как создать форму ф-циями API, или еще как-нить, но чтоб она не хавала стока места, ну и чтоб можно было на нее компоненту поставить?
Георгий
Отправлено: 28.05.2003, 09:45


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



Можно создать приложение, основанное на диалоговых окнах:
пример на asm — окно описывается в файле ресурсов:
CODE

#define         DS_CENTER       0x0800L
#define         DS_MODALFRAME   0x080L
#define         DS_3DLOOK       0x080L

#define         WS_MINIMIZEBOX  0x00020000L
#define         WS_SYSMENU      0x00080000L
#define         WS_VISIBLE      0x10000000L
#define         WS_OVERLAPPED   0x00000000L
#define         WS_CAPTION      0xC00000L

#define         IDC_EXIT        2

ZZZ_Dialog DIALOG 10,10,205,30
STYLE DS_CENTER | DS_MODALFRAME | DS_3DLOOK | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED
CAPTION "Cool program"
BEGIN
     PUSHBUTTON        "E&xit",IDC_EXIT,141,8,52,13
END

сама программа:
CODE

       includelib      d:\workpl\watcom\lib386\nt\kernel32.lib;        includelib      d:\workpl\watcom\lib386\nt\shell32.lib
       includelib      d:\workpl\watcom\lib386\nt\user32.lib

       extrn   __imp__GetModuleHandleA@4       :dword
       extrn   __imp__ExitProcess@4            :dword
       extrn   __imp__DialogBoxParamA@20       :dword
       extrn   __imp__EndDialog@8              :dword
GetModuleHandle equ     __imp__GetModuleHandleA@4
ExitProcess     equ     __imp__ExitProcess@4
DialogBoxParam  equ     __imp__DialogBoxParamA@20
EndDialog       equ     __imp__EndDialog@8

WM_INITDIALOG   equ     110h
WM_CLOSE        equ     10h

       .386
       .model  flat
       .data
dialog_name db  "ZZZ_Dialog",0
       .code
_start:
       xor     ebx,ebx
       push    ebx
       call    GetModuleHandle
       push    ebx
       push    offset  dialog_proc
       push    ebx
       push    offset  dialog_name
       push    eax
       call    DialogBoxParam
       push    ebx
       call    ExitProcess
;вызывается окном диалога
dialog_proc     proc    near
       push    ebp
       mov     ebp,esp
dp_hWnd         equ     dword ptr [ebp+08h];идентификатор диалога
dp_uMsg         equ     dword ptr [ebp+0Ch];номер сообщения
dp_wParam       equ     dword ptr [ebp+10h];первый параметр
dp_lParam       equ     dword ptr [ebp+14h];второй параметр
       mov     ecx,dp_hWnd
       mov     eax,dp_uMsg
       cmp     eax,WM_CLOSE
       jne     not_close
       push    0
       push    ecx
       call    EndDialog
       xor     eax,eax
       inc     eax
       leave
       ret     16
not_close:
       xor     eax,eax
       leave
       ret     16

dialog_proc     endp
       end     _start


строки для компиляции
wasm main.asm
wrc /r /bt=nt dial.rc
wlink file *.obj res *.res form windows nt op c

скомпилированная имеет размер 3 584 байт

с учётом того, что большинство VCL компонентов является банальной обьектной обёрткой для элементов Windows GUI, то такой подход позволит создавать простые приложения, которые занимают значительно меньше места на диске и в ОП.

кстати в Windows GUI есть следующие обьекты:
кнопки, окна, диалоговые окна, полосы прокрутки, меню, акселлераторы (горячие кнопки), функции для рисования графических примитивов, строка состояния, спин (аналог CSpinEdit), трекбар (разновидность полосы прокрутки), индикатор (ProgressBar), окна подсказок (Hint), списки изображений (ImageList?), закладки, окно просмотри деревьев

Вроде ничего не забыл...
Admin
Отправлено: 28.05.2003, 15:09


Владимир

Группа: Администратор
Сообщений: 1190



QUOTE (Dr.Phoenix @ 27 May 2003, 23:47)
2) ладно, если форма и окно это не одно и то же, то как создать форму ф-циями API, или еще как-нить, но чтоб она не хавала стока места, ну и чтоб можно было на нее компоненту поставить?

Форма — это объект (компонент) VCL, а окно — это объект Windows

На окно можно "поставить" другое окно (кнопку и т.д.) и описать все
свойства и методы этого другого окна, но не как объект VCL

"Как можно создать форму функциями API" — по-другому этот вопрос
звучит так — "как создать объект VCL ?", а это уже к Borland,
и разработчикам VCL, которые эту библиотеку и создали,

если существует исходный код VCL — надо смотреть там.

Георгий
Отправлено: 28.05.2003, 18:06


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



Вот, что я вспомнил — где то 2-3 года назад мне приятель приносил статью о "кодоэкономичной библиотеки", призванной заменить VCL т.к. в ней якобы реализованы теже компоненты, что и в VCL, но они занимают значительно меньше места и в ОП и на диске. Статья "погибла" во время очередной чистки диска...

Нашёл статью

сайт автора тут

когда попробуете скажите как она

Отредактировано Георгий — 28 May 2003, 21:30
Dr.Phoenix
Отправлено: 29.05.2003, 09:56


Дежурный стрелочник

Группа: Участник
Сообщений: 48



QUOTE (Георгий @ 28 May 2003, 18:06)
Вот, что я вспомнил — где то 2-3 года назад мне приятель приносил статью о "кодоэкономичной библиотеки", призванной заменить VCL т.к. в ней якобы реализованы теже компоненты, что и в VCL, но они занимают значительно меньше места и в ОП и на диске. Статья "погибла" во время очередной чистки диска...

Нашёл статью

сайт автора тут

когда попробуете скажите как она

библиотека, конечно, клевая, если верить тому, что про нее написанно, но она же для делфи! sad.gif Или может ее можно как-нить к билдеру приспособить?
Admin
Отправлено: 29.05.2003, 10:53


Владимир

Группа: Администратор
Сообщений: 1190



Если нужен компактный код — надо переходить на Visual C++

Интресный вопрос — если с библиотекой KOL так все хорошо,
то можно-ли на форме KOL размещать объекты VCL ?
Сомневаюсь. А это значит — или VCL или KOL.

Что касается самой идеи и разработки такой библиотеки -
конечно идея очень хорошая, молодцы что сделали

Только сама идея экономии места уже не актуальна, и с каждым днем...
а через года 2... даже представить трудно самый маленький
размер выпускаемого винчестера или планки оперативной памяти.

А идея понравилась !

Кроме того из FAQ по KOL:
QUOTE

: А будет (есть ли уже) ли KOL под Builder ?

На данный момент такого НЕТ! KOLnMCK — Delphi only and for... кххх... В смысле пока только под Дельфи. Насчет будущего — насколько я знаю создатель (Владимир Кладов — не путать с Создатель smile.gif не собирается портировать KOLnMCK на Builder, Kylix, Lazarus... и т.д. Ему это не надо.


Так что  — УВЫ ! Что-то не очень хочется переходить на Delphi.

http://delphikol.narod.ru/
и как пишет автор: "Если у вас есть вопросы и предложения, пишите мне!!!" (delphikol@narod.ru)

Dr.Phoenix
Отправлено: 29.05.2003, 11:11


Дежурный стрелочник

Группа: Участник
Сообщений: 48



На Visual C++ код, конечно, компактнее, но не настолько. Если в KOL самое маленькое приложение будет весить 14 кб (если верить написанному), то в VC не меньше 150 кб
Георгий
Отправлено: 29.05.2003, 11:38


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



QUOTE (Admin @ 29 May 2003, 10:53)
Если нужен компактный код — надо переходить на Visual C++

Сомневаюсь, что он (код) с использованием MFC будет компактным...
Alexander
Отправлено: 04.06.2003, 12:53


Не зарегистрирован







Господа, вам чего, делать нечего — писать на API VCL-евские формы ?
Умеете динамически создавать — ну и прекрасно.
Кстати, один hint по поводу ресурсов — можно например одну форму сделать как шаблон для всех, а при динамическом создании остальных (как с MDI children) вы уже задает все свойства. В ресурсах будет жить только одна исходная.
А вообще, кого сильно волнует размер кода ?
Вы что, на дискетах программы носите ? smile.gif
Георгий
Отправлено: 04.06.2003, 16:48


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



тут дело принципа — хочу маленький размер и всё!
а обьективной необходимости в этом нет — прогу на BCB уже можно в промышленное оборудование во flash зашивать — 16Mbit не много стоит (по сравнению со стоимостью оборудования и ПО).
Другое дело, что "за державу обидно" — прога ничего не делает (пустое окно) а место жрёт, но и тут есть обратная сторона — когда прога и печатает, картинки красивые показывает, "принимает" решения, общается с операторами а занимает каких-то жалких 2MB и при добавлении новых функций практически не увеличивается в размере — заказчик начинает думать, что его дурят — деньги как бы низачто берут... А если не дай Бог её оптимизируешь и чем-то упакуешь и станет она на 486-80 с 32 RAM бегать быстрее, чем у конкурентов на P4 с 256MB RAM и приэтом и надёжнее и проще в обслуживании и стоит дешевле и сделана была в 2-3 раза быстрее — начинают коситься — типа що цэ за х*уйня? как такое может быть — где подвох — и идут к конкурентам покупать монстрообразное ПО...
Что то — я от темы отклонился...

Вернуться в Вопросы программирования в C++Builder