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


Автор: Деран 27.8.2008, 14:24
Здравствуйте!
Как правильно передавать данные из диалога в главное окно.
Пробовал через глобальную переменную, не получается.

//Процедура диалога
Код

HWND hEditNCount;
LRESULT CALLBACK DialogProcEdit(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static char buf[15];
    switch(uMsg)
    {
    case WM_CREATE:
        ...
        hEditNCount = CreateWindow("edit", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 5, 50, 380, 20, hwnd, (HMENU)IDE_EDIT, NULL, NULL);
        CreateWindow("button", "OK", WS_VISIBLE | WS_CHILD, 10, 80, 80, 25, hwnd, (HMENU)IDB_OK_EDIT, NULL, NULL);
        ...
        break;
    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
        ...
        case IDB_OK_EDIT:
            GetWindowText(hEditNCount, buf, 10);
            N_Count = atoi(buf);
            DestroyWindow(hwnd);
            break;
        }
        break;
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;


//глобальная переменная
Код

int N_Count;


полученные данные с N_Count не поменялись, хотя изменялись в диалоге.

В чем моя ошибка?

Автор: BorisVorontsov 27.8.2008, 14:33
Во-первых, приучись занулять строки перед вызовом функций типа GetWindowText. Избавит от многих ошибок.

Цитата(Деран @  27.8.2008,  14:24 Найти цитируемый пост)
полученные данные с N_Count не поменялись, хотя изменялись в диалоге.


То есть ты стал бряком после
Код

N_Count = atoi(buf);


И посмотрел значение N_Count?

И еще -- где ты проверяешь значение переменной в процедуре родительского окна?

Автор: Деран 27.8.2008, 14:45
Цитата

И еще -- где ты проверяешь значение переменной в процедуре родительского окна? 

N_Count передаю классу через метод, если вместо N_Count, поставлю константу, то значение меняется (т.е. дело не в методе класса)
Код

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    i...
    static Quadratic quad;
    switch(uMsg)
    {
    case WM_CREATE:
        ...
        RegisterDialogClassEdit(hwnd, hInst);
        ...
        break;
    ...
    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
        ...
        case IDM_FILE_COUNT:
            CreateDialogBoxEdit(hwnd, hInst);
            quad.SetQeCount(N_Count);
            break;
        ...
        }
        break;
    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}


Цитата

То есть ты стал бряком после

Не очень понятно, что вы имели ввиду?

Автор: Andrey44 27.8.2008, 14:56
Цитата(Деран @  27.8.2008,  14:45 Найти цитируемый пост)
Не очень понятно, что вы имели ввиду? 

Деран,  это значит поставьте брекпоинт на  строке ниже где используете atoi(), и посмотрите значение вашей  N_Count

Автор: Деран 27.8.2008, 16:06
GDB показал N_Count = 11, да значение передалось в N_Count.
Код

(gdb) break 225
Breakpoint 3 at 0x40207d: file window.cpp, line 225.
(gdb) run
...

Breakpoint 3, DialogProcEdit (hwnd=0x400194, uMsg=273, wParam=204,
    lParam=15598146) at window.cpp:228
228                     break;
(gdb) p N_Count
$2 = 11


Странно, а значение остается прежним, которое инициализировал в
Код

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    hInst = hInstance;
    N_Count = 15;
        ....

Автор: Деран 27.8.2008, 17:07
Попробую задать вопрос по другому.
Каким способом передавать данные из диалога в главное окно?

Автор: Деран 27.8.2008, 19:24
Все, понял в чем ошибка!
Делал так:
Код

...
case IDM_FILE_COUNT:
            CreateDialogBoxEdit(hwnd, hInst);
            quad.SetQeCount(N_Count);
            break;
...

Код

void CreateDialogBoxEdit(HWND hwnd, HINSTANCE ghInstance)
{
    CreateWindowEx(WS_EX_DLGMODALFRAME | WS_EX_TOPMOST, "DialogClassEdit", "Диалог", WS_VISIBLE | WS_SYSMENU | WS_CAPTION, 
CW_USEDEFAULT, CW_USEDEFAULT, 400, 150, NULL, NULL, ghInstance, NULL);
}

А функция CreateDialogBoxEdit() не работает как MessageBox() и получается она создала диалог и продолжила работу дальше, т.е. выполнила следующую строчку и в N_Count не попадет нового значения!

Автор: Деран 28.8.2008, 09:43
Но все равно не понятно как передавать данные. Не будет же пользователь нажимать два раза кнопку, например, пользователь вызвал диалог, ввел то что нужно и нажал ок, диалог закрылся и еще ему нужно нажать кнопку на главном окне чтобы считать данные с N_Count.
Как нужно проследить, что диалог закрылся, при этом на диалоге была нажата кнопка ок, или какие-то перехвату нужно делать? Может есть другое решение?

Автор: 586 28.8.2008, 13:40
Цитата(Деран @  28.8.2008,  10:43 Найти цитируемый пост)
Но все равно не понятно как передавать данные. Не будет же пользователь нажимать два раза кнопку, например, пользователь вызвал диалог, ввел то что нужно и нажал ок, диалог закрылся и еще ему нужно нажать кнопку на главном окне чтобы считать данные с N_Count.

Когда пользователь нажмёт OK, тогда и изменяй переменную.
И вообще, у тебя здесь диалогов нет, у тебя здесь просто создаются окна через CreateWindowEx.
Диалоги создаются с помощью CreateDialogParam, DialogBoxParam, и бывают модальные и немодальные. Пример модального диалога - MessageBox - функция возвращает значение, когда окно закрывается.

Автор: Деран 28.8.2008, 17:16
586, А разве CreateDialogParam и DialogBoxParam не используют фун. CreateWindowEx через которую и создается окно/диалог?

Автор: 586 29.8.2008, 02:33
Цитата(Деран @  28.8.2008,  18:16 Найти цитируемый пост)
А разве CreateDialogParam и DialogBoxParam не используют фун. CreateWindowEx через которую и создается окно/диалог? 

Диалоговое окно можно реализовать через обычные WinAPI функции, но это уже будет не диалоговое окно, а велосипед. Обычно, в WinAPI под диалоговыми окнами подразумеваются те окна, что созданы с помощью CreateDialogParam / DialogBoxParam.

Автор: Деран 29.8.2008, 20:06
Спасибо всем за помощь.
Решил задачу, так: данные не передаются из диалога, а изменяются в самом диалоге (по предложенным советам выше) и изменил код создания диалога.

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