Вы можете создать диалоговое окно с помощью DialogBoxParam
, которое позволяет передавать данные инициализации в диалоговое окно.
В WM_INITDIALOG
, используйте SetWindowLongPtr
для сохранения этих данных, после чего данные доступны в диалоговой процедуре.
Обратите внимание, что с помощью этого метода вы передаете указатель, поэтому sizeof(ptr)/sizeof(*ptr)
не собирается возвращать правильный размер выделения.
В идеале вы можете объявить локальную переменную wchar_t *str = NULL;
ипередать его адрес, а затем разрешить диалогу выделить память.Затем вызывающая сторона будет ответственна за освобождение памяти.
INT_PTR CALLBACK DialogProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
switch(msg)
{
case WM_INITDIALOG:
SetWindowLongPtr(hwnd, GWL_USERDATA, lparam);
break;
case WM_COMMAND:
switch(LOWORD(wparam))
{
case IDOK:
{
wchar_t *str = (wchar_t*)GetWindowLongPtr(hwnd, GWL_USERDATA);
if(str)
GetDlgItemText(hwnd, IDC_EDIT1, str, 80);
EndDialog(hwnd, wparam);
return (INT_PTR)TRUE;
}
}
}
return (INT_PTR)FALSE;
}
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE, LPSTR, int)
{
wchar_t str[80];
if(IDOK == DialogBoxParam(hinst, MAKEINTRESOURCE(IDD_DIALOG1), 0,
DialogProc, (LPARAM)(&str)))
MessageBox(0, str, 0, 0);
return 0;
}