Не записывать lpszName при CreateWindowEx
От: Vladimir Россия  
Дата: 22.11.18 15:36
Оценка:
При использовании функции CreateWindowEx(0, lpszClass, lpszName, ...) lpszName сохраняется, как я понимаю, в каких-то внутренних структурах WINAPI.
В моем WinControl хранение текста окна я выполняю сам. Как сделать так чтобы при создании окна lpszName не сохранялся.
(Чтобы не было дублирования lpszName)
Re: Не записывать lpszName при CreateWindowEx
От: Evgeniy Skvortsov Россия  
Дата: 22.11.18 17:49
Оценка:
Здравствуйте, Vladimir, Вы писали:

V>При использовании функции CreateWindowEx(0, lpszClass, lpszName, ...) lpszName сохраняется, как я понимаю, в каких-то внутренних структурах WINAPI.

V>В моем WinControl хранение текста окна я выполняю сам. Как сделать так чтобы при создании окна lpszName не сохранялся.
V>(Чтобы не было дублирования lpszName)

Скорее всего никак. Как винда будет отрисовывать заголовок окна, если она не хранит нигде эту строку.

А зачем его хранить у себя? Чем GetWindowText не устраивает?

Очень странная задача, напиши чего ты хочешь в итоге добиться.
Отредактировано 22.11.2018 18:15 Evgeniy Skvortsov . Предыдущая версия .
Re[2]: Не записывать lpszName при CreateWindowEx
От: Vladimir Россия  
Дата: 22.11.18 18:13
Оценка:
Здравствуйте, Evgeniy Skvortsov, Вы писали:

ES>Скорее всего никак.

ES>А зачем его хранить у себя? Чем GetWindowText не устраивает?
Создаю свой специфический edit_control.
Текст храню в удобном мне виде. (Быстрый поиск, позиционирование,...)
Создаю conrol через CreateWindow. Выходит я храню текст два раза, внутри виндов и у себя.
Вот я и хочу избавиться от двойного хранения.
Re[3]: Не записывать lpszName при CreateWindowEx
От: Evgeniy Skvortsov Россия  
Дата: 22.11.18 18:20
Оценка:
Здравствуйте, Vladimir, Вы писали:

V>Создаю conrol через CreateWindow. Выходит я храню текст два раза, внутри виндов и у себя.

V>Вот я и хочу избавиться от двойного хранения.

Так не задавай вообще текст окна, передавай NULL, или короткое имя. Ты же его содержимое руками отрисовываешь в своем окне.

Я вообще не вижу связи между именем окна и тем, что на нем нарисовано. А в случае картинки, ты думаешь вся картинка где-то в потрохах хранится?

Имя окна и его визуальное отображение совпадает для стандартных контролов, типа основное окно — там имя окна — его заголовок, ну и всякие кнопки, статики и т.д.

А для твоего контрола это не имеет никакого смысла. Передавай туда любое имя, или пустую строку, а содержимое рисуй сам как хочешь и данные храни как тебе угодно.
Отредактировано 22.11.2018 18:26 Evgeniy Skvortsov . Предыдущая версия .
Re[2]: Не записывать lpszName при CreateWindowEx
От: Vladimir Россия  
Дата: 22.11.18 18:30
Оценка: -1
Здравствуйте, Evgeniy Skvortsov, Вы писали:

ES>Здравствуйте, Vladimir, Вы писали:


V>>При использовании функции CreateWindowEx(0, lpszClass, lpszName, ...) lpszName сохраняется, как я понимаю, в каких-то внутренних структурах WINAPI.

V>>В моем WinControl хранение текста окна я выполняю сам. Как сделать так чтобы при создании окна lpszName не сохранялся.
V>>(Чтобы не было дублирования lpszName)

ES>Скорее всего никак. Как винда будет отрисовывать заголовок окна, если она не хранит нигде эту строку.


ES>А зачем его хранить у себя? Чем GetWindowText не устраивает?


ES>Очень странная задача, напиши чего ты хочешь в итоге добиться.

Ничего другого не придумал, как принудительно очищать внутрений буфер в WM_CREATE.
switch (message) {
    case WM_CREATE:
    if (((CREATESTRUCT*)lParam)->lpszName != NULL) 
            SetWindowText(hWnd, NULL);
    break;
    ...
}
Re[3]: Не записывать lpszName при CreateWindowEx
От: Evgeniy Skvortsov Россия  
Дата: 22.11.18 18:34
Оценка: +1
Здравствуйте, Vladimir, Вы писали:

V>Ничего другого не придумал, как принудительно очищать внутрений буфер в WM_CREATE.


Зачем? да просто ничего туда не передавай при вызове CreateWindow
Re[4]: Не записывать lpszName при CreateWindowEx
От: Vladimir Россия  
Дата: 22.11.18 19:23
Оценка:
Здравствуйте, Evgeniy Skvortsov, Вы писали:

ES>Здравствуйте, Vladimir, Вы писали:


V>>Создаю conrol через CreateWindow. Выходит я храню текст два раза, внутри виндов и у себя.

V>>Вот я и хочу избавиться от двойного хранения.

ES>Так не задавай вообще текст окна, передавай NULL, или короткое имя. Ты же его содержимое руками отрисовываешь в своем окне.


ES>Я вообще не вижу связи между именем окна и тем, что на нем нарисовано. А в случае картинки, ты думаешь вся картинка где-то в потрохах хранится?


ES>Имя окна и его визуальное отображение совпадает для стандартных контролов, типа основное окно — там имя окна — его заголовок, ну и всякие кнопки, статики и т.д.


ES>А для твоего контрола это не имеет никакого смысла. Передавай туда любое имя, или пустую строку, а содержимое рисуй сам как хочешь и данные храни как тебе угодно.

Может Вы и правы! Тогда, для работы с моим контролом нужно создать следующую конструкцию:
CreateWindow("MY_EDIT", NULL, ...);
SetWindowText(edit, myText);    // это лишнее !!!
...
редактирую текст
...
GetWindowText(edit, myText);

В пояснительной записке надо будет указывать "передавайте NULL в CreateWindow, чтобы зря не расходовать память"
Объемы текста предполагаются очень большие.
А если засунуть в CreateWindow myText, то сколько бы не нужных вопросов отпало!
P.S. Может хрен с этим десятком мегабайт памяти, от 4-8 гектаров не убудет!
Re[5]: Не записывать lpszName при CreateWindowEx
От: Evgeniy Skvortsov Россия  
Дата: 22.11.18 20:08
Оценка:
Здравствуйте, Vladimir, Вы писали:

V>А если засунуть в CreateWindow myText, то сколько бы не нужных вопросов отпало!


Пойми такую вещь, что при вызове SetWindowText, отправляется сообщение окну WM_SETTEXT
Это всего лишь обработка сообщений.
А в случае с окном другого процесса, SetWindowText не сработает. Нужно непосредственно слать сообщение через SendMessage(hWnd, WM_SETTEXT ...
Только в случае с другим процессом, винда делает межпроцессный маршалинг (то есть копирует текст в адресное пространство другого процесса). Потому что просто так, один процесс не может получить доступ к памяти другого процесса. Для этого нужно сделать кучу телодвижений типа OpenProcess, WriteProcessMemory и т.д. с настройкой привелегий и кучей другого гемора.
Детали реализации должны быть скрыты за внешним интерфейсом. В случае с контролами наружу торчат только сообщения. Обрати внимание на любой более мене сложный виндовый контрол, у него есть куча своих сообщений, понятных только ему.
Не пытайся повторить убогость стандартного WC_EDIT. Ты же не знаешь как он хранит текст внутри себя. Да и не нужно это никому.
Опиши в документации что для добавления строк, кусков текста и прочее.. используются свои собственные сообщения.

Вопросы не отпадут. Никто в здравом уме не будет использовать некий сторонний контрол таким же образом, как и EDIT.

V>P.S. Может хрен с этим десятком мегабайт памяти, от 4-8 гектаров не убудет!

Дело не в памяти, а в том, что это просто бесполезное действие.
Я не понимаю как ты хранишь текст в своем формате, если у тебя все завязано на WM_SETTEXT и WM_GETTEXT. Ты эти сообщения обрабатываешь и преобразуешь из своего внутреннего формата в простыню текста? или как?

Ок, опиши как в твоем контроле осуществляется установка текста и его считывание.

Мне кажется ты стучишься в открытые ворота.
Re[6]: Не записывать lpszName при CreateWindowEx
От: Evgeniy Skvortsov Россия  
Дата: 22.11.18 20:15
Оценка: +2
Здравствуйте, Evgeniy Skvortsov, Вы писали:

ES>Здравствуйте, Vladimir, Вы писали:


V>>А если засунуть в CreateWindow myText, то сколько бы не нужных вопросов отпало!


Блин, да в CreateWindow не суют данные в окно. Это процедура создания.
Установка содержимого — это другая операция, как минимум SetWindowText

Не уподобляйся стандартным контролам, такая техника работает только для примитивного текста, вроде надписи на кнопке.
Посмотри как создает окно RichEdit. думаешь там содержимое окна передается через параметр в CreateWindow?
Да у него там куча интерфейсов есть для работы с текстом.

Я понимаю что ты тупишь, но не могу нормально объяснить что так делать не надо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.