IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

> Написание простого редактора без VCL, Только WinAPI
TarasBer
сообщение 19.03.2010 14:41
Сообщение #1


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


В общем, меня тоже стал угнетать вид 300-килобайтового екзешника, состоящего из голой формы, поэтому решил и я попробовать себя в более низкоуровневом программировании.
После ковыряний в гугле и долгих блужданий по таинственным и запутаннным лабиринтам VCL я таки родил то, что прикладываю к проекту.
Итак, вопросы.
1. Иногда при запуске выдаёт ошибку 201. Конкретно - в процедуре WinAPI.CreateEdit на строчке, меняющей шрифт.
2. Если в системе поставить галочку "отображать содержимое окна при перетаскивании", то редактор очень мерцает при изменениях размера. Отлов сообщения wm_EraseBkgnd помог не полностью - если в поле ввода ввести много текста, то видно, как текст мигает. Заметил, что в Микрософте при написании Блокнота и Пейнта об этом не парились, а вот с ВордПадом - парились.
3. Как сделать полю ввода стандартную рамочку. Впрочем, та, что вышла, мне нравится гораздо больше.
4. Забавный нюанс - если поле ввода с двумя полосами прокрутки подогнать под размер окна, то в правом нижнем углу сам собой появится треугольничек для изменения размера.
5. ShortCut для главного меню. Если подчёркивания через & ловит система, то F2 итд - нет (как я понял из VCL, обрабтка этих кнопок делает сама программа). Однако, непонятно, какое сообщение ловить. Если перевести фокус на поле ввода и нажать F2, то программа не получает вообще никакого сообщения (как видно по содержимому консоли, введённой тут только для изучения сообщений). Также непонятно, что ловить, чтобы узнать, что "файл *** изменён" (чтобы задавать глупые вопросы пользователю).
6. Диалоги открытия/сохранения (чем они вообще отличаются?). У меня с ними вроде всё хорошо, но галочка "только чтение" мне не нравится, лишняя она там. И я пока ничего не проверял по поводу того, сохраняется ли корневой каталог при их использовании.


Прикрепленные файлы
Прикрепленный файл  NotepadAPI.rar ( 5.04 килобайт ) Кол-во скачиваний: 143


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 19.03.2010 19:34
Сообщение #2


Гость






Цитата
Чтобы всё по-честному. Для общего развития.
Ага.
Ну, раз по-честному - значит слушай...

1. Начнем с того, что ты некорректно описываешь главную функцию окна. Что это за прототип?
Цитата
function fEditorWndProc(Handle: HWND; Message: word; WParam, LParam: longint): longint; stdcall;

? Это неправильно описанная функция окна. Если уж по-честному - то описывай ее как положено, привыкай сразу, чтоб потом не переучиваться:
function fEditorWndProc(Handle: HWND; Message: UINT;
myWParam: WPARAM; myLParam: LPARAM): INT_PTR; stdcall;


2.
Цитата
Я так понял, горячие клавиши только через расстановку ловушек на клавиатуру?
RegisterHotKey - это один способ, второй я уже описывал: создавать меню так:
MainMenu MENU
BEGIN
POPUP "Файл (&F)"
BEGIN
MENUITEM "Новый (&N)\tCtrl+N", IDM_NEW
MENUITEM "Сохранить (&S)\tF2", IDM_SAVE
MENUITEM "Открыть(&O)\tF3", IDM_OPEN
MENUITEM "Сохранить как... (&A)\tCtrl+A", IDM_SAVEAS
MENUITEM SEPARATOR
MENUITEM "Выйти... (&X)\tAlt+F4", IDM_EXIT
END
END

myAccel ACCELERATORS
BEGIN
VK_F2, IDM_SAVE, VIRTKEY, NOINVERT
VK_F3, IDM_OPEN, VIRTKEY, NOINVERT
VK_F4, IDM_EXIT, VIRTKEY, ALT, NOINVERT

"N", IDM_NEW, VIRTKEY, CONTROL, NOINVERT
"A", IDM_SAVEAS, VIRTKEY, CONTROL, NOINVERT
END
, а потом менюшку добавляем в WNDCLASS перед регистрацией класса окна, а акселераторы - перед основным циклом:

myAccels := LoadAccelerators(hInstance, 'myAccel');
while GetMessage(msg, 0, 0, 0) do
begin
if TranslateAccelerator(hwnd, myAccels, msg) <> 0 then
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
end;


Если ты собрался писать на чистом API - то все, что ты натворил в своем проекте можно уложить в сотню строк. В одну сотню, понимаешь? Причем программа будет хорошо структурированной и понятной с первого взгляда. Если же ты ушел от VCL, чтобы изобрести "свою" VCL - то я подожду, пока ты наиграешься с этим, и потом начнешь задавать вопросы либо о чистом WinAPI, либо о стандартной Дельфийской VCL. В мутантах разбираться у меня нет никакого желания. Твой, практически ничего не делающий, код из первого сообщения компилируется уже в 126К на Дельфи 2009. Код, написанный на чистом WinAPI уложится в 50К. Ну, и от чего ты ушел и куда пришел? Будешь добавлять "фичи" - размер твоего EXE-шника будет расти как на дрожжах, и станет больше VCL-ного как пить дать. Хочешь продолжать с созданием своих неизвестно зачем понадобившихся классов - продолжай заниматься непонятно чем. Только предупреди, чтоб я мог знать, стоит ли сюда заходить или проходить мимо...
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 14.07.2025 13:30
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"