Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Win32 API | Передача данных диалоговым окном программе (http://forum.oszone.net/showthread.php?t=46045)

lehha 01-03-2005 08:12 302426

Win32 API | Передача данных диалоговым окном программе
 
Народ всем привет!! Пишу на MSVC++ , в принципе сабж (точнее хочу передать из поля редактирования IDC_EDIT), перепробовал все, облазил весь MSDN все безуспешно, помогите ПЖЛ.

hasherfrog 01-03-2005 09:07 302443

Ммм. А как насчёт, например

Код:

lResult = SendMessage(      // returns LRESULT in lResult
    (HWND) hWndControl,      // handle to destination control
    (UINT) WM_SETTEXT,      // message ID
    (WPARAM) wParam,      // = (WPARAM) () wParam;
    (LPARAM) lParam      // = (LPARAM) () lParam; );

wParam - This parameter is not used.
lParam - Pointer to a null-terminated string that is the window text.

Вам только надо правильно указать hWndControl
Это как вариант. Или я не совсем понял вопроса?

lehha 01-03-2005 09:23 302448

Возможно я не правильно описал ситуацию, постараюсь лутше
1. Есть модальное диалоговое окно.
2. В нем есть элементы управления типа таких как editcontrol, checkbox и т.п. (в часности editcontrol).
3. Туда вводится какая то строка и при нажатии кнопки OK надо получить данные из этого editcontrol.
Пробовал
GetDlgItemText(IDC_EDIT1,mytext,80), так ни чего не получается...

Savant 01-03-2005 10:33 302463

hasherfrog
только посылать не WM_SETTEXT, а WM_GETTEXT

lehha
Не пойму в чем проблема... Есть как минимум 2 способа:

1:
[code]
LRESULT CALLBACK !Ваша_диалоговая_функция!(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
......
case WM_COMMAND:
if (LOWORD(wParam) == IDOK)
{
HWND editCtrlHandle = FindWindowEx(hDlg,0,"EDIT",0); // это в случае с одним editbox'ом
char* buf[1001];
SendMessage(editCtrlHandle,WM_GETTEXT,1001,(LPARAM)buf);
MessageBox(hDlg,(LPCTSTR)buf,"Куль",0);
return TRUE;
}
break;
.......
}
return FALSE;
}

2:
всё то же самое, только
Код:

..............
      if (LOWORD(wParam) == IDOK)
      {
        char* buf[1001];
        GetDlgItemText(hDlg,IDC_EDIT1,(LPSTR)buf,1001);
        MessageBox(hDlg,(LPCTSTR)buf,"Куль",0);
        return TRUE;
      }
..............

Оба способа проверенно работают.

lehha 01-03-2005 11:10 302470

Savant
Я всегда писал консольные приложения, так что первый раз столкнулся с этим, в принципе я делал все тоже саме, но почему то у меня не передовались параметры, вот кусок моей функции в чем тут беда???
Код:

void CMainWnd::GetEdit()
  {
          CDialog mydialog(IDD_DIALOG1);
          if(mydialog.DoModal()==IDOK)
          {
                          char* data[500];
                          GetDlgItemText(IDC_EDIT1,(LPSTR)data,500);
            }
  }

а если делать такую конструкцию
Код:

void CMainWnd::GetEdit()
  {
          CDialog mydialog(IDD_DIALOG1);
          if(mydialog.DoModal()==IDOK)
          {
                          char* data[500];
                          GetDlgItemText(mydialog,IDC_EDIT1,(LPSTR)buf,500);
            }
  }

то компилятор ругается таким образо error C2661: 'CWnd::GetDlgItemTextA' : no overloaded function takes 4 arguments, народ помогите разобраться в чем сдесь моя беда, очень коца познать это дело.

Savant 01-03-2005 11:31 302476

lehha
Во втором куске для полноты явно нехватает :: перед GetDlgItemText, т.е.
Код:

...
::GetDlgItemText(mydialog,IDC_EDIT1,(LPSTR)buf,500);

Хотя подожди, а у тя диалог вообще еще существует когда ты делаешь вызов GetDlgItemText() (я просто в MFC почти ни бум-бум, больше люблю WinAPI и классы AWin - "лёгкая" замена MFC)? Просто если нажатие на ОК завершает диалог, то все данные из него теряются. Попробуй сделать предложенную выше замену и напиши что вышло.

Добавлено:
Да, вполне возможно что диалог удаляется...
Цитата:

When the user exits the dialog box, the DoModal() function returns, and your program can continue. Because the dialog box object is created locally on the stack, it is automatically deleted when it goes out of scope, which is when the OnHelpAbout() function exits.

lehha 01-03-2005 13:51 302532

Savant
Спасибо за наводку :)
Поступил чуть по другому
сначала всетаки определил класс диалогового окна, а потом по пройденой схеме ну и создал обработку OnOK()
Код:

class CDialogData : public CDialog
  {
  public:
          CDialogData(CWnd* pParentWnd=NULL) : CDialog(IDD_DIALOG2, pParentWnd)
          {};
          virtual void OnOK();
  };

обработка сообщений
Код:

void CMainWnd::DialogData()
  {
          CDialogData dialog(this);
          if (dialog.DoModal()==IDOK)
          {
                  InvalidateRect(NULL,TRUE);
                  UpdateWindow();
          }
  }
void CDialogData::OnOK()
  {
          char* data[10];
          GetDlgItemText(IDC_EDIT1,(LPSTR)data,10);
        CDialog::OnOK();
  }

Пасибо!!


Время: 07:18.

Время: 07:18.
© OSzone.net 2001-