В общем, меня тоже стал угнетать вид 300-килобайтового екзешника, состоящего из голой формы, поэтому решил и я попробовать себя в более низкоуровневом программировании.
После ковыряний в гугле и долгих блужданий по таинственным и запутаннным лабиринтам VCL я таки родил то, что прикладываю к проекту.
Итак, вопросы.
1. Иногда при запуске выдаёт ошибку 201. Конкретно - в процедуре WinAPI.CreateEdit на строчке, меняющей шрифт.
2. Если в системе поставить галочку "отображать содержимое окна при перетаскивании", то редактор очень мерцает при изменениях размера. Отлов сообщения wm_EraseBkgnd помог не полностью - если в поле ввода ввести много текста, то видно, как текст мигает. Заметил, что в Микрософте при написании Блокнота и Пейнта об этом не парились, а вот с ВордПадом - парились.
3. Как сделать полю ввода стандартную рамочку. Впрочем, та, что вышла, мне нравится гораздо больше.
4. Забавный нюанс - если поле ввода с двумя полосами прокрутки подогнать под размер окна, то в правом нижнем углу сам собой появится треугольничек для изменения размера.
5. ShortCut для главного меню. Если подчёркивания через & ловит система, то F2 итд - нет (как я понял из VCL, обрабтка этих кнопок делает сама программа). Однако, непонятно, какое сообщение ловить. Если перевести фокус на поле ввода и нажать F2, то программа не получает вообще никакого сообщения (как видно по содержимому консоли, введённой тут только для изучения сообщений). Также непонятно, что ловить, чтобы узнать, что "файл *** изменён" (чтобы задавать глупые вопросы пользователю).
6. Диалоги открытия/сохранения (чем они вообще отличаются?). У меня с ними вроде всё хорошо, но галочка "только чтение" мне не нравится, лишняя она там. И я пока ничего не проверял по поводу того, сохраняется ли корневой каталог при их использовании.
Прикрепленные файлы
NotepadAPI.rar ( 5.04 килобайт )
Кол-во скачиваний: 233
if Font <> 0 thenЕсли же Font равен 0, надо смотреть, почему. Используем GetLastError...
SendMessage(Handle, wm_SetFont, Font, 0);
with OpenFN do begin
Flags := OFN_HIDEREADONLY; // <--- Вот здесь
lStructSize := SizeOf(OpenFN);
1. Вставил в код уничтожение всех созданных окон, программа теперь запускается нормально. Винда разве автоматом не удаляет их при закрытии приложения?
3. У меня через ws_Border получилась только просто линия вокруг. Но смотрится лучше набившей оскомину псевдотрёхмерности.
5. Чтобы всё по-честному. Для общего развития. Я так понял, горячие клавиши только через расстановку ловушек на клавиатуру?
en_Change вроде помог, спасибо.
6. Я думал, флаги только для ДОБАВЛЕНИЯ фич, то есть по умолчанию всё пусто.
Разница у диалогов в кнопочке, у одного "сохранить", у другого "открыть". И как открыть файл, не трогая главный каталог? Модифицировать диалог сохранения через флаги?
Предыдущий пост - мой.
function fEditorWndProc(Handle: HWND; Message: word; WParam, LParam: longint): longint; stdcall;
function fEditorWndProc(Handle: HWND; Message: UINT;
myWParam: WPARAM; myLParam: LPARAM): INT_PTR; stdcall;
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
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;
> ? Это неправильно описанная функция окна. Если уж по-честному - то описывай ее как положено, привыкай сразу, чтоб потом не переучиваться:
INT_PTR выдаёт ошибку. Остальное поправил, спасибо.
> RegisterHotKey - это один способ
Ага, оно.
> Если же ты ушел от VCL, чтобы изобрести "свою" VCL
Ну нужно же мне хоть какое-то упрощение, да и не собираюсь я полностью абстрагироваться от WinAPI, даже у Борланда всё равно не вышло. У меня на размер оно не повлияло. Я не знаю, что делает с моим кодом D2009. У меня, после компиляции семёркой, екзешник занимает 25 Кб (пустой екзе - 13 Кб). И это логично, потому что все модули очень маленькие и почти каждый участок кода из библиотек используется. Может быть, D2009 на каждое упоминание модуля в uses создаёт свою копию модуля?
Остались вопросы:
1. Что делать с диалогом открытия?
2. Какие ресурсы надо освобождать, а какие - нет? Особенно интересует DC. Когда нужен ReleaseDC и DeleteDC?