Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / API EditBox не показывает текст если его высота достаточно мала / 21 сообщений из 21, страница 1 из 1
01.04.2011, 15:13
    #37194483
wisekat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
API EditBox не показывает текст если его высота достаточно мала
В проекте создаётся свой собственный 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
01.04.2011, 15:21
    #37194506
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
API EditBox не показывает текст если его высота достаточно мала
wisekatНе спрашивайте почему API - долго рассказывать, просто так надо в проекте и надо заставить эту конструкцию работать.А все-таки? Иногда проще изменить условия задачи, чем из болота тащить бегемота.

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

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

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

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

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

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


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

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

Advanced Visual Basic 6
Power Techniques for Everyday Programs


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

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

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

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

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

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

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

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

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

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

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


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