Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить текст из диалога 
:(
    Опции темы
dark_religion
Дата 3.12.2008, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 198
Регистрация: 8.9.2006

Репутация: нет
Всего: -3



Код

DialogBox(hInst, MAKEINTRESOURCE(IDD_NUMBER), NULL, &Server::numberProc);
    char szString[3];
    int nMax;
    nMax = 3;
    //SendMessage( GetDlgItem( hDlg, IDC_EDIT1), WM_GETTEXTLENGTH, 0, 0L)
    GetDlgItemText(hNdl, IDC_EDIT1, (LPWSTR)szString, nMax);



Вот здесь я хочу получить текст из диалога! Как это сделать? 
PM MAIL   Вверх
jonie
Дата 3.12.2008, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



а ты чего сделал в строке 6 ?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
dark_religion
Дата 3.12.2008, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 198
Регистрация: 8.9.2006

Репутация: нет
Всего: -3



Так нельзя у меня тут нету HWND для диалога. Он есть толко в процедуре диалога. А как из нее поднять его значение сюда не использоя глобальную переменную.
Вобщем мне нужен пример CreateDIalog и процедуры для него!

Это сообщение отредактировал(а) dark_religion - 3.12.2008, 11:26
PM MAIL   Вверх
dark_religion
Дата 3.12.2008, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 198
Регистрация: 8.9.2006

Репутация: нет
Всего: -3



Как выйти из этого цыкла?
while ((GetMessage(&msg, mWnd, 0, 0)) != 0) 
    { 
    if (!IsDialogMessage(mWnd, &msg)) 
    { 
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } 
    }

Какое именно нужно сообщение послать?
PM MAIL   Вверх
Lazin
Дата 3.12.2008, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 8
Всего: 154



WM_QUIT

Это сообщение отредактировал(а) Lazin - 3.12.2008, 12:58
PM MAIL Skype GTalk   Вверх
GremlinProg
Дата 3.12.2008, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(dark_religion @  3.12.2008,  14:56 Найти цитируемый пост)
Как выйти из этого цыкла?

легально - в программе вызвать PostQuitMessage(S_OK)
S_OK - все ок, если не все, значит писать сюда код ошибки



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
dark_religion
Дата 3.12.2008, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 198
Регистрация: 8.9.2006

Репутация: нет
Всего: -3



Я понимаю что WM_QUIT как его послать я шлю не останавливается( 

Код

INT_PTR CALLBACK Server::numberProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
                
            SendMessage(hDlg, WM_QUIT, 0, -1L); 
            EndDialog(hDlg, LOWORD(wParam));
            
            return (INT_PTR)TRUE;
        }
        break;

==========================
HWND mWnd;
    mWnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_NUMBER), NULL, &Server::numberProc);
    ShowWindow(mWnd, SW_SHOW); 
    MSG msg;
    while ((GetMessage(&msg, mWnd, 0, 0)) != 0) 
    {
    if (!IsDialogMessage(mWnd, &msg)) 
    { 
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } 
    }


Это сообщение отредактировал(а) dark_religion - 3.12.2008, 13:34
PM MAIL   Вверх
GremlinProg
Дата 3.12.2008, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



EndDialog легальна, только если диалог показывается с помощью одной из функций набора DialogBox, они уже имеют цикл сообщений
WM_QUIT нельзя посылать непосредственно в оконную процедуру, ты получается иребуешь выйти из программы прежде, чем она выполнит все рекурсивные вызовы
чтобы программа действительно завершилась, WM_QUIT должна  стоять последней в очереди сообщений, что и реализует PostQuitMessage

если уж та хочется поиграться, вызывай в PostMessage, но это все равно неправильно


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
dark_religion
Дата 3.12.2008, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 198
Регистрация: 8.9.2006

Репутация: нет
Всего: -3



Я вообще не хочу завершать программу, я хочу что бы этот цикл закончился, и продолжилось выполнение других задач. а он у меня безконечный и я не знаю как из него выйти! 

Вообще проблема в том что когда я вызываю CreateDialog диалог создается и сразу становится неактивным, оно не ждет пока я введу в нем что-то! И все заканчивается) 

А если я добавляю такой цикл, как показанно в коде то оно из него никогда не выходит, что мне нужно сделать?

Это сообщение отредактировал(а) dark_religion - 3.12.2008, 14:07
PM MAIL   Вверх
GremlinProg
Дата 3.12.2008, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(dark_religion @  3.12.2008,  16:06 Найти цитируемый пост)
что мне нужно сделать?

Цитата(GremlinProg @  3.12.2008,  15:15 Найти цитируемый пост)
вызвать PostQuitMessage(S_OK)



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GremlinProg
Дата 3.12.2008, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(dark_religion @  3.12.2008,  15:28 Найти цитируемый пост)
GetMessage(&msg, mWnd, 0, 0)

кстати, если у тебя в проекте имеется только одно окно, то это нормально, но если буден несколько, то GetMessage их будет игнорировать
чтобы отвязаться от конкретного окна, убери mWnd
Код

GetMessage(&msg, NULL, 0, 0)


Добавлено @ 16:10
тогда и IsDialogMessage - так же нужно отвязать от mWnd
Код

IsDialogMessage(msg.hwnd, &msg)

хотя это будет не совсем верно, поскольку вместо msg.hwnd IsDialogMessage, по идее, ждет основное, родительское, или диалоговое окошко, а тут будут передаваться все подряд окна проекта

Это сообщение отредактировал(а) GremlinProg - 3.12.2008, 16:17


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
dark_religion
Дата 3.12.2008, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 198
Регистрация: 8.9.2006

Репутация: нет
Всего: -3



А если будет несколько окон, то как оно будет определять с какого получено сообщение если будет нул?

PostQuitMessage(S_OK); помогло! Но остается вопрос на счет как оно будет различать несколько окон! 

Это сообщение отредактировал(а) dark_religion - 3.12.2008, 16:27
PM MAIL   Вверх
GremlinProg
Дата 3.12.2008, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



PostMessage и SendMessage - неправильно
PostQuitMessage - правильно


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
dark_religion
Дата 4.12.2008, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 198
Регистрация: 8.9.2006

Репутация: нет
Всего: -3



Спасибо всем!!! 
PM MAIL   Вверх
GremlinProg
Дата 4.12.2008, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(dark_religion @  3.12.2008,  18:16 Найти цитируемый пост)
Но остается вопрос на счет как оно будет различать несколько окон!

а пусть так и остается, поскольку явных запретов на использование IsDialogMessage нет:
Цитата

Although the IsDialogMessage function is intended for modeless dialog boxes, you can use it with any window that contains controls, enabling the windows to provide the same keyboard selection as is used in a dialog box. 


Добавлено через 3 минуты и 59 секунд
я просто сделал намек на то, что тут можно немного соптимизировать, если в первый параметр передавать только дескриптор диалога

Добавлено через 8 минут и 18 секунд
Цитата(dark_religion @  3.12.2008,  18:16 Найти цитируемый пост)
А если будет несколько окон, то как оно будет определять с какого получено сообщение если будет нул?

msg.hwnd - это и есть окно, которому пришло сообщение из GetMessage
просто второй параметр GetMessage - тот же фильтр, работающий как и 3-4 параметры: если 0 - то работать со всеми окнами, иначе - только с указанным окном


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0726 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.