Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Не выделяется текст в контроле EDITTEXT


Автор: Riddik 5.6.2013, 14:00
Нужно при щелчке по EDITTEXT выделить весь текст в нём.

В обработке WM_COMMAND ждёт фокуса по контролу:

Код

case ID_EDIT: if(codeNotify == EN_SETFOCUS) SendDlgItemMessageW(hwnd, ID_EDIT, EM_SETSEL, 0, -1); break;


Но эффекта нет - текст не выделяется. Где ошибка?

Автор: feodorv 5.6.2013, 18:12
Несколько вопросов. 
До SendDlgItemMessageW дело вообще доходит (не пробовали MessageBox туда засунуть)?
У Вас уникодовый контрол? Вы создавали диалог через CreateDialogW?

Автор: Earnest 6.6.2013, 07:31
Попробуй заменить на Post
И да, проверь, что условие выполняется, поскольку непонятно, откуда ты берешь codeNotify

Автор: Riddik 6.6.2013, 10:11
Цитата(feodorv @  5.6.2013,  18:12 Найти цитируемый пост)
До SendDlgItemMessageW 


Цитата(Earnest @  6.6.2013,  07:31 Найти цитируемый пост)
И да, проверь, что условие выполняется


Естественно проверил до того как открыть тему) Доходит, условие выполняется.


Цитата(feodorv @  5.6.2013,  18:12 Найти цитируемый пост)
У Вас уникодовый контрол? Вы создавали диалог через CreateDialogW? 

Контрол:

#define ID_TAT_SIZE_WIDTH            129
...

EDITTEXT        ID_TAT_SIZE_WIDTH, 38, 14, 25, 12, ES_CENTER | ES_NUMBER

В приложении везде юникод.

Создал через CreateDialogParamW.


Цитата(Earnest @  6.6.2013,  07:31 Найти цитируемый пост)
Попробуй заменить на Post


Можно подробнее что именно заменить?

Автор: feodorv 6.6.2013, 11:36
Цитата(Riddik @  6.6.2013,  11:11 Найти цитируемый пост)
Можно подробнее что именно заменить?

Заменить SendDlgItemMessageW на PostMessageW( GetDlgItem( hwnd, ID_TAT_SIZE_WIDTH), ...).

PS Что есть ID_EDIT???

Автор: Riddik 6.6.2013, 15:50
Цитата(feodorv @  6.6.2013,  11:36 Найти цитируемый пост)
Заменить SendDlgItemMessageW на PostMessageW( GetDlgItem( hwnd, ID_TAT_SIZE_WIDTH), ...).

Спасибо, теперь работает)

Цитата(feodorv @  6.6.2013,  11:36 Найти цитируемый пост)
PS Что есть ID_EDIT??? 

id контрола, сперва изменил для форума.

Автор: Dem_max 7.6.2013, 04:31
Не надо везде писать так SendDlgItemMessageW !!!
нужно везде писать так SendDlgItemMessage как и все остальные WinAPI функции !!!

И еще не нужно писать так !!!

Код

char *stroka = "Это строка";
SetWindowText(hwnd, (LPWSTR)stroka);


и тому подобную галиматью

Я думаю часть ошибок отпадет или компилятор сругнется показывая на ошибки.

Автор: Riddik 13.6.2013, 16:46
Цитата(Dem_max @  7.6.2013,  04:31 Найти цитируемый пост)
Не надо везде писать так SendDlgItemMessageW !!!
нужно везде писать так SendDlgItemMessage как и все остальные WinAPI функции !!!


Почему? Если приложение unicode, всё равно все ф-ии заменяться на W?


Цитата(Dem_max @  7.6.2013,  04:31 Найти цитируемый пост)
И еще не нужно писать так !!!

код C++
1:
2:
char *stroka = "Это строка";
SetWindowText(hwnd, (LPWSTR)stroka);


и тому подобную галиматью


А как нужно, поясни, плийз?

Автор: volatile 13.6.2013, 17:39
Цитата(Riddik @  13.6.2013,  16:46 Найти цитируемый пост)
А как нужно

Цитата(Riddik @  13.6.2013,  16:46 Найти цитируемый пост)
wchar_t *stroka = L"Это строка";
SetWindowText(hwnd, (LPWSTR)stroka);

Иначе ошибка.
Вообще чем меньше приведений тем лучче.


Автор: GremlinProg 13.6.2013, 21:36
Цитата(volatile @ 13.6.2013,  19:39)
Цитата(Riddik @  13.6.2013,  16:46 Найти цитируемый пост)
А как нужно

Цитата(Riddik @  13.6.2013,  16:46 Найти цитируемый пост)
wchar_t *stroka = L"Это строка";
SetWindowText(hwnd, (LPWSTR)stroka);

Иначе ошибка.
Вообще чем меньше приведений тем лучче.

А вот так как раз и не нужно!

Правильных-то по сути только 3 варианта:
1. 
Код

wchar_t *stroka = L"Это строка";
SetWindowTextW(hwnd, stroka);


2. 
Код

char *stroka = "Это строка";
SetWindowTextA(hwnd, stroka);


3. 
Код

TCHAR *stroka = TEXT( "Это строка" );
SetWindowText(hwnd, stroka);

Автор: volatile 13.6.2013, 23:24
Цитата(GremlinProg @  13.6.2013,  21:36 Найти цитируемый пост)
А вот так как раз и не нужно!
Правильных-то по сути только 3 варианта: 

Если уж ставить все точки над i, среди трёх ваших вариантов нет ни одного правильного.  smile 

Цитата(GremlinProg @  13.6.2013,  21:36 Найти цитируемый пост)
char *stroka = "Это строка";

Грубейшее нарушение стандарта.
Многие компиляторы вообще не обязаны это компилить.


Автор: GremlinProg 14.6.2013, 07:25
Цитата(volatile @  14.6.2013,  01:24 Найти цитируемый пост)
Грубейшее нарушение стандарта.Многие компиляторы вообще не обязаны это компилить.

по всей видимости, это нарушение персонального стандарта volatile ))

Автор: Dem_max 14.6.2013, 17:14
Цитата

Грубейшее нарушение стандарта.

какого стандарта ???

Автор: volatile 15.6.2013, 03:40
Цитата(GremlinProg @  14.6.2013,  07:25 Найти цитируемый пост)
по всей видимости, это нарушение персонального стандарта volatile )) 

Неявное приведение к неконстантному указателю константной строки.
Запись по таким указателям, кстати только студия позволяет. (причем позволяет - не значит что это нормально так делать, даже в студии)
gcc же  вообще вывалицца с сегфолтом. (и правильно сделает!)

А кто помешает записать по неконстантному указателю?
Сие есть источник самых мерзопакостных багов. (те которые компиляцца без единой ошибки, а потом когда-то начинают вытворять черт знает что).

<удалено>
Вчера немного был не в духе. грубовато написал, прошу прощения.

В общем, константную строку всегда нужно присваивать константному указателю
Код

const char *stroka = "Это строка";

А если нужен не константный указатель, то
Код

char stroka [] = "Это строка";
// ну или динамическое выделение...


Автор: xvr 16.6.2013, 12:21
Цитата(volatile @  15.6.2013,  03:40 Найти цитируемый пост)
Запись по таким указателям, кстати только студия позволяет. 

А кто тут по ним пишет?

Цитата(volatile @  15.6.2013,  03:40 Найти цитируемый пост)
В общем, константную строку всегда нужно присваивать константному указателю

В принципе да, но стандарт С++ в части присваивания именно строковых литералов в именно char* указатель сделал некоторое послабление. Для любых других указателей запись const версии в не-const указатель является ошибкой времени компиляции. Если бы то же самое сделали и для строк, то перестало компилится бы процентов 90 старого кода  smile 

gcc кстати на такие присваивания дает варнинг  smile 

PS. В данном случае речь шла о правильном написании программы для UNICODEа и не UNICODEа, а не о константности указателей. Замечание на отсутствие const выглядит придиркой. Давайте тогда уж критиковать и имя переменной - должна быть не stroka, а string.  smile 

Автор: volatile 16.6.2013, 23:26
Цитата(xvr @  16.6.2013,  12:21 Найти цитируемый пост)
на отсутствие const выглядит придиркой. 

xvr, если честно - согласен  smile 
Но только в ответ на такую-же придирку:

Цитата(GremlinProg @ 13.6.2013,  21:36)
Цитата(volatile @ 13.6.2013,  19:39)
Цитата(Riddik @  13.6.2013,  16:46 Найти цитируемый пост)
А как нужно

Цитата(Riddik @  13.6.2013,  16:46 Найти цитируемый пост)
wchar_t *stroka = L"Это строка";
SetWindowText(hwnd, (LPWSTR)stroka);

Иначе ошибка.
Вообще чем меньше приведений тем лучче.

А вот так как раз и не нужно!


Не вижу причин здесь писать А вот так как раз и не нужно!, из-за того что там не введена буква W в конце функции.
Если пишецца юникодное приложение, которое никогда не будет компилицца в неюникодном, писать после каждой функции букву W - мазохизм.

если бы хоть к wchar_t придрался, я бы и то понял smile (переносимее WCHAR)

Добавлено @ 23:29
А вот на неконстантный указатель - можно с полной уверенностью сказать:
А вот так как раз и не нужно! (причем уже без каких=либо придирок.)

Автор: xvr 17.6.2013, 12:19
Цитата(volatile @  16.6.2013,  23:26 Найти цитируемый пост)
Не вижу причин здесь писать А вот так как раз и не нужно!, из-за того что там не введена буква W в конце функции.

Причина есть, и весьма веская. Уж если используется явно UNICODE версия строк (wchar_t и L""), то следует так же явно использовать UNICODE версию API, т.е. дописать W к именам функций. 

Цитата(volatile @  16.6.2013,  23:26 Найти цитируемый пост)
Если пишецца юникодное приложение, которое никогда не будет компилицца в неюникодном,

Проблема в том, что на сорцы этого приложения будут смотреть не только вы. Собственно из за того, что из таких сорцов кто то надергает строчек и попытается вставить в свой проект, и появляются перлы типа SetWindowText(hwnd, (LPWSTR)stroka);, а потом вопли на всех форумах - "Взял код из работающего проекта, а он не работает! Ну кто так пишет !!!!"  smile 

Так что писать 
Код

wchar_t *stroka = L"Это строка";
SetWindowText(hwnd, stroka);
можно только в 2х случаях -
  •  Этот код не только не будет компилироваться в чем то отличном от UNICODE'а, но и его еще никогда никто (отличный от автора) не увидит
  •  В начале файла (а лучше в начале всех файлов в этом проекте) будет явно написанно в комментариях почему используется wchar_t и не используется SetWindowTextW

Автор: volatile 17.6.2013, 15:08
Цитата(xvr @  17.6.2013,  12:19 Найти цитируемый пост)
можно только в 2х случаях -
 Этот код не только не будет компилироваться в чем то отличном от UNICODE'а, но и его еще никогда никто (отличный от автора) не увидит
 В начале файла (а лучше в начале всех файлов в этом проекте) будет явно написанно в комментариях почему используется wchar_t и не используется SetWindowTextW

xvr, спорное утверждение.
Сорцы идут вместе с проектом, где есть свойство (UNICODE) или этого свойства нет.
Вы предлагаете полностью игнорировать эту фичу IDE/компилятора.
От нее уже ничего не зависит =) т.е. фактически берете на себя ненужную/лишнюю работу, которую мог бы выполнить компилятор.

Цитата(xvr @  17.6.2013,  12:19 Найти цитируемый пост)
из за того, что из таких сорцов кто то надергает строчек и попытается вставить в свой проект

Ну здесь пожалуй соглашусь, но ориентировацца на это врядли стоит.  smile 
да и потом, даже если так. Ничего страшного не произойдет. smile 
Код просто не будет компилировацца, с точным и недвусмысленным указанием ошибок.
Что вполне таки нормально. (В отличии от багов компилируемых без единой ошибки, о которых я писал выше smile)

Автор: xvr 17.6.2013, 20:19
Цитата(volatile @  17.6.2013,  15:08 Найти цитируемый пост)
Сорцы идут вместе с проектом, где есть свойство (UNICODE) или этого свойства нет.

Те, кто знает об этом свойстве в пропертях проекта, обычно не испытывает никаких проблем с UNICODE/ANSI проектами. 

Цитата(volatile @  17.6.2013,  15:08 Найти цитируемый пост)
Код просто не будет компилировацца, с точным и недвусмысленным указанием ошибок.

Увы, ошибки он указывает точно, но вот первопричину их очень часто ищут не там. Иначе не было бы такого количества соответствующих воплей в разделе для начинающих  smile 

Цитата(volatile @  17.6.2013,  15:08 Найти цитируемый пост)
Вы предлагаете полностью игнорировать эту фичу IDE/компилятора.

Отнюдь. К сожалению нет никакого контроля на уровне сорцов включена эта 'фича' или нет (ругань компилятора при неправильной установки фичи не является таким контролем, так как он ругается на совершенно другое, и что бы соотнести это 'другое' с настройкой в проекте, требуются некоторые познания)

Автор: volatile 18.6.2013, 06:19
xvr, если не ошибаюсь, вы как-то говорили что у вас есть неюникодные проекты
Если есть с WinApi, ответьте честно:
Вы в них всегда пишете исключительно SetWindowTextA () ?

Автор: xvr 18.6.2013, 08:23
Цитата(volatile @  18.6.2013,  06:19 Найти цитируемый пост)
Если есть с WinApi, ответьте честно:

Честно - не пишу. Но другим советовать это я бы не стал  smile 

Автор: volatile 18.6.2013, 19:59
Цитата(xvr @  18.6.2013,  08:23 Найти цитируемый пост)
Честно - не пишу.

я и не сомневался. мазохистов на свете не так много.

Цитата(xvr @  18.6.2013,  08:23 Найти цитируемый пост)
Но другим советовать это я бы не стал

Да собственно, я тоже не писал какой-то "сверх эталонный образец" для подражания  smile 
Просто, исправил грубые ошибки ТС.

[в сторону] Никогда не знаешь на что тут набросяцца, честное слово.

Добавлено через 54 секунды
да, и GremlinProg, прошу извинить, если обидел. 
Не держите зла. smile 

Автор: GremlinProg 19.6.2013, 08:32

M
GremlinProg
Цитата(volatile @  18.6.2013,  21:59 Найти цитируемый пост)
Никогда не знаешь на что тут набросяцца, честное слово

volatile, честно говоря, мне твоя реакция непонятна. Ты с момента появления на форуме делал эту ошибку, я просто закрывал на нее глаза. А когда я тебе по этому поводу сделал замечание, ты впал в истерику. Несерьезно.
Цитата(volatile @  18.6.2013,  21:59 Найти цитируемый пост)
Не держите зла.

Не держу, но в след. раз при подобной реакции молча отправлю в баню. Просто из соображений сохранности психического равновесия всех участников и экономии их времени (ты, к примеру уже отвлек xvr на 3 дня, поражен его выдержке).



Автор: Earnest 20.6.2013, 05:05
Да ладно тебе, GremlinProg. Ребята так интеллигентно спорили. А что из-за ерунды зацепились, ну так мало ли... Все бы так время убивали.
 smile  smile  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)