powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / API EditBox не показывает текст если его высота достаточно мала
21 сообщений из 21, страница 1 из 1
API EditBox не показывает текст если его высота достаточно мала
    #37194483
wisekat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В проекте создаётся свой собственный textbox функциями API. Проблема в том, что если его высота не позволяет показать весь текст (т.е. текст должен "обрубаться" снизу), то этот текст вообще не показывается и с этим текстбоксом что-то вообще неладное начинает твориться - например, по TAB он больше вообще фокус не может получить. Не спрашивайте почему API - долго рассказывать, просто так надо в проекте и надо заставить эту конструкцию работать.

Стандартный TextBox контрол из VB6 в данном сценарии работает "на ура". Ниже даю код чтобы увидеть траблу вживую. Положите на форму стандартный TextBox с именем "Text1" и запустите форму. В верхний textbox не получится ничего ввести, хотя в нижний (перепозиционированный стандартный из VB) можно вводить текст, хоть его нижний край и будет обрезан.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
Option Explicit

Dim m_hwndEdit As Long

Private Declare Function CreateWindowExW Lib "user32" _
   (ByVal dwExStyle As Long, _
   ByVal lpClassName As Long, _
   ByVal lpWindowName As Long, _
   ByVal dwStyle As Long, _
   ByVal x As Long, _
   ByVal y As Long, _
   ByVal nWidth As Long, _
   ByVal nHeight As Long, _
   ByVal hWndParent As Long, _
   ByVal hMenu As Long, _
   ByVal hInstance As Long, _
   lpParam As Any) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function SetFocusAPI Lib "user32" Alias "SetFocus" (ByVal hWnd As Long) As Long
Private Declare Function DestroyWindow Lib "user32" (ByVal hWnd As Long) As Long

' ShowWindow styles:
Private Const SW_SHOW =  5 
' General window styles:
Private Const WS_CHILD As Long = &H40000000
Private Const WS_BORDER  As Long = &H800000
' Textbox API constants:
Private Const ES_AUTOHSCROLL = &H80&
Private Const ES_AUTOVSCROLL = &H40&
Private Const ES_MULTILINE = &H4&

Private Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long


Private Sub Form_Load()
   ' Setting the std TextBox control
   Text1.Font.Name = "System"
   Text1.Appearance =  0  ' Flat (thin border)
   SetWindowPos Text1.hWnd,  0 ,  10 ,  30 ,  60 ,  15 ,  0 
   
   ' Define editor style
   Dim dwStyle As Long
   dwStyle = WS_CHILD Or WS_BORDER Or ES_AUTOHSCROLL Or ES_AUTOVSCROLL Or ES_MULTILINE
   
   ' Create editor
   m_hwndEdit = CreateWindowExW( 0 , StrPtr("Edit"),  0 , dwStyle,  10 ,  10 ,  60 ,  15 , Me.hWnd,  0 &, App.hInstance, ByVal  0 &)
   
   ' Activate editor
   ShowWindow m_hwndEdit, SW_SHOW
   SetFocusAPI m_hwndEdit
End Sub

Private Sub Form_Unload(Cancel As Integer)
   DestroyWindow m_hwndEdit
End Sub

Я уже и MS Spy++ использовал чтобы посмотреть какие флаги (стили) в текстбоксе от VB используются, и то же самое у себя делал - толку ноль. Даже не знаю в чём ещё может быть проблема...
...
Рейтинг: 0 / 0
API EditBox не показывает текст если его высота достаточно мала
    #37194506
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wisekatНе спрашивайте почему API - долго рассказывать, просто так надо в проекте и надо заставить эту конструкцию работать.А все-таки? Иногда проще изменить условия задачи, чем из болота тащить бегемота.

А по сути здесь вам никто не поможет. Вам нужно на форум по c++ — это их кухня.
...
Рейтинг: 0 / 0
API EditBox не показывает текст если его высота достаточно мала
    #37194517
wisekat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну нельзя условия задачи менять :)

Ладно, пойду и Сишников/АПИшников поспрашиваю :-)
...
Рейтинг: 0 / 0
API EditBox не показывает текст если его высота достаточно мала
    #37195078
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wisekat, как не странно, но текст показывается = ) Правда, цвет шрифта и цвет выделения у него цвета фона текстового поля (или оно же цвет формы). Проверить можно если сделать "выделение" и скопировать и вставить текст. Даже можно редактировать.
...
Рейтинг: 0 / 0
API EditBox не показывает текст если его высота достаточно мала
    #37198404
wisekat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VSVLAD , система какая у Вас? У меня в 7-ке получается как на приаттаченном скриншоте.

Сначала в API Edit мигает курсор как-то странно почти по центру, при попытке что-то набрать курсор вообще пропадает.

Ещё одна странность: если запустить такой проект, потом переключиться на другое окно, а потом обратно, то курсор автоматом перемещается в стандартный TextBox и больше его уже никак нельзя вернуть в наш АПИ-шный.
...
Рейтинг: 0 / 0
API EditBox не показывает текст если его высота достаточно мала
    #37198408
wisekat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл нажать кнопку для загрузки файла скриншота:
...
Рейтинг: 0 / 0
API EditBox не показывает текст если его высота достаточно мала
    #37198431
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня тоже самое и на XP.
...
Рейтинг: 0 / 0
API EditBox не показывает текст если его высота достаточно мала
    #37198451
wisekat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Про передачу фокуса тут мне на другом форуме напомнили, что в VB есть нюансы при использовании чистых АПИ контролов в этом случае. Там надо специальные COM-интерфейсы использовать. Ну да это ладно - я контрол создаю единожды только при редактировании нужного мне элемента, так бог с ним с фокусом.

А вот почему у VSVLAD всё работает - вот вопрос...
...
Рейтинг: 0 / 0
API EditBox не показывает текст если его высота достаточно мала
    #37198548
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня текста не видно, но он присутствует. Т.е. цвет шрифта = цвету фона = цвету выделения = цвету курсора. Проверить сие можно если воспользоваться "методом вслепую" и поработать с буфером обменом. Ctrl+C, Ctrl+V - можно "выделить" текст и скопировать, а также вставлять в это поле. Опять же всё в слепую. Т.е. проблема в цвете, а не в том, что фокуса в нём вообще нет
...
Рейтинг: 0 / 0
API EditBox не показывает текст если его высота достаточно мала
    #37199569
wisekat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VSVLADТ.е. проблема в цвете, а не в том, что фокуса в нём вообще нет

Да, поработать вслепую можно - я согласен, но проблема не в цвете. Почему? Да потому, что простое увеличение высоты Edit-а приводит к появлению текста без всяких дополнительных ухищрений с установкой его цвета.
...
Рейтинг: 0 / 0
API EditBox не показывает текст если его высота достаточно мала
    #37199608
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: wisekat
> Да потому, что простое увеличение высоты Edit-а приводит к появлению текста без всяких дополнительных ухищрений с
> установкой его цвета.


А шрифт какой использовали? По моему нужны TrueType Fonts потому что они(или не они?) вроде как векторные и поэтому
маштабируются в любой размер без потери качества. А обычные шрифты - так не умеют.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
API EditBox не показывает текст если его высота достаточно мала
    #37199789
wisekat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин, ну а при чём тут масштабирование шрифтов? Я что, где-то что-то про это сказал? Нужна просто классическая "обрезка" границей контрола видимой части букв - и всё. Чистая классика Windows.
...
Рейтинг: 0 / 0
API EditBox не показывает текст если его высота достаточно мала
    #37199835
wisekat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Час назад догадался как исключить влияние "хитрой" системы управления фокусом в VB6. Вспомнил, что когда-то на Амазоне заказывал замечательную книгу Мэтью Курланда

Advanced Visual Basic 6
Power Techniques for Everyday Programs


(сайт книги - здесь ).

В книге целый раздел был посвящён созданию API-контролов и их полной интеграции со стандартными формами VB. Я нашёл проект под названием MinimalEditWindowLess который как нельзя лучше соответствует тому, что делаю я. Начал играться с проектом. Если в API Edit контроле, который создаёт Мастер Курланд, добавить всего лишь ES_MULTILINE в вызов CreateWindowEx, то всё падает так же как и у меня (конечно, надо сделать высоту контрола на форме достаточно маленькой - пикселов так 13).

В аттаче - проект если кто хочет поиграться.
...
Рейтинг: 0 / 0
API EditBox не показывает текст если его высота достаточно мала
    #37199847
wisekat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для проекта Курланда из пред. поста нужны ещё некоторые библиотеки - они в аттаче. Положите на одном уровне с папкой MinimalEditWindowLess.
...
Рейтинг: 0 / 0
API EditBox не показывает текст если его высота достаточно мала
    #37199857
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
единственное, что не понятно, зачем все эти пляски с бубном? чем не устраивает обычный TextBox?

PS
на счёт truetype шрифта - совет верный, прислушайтесь.
...
Рейтинг: 0 / 0
API EditBox не показывает текст если его высота достаточно мала
    #37199860
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneединственное, что не понятно, зачем все эти пляски с бубном? чем не устраивает обычный TextBox?Мне тоже интересно, но автор партизанит :)
...
Рейтинг: 0 / 0
API EditBox не показывает текст если его высота достаточно мала
    #37199877
wisekat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ой хлопці мені здається шось ми не там шукаємо :)

А может попробовать развернуть проблему со стороны скажем Windows Forms .NET?

У них система очень прозрачная по отношению к API-самодеятельности на форме по сравнению с classic VB6. И у них также всё работает нормально с edit-ом если идти по моему сценарию: кладём на форму multiline textbox, делаем его высотой тех же 13 пикселов, и всё ок - текст обрезается внизу, но верхняя часть видна нормально.

Я уже писал что я пытался через Spy++ выяснить разницу (предполагая что дело в стилях контрола), но так и не нашёл в чём дело. Может я не на то смотрел? Или не так искал?
...
Рейтинг: 0 / 0
API EditBox не показывает текст если его высота достаточно мала
    #37199890
wisekat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да шо тут партизанить - нужен Unicode-текстбокс (VB'шный только ANSI), в котором надо иметь контроль над рядом системных фич, которые через обычный VB не сделаешь. Вобщем, предыдущая генерация проекта и использовала VB'шный, затем от него отказались т.к. понаходили кучу затыков, вот и решили сделав глубокий вдох переписать контрол "с нуля" на чистом API.
...
Рейтинг: 0 / 0
API EditBox не показывает текст если его высота достаточно мала
    #37199909
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поищите тему , я давал ссылку на создание UNICODE-контролов на VB (задача не простая), может MS Forms 2.0 обойдётесь?
...
Рейтинг: 0 / 0
API EditBox не показывает текст если его высота достаточно мала
    #37200004
wisekat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_Oneпоищите тему , я давал ссылку на создание UNICODE-контролов на VB (задача не простая)

Не простая - могу подтвердить :)

Тему через список сообщений в профиле пользователя не нашёл.

Konst_Oneможет MS Forms 2.0 обойдётесь?

Не надонам от MS Office никакой зависимости :)
...
Рейтинг: 0 / 0
API EditBox не показывает текст если его высота достаточно мала
    #37200019
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / API EditBox не показывает текст если его высота достаточно мала
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]