958 / 570 / 40
Регистрация: 10.09.2021
Сообщений: 2,382
|
|
1 | |
Как создать на VB6 уникодный InputBox? Чтобы при вводе в InputBox можно было получать китайские иероглифы и так далее15.11.2023, 22:50. Показов 4029. Ответов 51
Как создать на VB6 уникодный InputBox? Чтобы при вводе в InputBox можно было получать китайские иероглифы и так далее. Текстовое поле InputBox'а, что самое интересное и так позволяет вводить китайщину, но вот на выходе функции мы получаем уже знаки вопросов...
Добавлено через 54 минуты Хотите чудо? InputBox создаётся с ANSI-окнами, и с ANSI текстовым полем, без стилизации окна манифестом... Со стилизацией манифестом уже создаётся Unicode окна и уникодное текстовое поле ввода... Это очень странно и меня очень шокировало... Добавлено через 15 минут Таким образом, уникодный InputBox будет работать только если стилизовать программу, применить стили красивостей окон. В противном случае пришлось бы уничтожать старый Edit через DestroyWindow и поверх создавать новое текстовое поле через CreateWindowExW... Чтобы работало и без стилей...
0
|
15.11.2023, 22:50 | |
Ответы с готовыми решениями:
51
Можно ли настроить Inputbox, чтобы не блокировалась книга и можно было изменять данные в ячейках? как сделать чтоб при вводе в inputbox вводились толька символы 0.123456789 Обработать событие OnKeyPress при вводе целого числа в Edit так, чтобы можно было вставить только один знак минус Как сделать так, чтобы при вводе в консоле не было перехода на новую строку? Можно ли так сделать так,чтобы предыдущего окно закрывалось при нажатие кнопки далее |
958 / 570 / 40
Регистрация: 10.09.2021
Сообщений: 2,382
|
|||||||||||
15.11.2023, 23:41 [ТС] | 2 | ||||||||||
Ну всё, за пару часов написал этот модуль.
1
|
958 / 570 / 40
Регистрация: 10.09.2021
Сообщений: 2,382
|
|
16.11.2023, 03:06 [ТС] | 3 |
У этого модуля, версии 1.0, оказался один недостаток: при классическом стиле Windows заглючил заголовок диалогового окна... Сначала в фокусе он появляется, без отображения китайщины, с вопросительным знаком... а потом когда фокус окна теряется то почему-то китайский иероглиф всё равно вылазит. Ещё раз подчёркиваю, только в классическом стиле Windows.
1
|
958 / 570 / 40
Регистрация: 10.09.2021
Сообщений: 2,382
|
||||||
16.11.2023, 14:36 [ТС] | 4 | |||||
Но зато я написал сейчас новый модуль, версии 1.1 уже, где этот глюк я исправил и теперь даже в классическом стиле Windows китайщина правильно отображается в заголовке.
2
|
958 / 570 / 40
Регистрация: 10.09.2021
Сообщений: 2,382
|
|
16.11.2023, 14:40 [ТС] | 5 |
Вообще с установкой заголовка окна с уникодом в винде есть глюки конечно, SetWindowTextW не всегда и не везде работает, а только при определённых событиях почему-то. Иногда приходится использовать DefWindowProcW но и это тоже не всгда срабатывает. Иногда бывают глюки что в заголовке знак вопроса, а снизу в панеле задач правильная китайщина написана... Это уже разработчики Майкрософт виноваты в этом...
0
|
958 / 570 / 40
Регистрация: 10.09.2021
Сообщений: 2,382
|
|
17.11.2023, 07:10 [ТС] | 6 |
The Trick натолкнул меня на мысль, сказав, что есть функция TaskDialogIndirect. Я начал гуглить, и увидел, что эта замечательная функция позволяет создавать диалоги какие захочешь с новым стилем Vista +
Добавлено через 11 минут В результате своих поисков я нашёл примеры использования этой функции здесь: https://www.vbforums.com/showthread.php?777021
0
|
958 / 570 / 40
Регистрация: 10.09.2021
Сообщений: 2,382
|
||||||
17.11.2023, 07:17 [ТС] | 7 | |||||
Иностранцы написали очень хорошо, правда у них огромный класс в котором почти 5 тысяч строк кода... А это не совсем удобно. Жаль, на киберфоруме ничего такого нет.
Итак, немного поколдовав и переделав слегка уже готовый пример я быстро получил диалоговое окно InputBox которое очень красивое и хорошее. Прям мечта, а не диалоговое окно))) Вот что у меня вышло:
Минусы: 1. Работает только начиная с висты 2. Без манифеста не работает, не находит даже функцию TaskDialogIndirect в comctl32.dll... Плюсы: 1. Очень красиво и современно 2. Поддерживает юникод
0
|
958 / 570 / 40
Регистрация: 10.09.2021
Сообщений: 2,382
|
|
17.11.2023, 07:40 [ТС] | 8 |
Я вот сейчас начал думать по поводу этих диалоговых окон и понял: если разработчики заверяют что их код работает и в VBA так же, значит есть способ заставить VBA поддерживать стили манифеста каким-то образом.
Добавлено через 4 минуты У них кстати совсем нидавно, 8 октября, вышло обновления, как я понял, чтобы поддерживало ещё и VBA полностью, вот что там у них написано: "Project Update - 08 Oct 2023 Updating this post to Version 1.3 Universal. The features are the same with some bug fixes, but this version universally supports: VB6, VBA6, VBA7 32bit, VBA7 64bit, twinBASIC 32bit, and twinBASIC 64bit.. IMPORTANT: For compatibility, this version no longer uses self-subclassing, and like earlier versions, once again requires mTDHelper.bas in all projects. (mTDSample.bas is still only for the demo form)." А значит поддерживает все версии VBA ихний код. Только интересно как они заставляют VBA поддерживать comctl32.dll версии 6.0 без манифеста, мне лично непонятно... Добавлено через 1 минуту Но сам факт: VBA поддерживает. А как я уже без понятия. Для меня даже непонятно как вызвать API функцию comctl32.dll версии 6.0 без манифеста. Добавлено через 4 минуты Видимо существует какой-то способ "надевать красивости" на окна без манифеста. Точно так же, как если вызвать диалог выбора папки... То там уже окно стилизовано... Значит каким-то чудом, без манифеста, применяются стили и кнопки становятся красивыми, каким-то чудом интерфейс уже идёт версии 6 из comctl32.dll... Я не знаю как, каким образом и при помощи какого механизма это происходит, но наталкивает на мысль, что это возможно каким-то чудесным образом вообще...
0
|
958 / 570 / 40
Регистрация: 10.09.2021
Сообщений: 2,382
|
|
17.11.2023, 15:26 [ТС] | 9 |
Я только сейчас понял, что я устанавливаю уникодное имя АНСИшному окну... Поэтому SetWindowTextW и не работает наверное должным образом... Это хорошо что есть ещё хак через DefWindowProcW чтобы установить уникодное имя ANSIшному окну
0
|
958 / 570 / 40
Регистрация: 10.09.2021
Сообщений: 2,382
|
|
17.11.2023, 16:47 [ТС] | 11 |
Можно конечно, но только для ANSI'шного имени. Для уникодного имени не получится с китайщиной.
Добавлено через 2 минуты testuser2, ты кстати попробовал в VBA, то что я тебя просил?
0
|
17.11.2023, 18:39 | 12 |
HackerVlad, я переделывал твои диалоги, которы v2.0 и они прекрасно работают под vba. Но я не вижу смысла проверять дальше, то что написано на win-api, будет также точно работать под vba, если используются манифесты, то не будет, поскольку vba не поддерживает манифесты. Вообще в принципе я одобряю такие вещи. Вот я допустим, скачал Vba-компилер и сразу вижу в нем огромный недостаток - неудобный файловый диалог. У тебя удосно сделано, то что открываешь диалог и он автоматически проматывается до папки с программой. Я так понимаю там также можно задать папку, на которую будет автоматичеки проматываться дерево?
1
|
958 / 570 / 40
Регистрация: 10.09.2021
Сообщений: 2,382
|
||||||
17.11.2023, 18:50 [ТС] | 13 | |||||
testuser2, я тебя просил нажать кнопку Создать папку и попробовать ввести китайские иероглифы, в версии 2.5 должно работать и без манифеста, так как сам по себе диалог выбора папки стилизует окно, я говорил уже об этом
Добавлено через 7 минут Итак, вернёмся к теме диалогов. Уважаемый The Trick советовал использовать функцию DialogBoxIndirectParam для создания своего InputBox. Я искал в интернете примеры использования функции DialogBoxIndirectParam. Оказалось очень сложно хоть что-то найти по этой функции. Прям очень сложно, в интернете почти ничего нет. И в яндексе искал и в гугле и на vbforums искал - ничего нет. Единственное что смог найти на гитхабе это один единсвенный модуль, для VBA, с использованием этой функции где создаётся диалог прогресс бара. Вот здесь: https://gist.github.com/jbuona... ee489f3441 Немного чуть-чуть переделав код, получилось это так же использовать и для VB6:
1
|
958 / 570 / 40
Регистрация: 10.09.2021
Сообщений: 2,382
|
|
17.11.2023, 21:34 [ТС] | 15 |
testuser2, спасибо большое, это как раз то, что я и хотел услашть)
Добавлено через 37 секунд Всё так и должно быть, как я и думал, в VBA тоже работает значит) Добавлено через 45 секунд И без манифеста даже, как видишь, учитывая что майкрософтовское диалоговое окно выбора папки и так уже стилизует окно. Добавлено через 4 минуты Где там? Конечно можно. Добавлено через 3 минуты testuser2, а что ты используешь в качестве hwnd в VBA? Учитывая, что в VBA вроде как и нет в помине hwnd... Просто пишешь ноль? Например в моей функции вызова диалога выбора папки!? Или GetActiveWindow вызываешь, как в примере выше? Добавлено через 1 минуту Или GetForegroundWindow может...
0
|
18.11.2023, 05:38 | 16 | |||||
В excel vba есть Application.Hwnd или Windows(1).Hwnd, hwnd формы можно получить с помощью GetActiveWindow или GetForegroundWindow или FindWindow.
Добавлено через 8 минут Для определения размеров экрана я сделал процедуру
1
|
958 / 570 / 40
Регистрация: 10.09.2021
Сообщений: 2,382
|
|
18.11.2023, 08:55 [ТС] | 17 |
testuser2, спасибо за новые знания.
То есть там нет даже коллекции Screen. ??? Добавлено через 25 минут testuser2, приходится наверное всегда немного переделывать и слегка переписывать при переносе кодов с vb6 на vba
0
|
18.11.2023, 09:06 | 18 |
HackerVlad, да какие знания, это просто особенности объектной модели. В Экселе одна объектная модель, в Ворде другая, в Автокаде 3я, в Корелдро 4я. Над каждой моделью работала отдельная группа разработчиков, даже взять модель Экселя - там все досконально продумано, и Ворд - гораздо хуже продумано, очень мало событий и т.д. У VB6 своя модель, в которой еть Screen, Timer.. Большинство этих функций легко заменить WinApi, c рисованием на форме конено посложнее. VBA это вообще сфера непрофессиональной и полупрофессиональной разработки, кто туда только не лезет, студенты, разные непонятные люди со тороны (типо меня), также это рзные инженеры, экономисты, медики, сфера бизнеса. В основном это что-то где-то быстренько посчитать в Экселе, подвести статистику или обработать текстовые данные. Был недавно биоинженер на другом форуме, интересные задачки у него были. Есть конечно отдельный раздел по Access там уже движуха ближе к профессиональной разработке приложений, там уже больше потребность во всяких кнопках и украшательствах (как ты показывал)
1
|
958 / 570 / 40
Регистрация: 10.09.2021
Сообщений: 2,382
|
|
18.11.2023, 09:09 [ТС] | 19 |
ну если я по VBA ничего не знаю вообще... поэтому и спрашиваю у тебя иногда...
0
|
958 / 570 / 40
Регистрация: 10.09.2021
Сообщений: 2,382
|
|
18.11.2023, 09:25 [ТС] | 20 |
Итак, вернёмся к тебе InputBox. Оказывается, в msvbvm60.dll есть функция под названием rctInputBox, исходный код функции InputBox в интернете я так и не нашёл, разве что дизассемблированный на ассемблере, там трудно что-то понять вообще. Но зато я понял каким образом создаётся сам этот InputBox. Он создаётся с помощью обычной функции создания диалогового окна на основе шаблона из ресурсов. А это значит, что в ресурсах файла msvbvm60.dll есть описанный InputBox.
С помощью программы Resource Hacker я выковырял из msvbvm60.dll этот самый заветный InputBox! И вот что сказано в ресурсах (ресурс Dialog/4031/1033): Код
4031 DIALOG 55, 22, 238, 74 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "" LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US FONT 9, "MS Shell Dlg" { CONTROL "", 4901, STATIC, SS_LEFT | SS_NOPREFIX | WS_CHILD | WS_VISIBLE | WS_GROUP, 6, 6, 178, 45 CONTROL "", 4900, EDIT, ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 6, 56, 226, 12 CONTROL "OK", 1, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 192, 6, 40, 14 CONTROL "Cancel", 2, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 192, 23, 40, 14 CONTROL "&Help", 4902, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 192, 40, 40, 14 }
1
|
18.11.2023, 09:25 | |
18.11.2023, 09:25 | |
Помогаю со студенческими работами здесь
20
Как создать массив строк, чтобы их можно было как возвращать, так и изменять? Создать класс из процедуры так, чтобы в нём при вызове можно было менять направление отсчёта счётчика цикла Как создать файл DLL так, чтобы его можно было подключить к VBA Excel? Как можно сделать так чтобы при вводе пароля в TextBox1-е появлялись звёздочки? Как правильно зациклить программу чтобы выходить из неё можно было при вводе "exit" Как сделать так чтобы при нажатии на picturebox1 можно было двигать форму по окну Windows? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |