Войти

Показать полную графическую версию : Win32 API | Передача данных диалоговым окном программе


lehha
01-03-2005, 08:12
Народ всем привет!! Пишу на MSVC++ , в принципе сабж (точнее хочу передать из поля редактирования IDC_EDIT), перепробовал все, облазил весь MSDN все безуспешно, помогите ПЖЛ.

hasherfrog
01-03-2005, 09:07
Ммм. А как насчёт, например

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

Savant
01-03-2005, 10:33
hasherfrog
только посылать не WM_SETTEXT, а WM_GETTEXT

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

1:

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:
всё то же самое, только
[code]
..............
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
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
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
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();
}

Пасибо!!




© OSzone.net 2001-2012