Windows — Используйте параметр в файле ресурсов .rs Консоль C ++

Есть похожий вопрос Вот но я ищу C ++ версия.

Я хочу создать .RS файл с Диалоговое окно который использует строка как переменная вместо «», чтобы я мог изменить его в программе.

Например: в

DEFPUSHBUTTON   "Hello World", IDOK, 8, 24, 75, 14

"Hello World" станет именем переменной, которую я могу «Определение» или же задавать в программе.

Зачем? Я пытаюсь сделать DialogBox, как «Шаблон», и сделать много примеров вокруг программы с другой текст, но те же кнопки в них.

Надеюсь, что моя тарабарщина понята.

1

Решение

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

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

Таким образом, вы застряли в жестком кодировании начального заголовка вашего DEFPUSHBUTTON, Это может быть пустая строка или любое другое значение, которое вы хотите; вам просто нужен заполнитель. И вы можете поместить все возможные заголовки в таблицу строк (что я бы порекомендовал), но вы не можете связать их с помощью любого автоматического механизма.

Вам нужно написать код, чтобы сделать это самостоятельно. Вы могли бы, конечно, динамично генерировать ресурсы, но это немало проблем. Я думаю, что самый простой способ сделать это — просто создать диалог (используя файл ресурсов «шаблона»), извлечь дескриптор элементов управления, текст заголовка которых вы хотите изменить, и отправить им WM_SETTEXT сообщение с новой строкой. На самом деле, SetDlgItemText Функция сделает именно это для вас.

Возможно, это будет легче объяснить с помощью некоторого кода. Предположим, что у вас есть определенный ресурс диалога, включая все ваши элементы управления. Все элементы управления, которые вы хотите изменить, должны иметь уникальный идентификатор, назначенный каждому из них, чтобы вы могли различать их во время выполнения. Неважно, что начальная Значения, которые вы назначаете в файле ресурсов, таковы, что вы собираетесь изменять их сразу. Это может выглядеть так:

IDD_TEMPLATE DIALOG DISCARDABLE  0, 0, xx, xx
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION
CAPTION "Dialog Template"FONT 8, "MS Sans Serif"BEGIN
CTEXT           "Placeholder text", IDC_MESSAGE, xx, xx, xx, xx
DEFPUSHBUTTON   "Placeholder",      IDOK,        xx, xx, xx, xx
PUSHBUTTON      "Cancel",           IDCANCEL,    xx, xx, xx, xx
END

Затем в вашем диалоге процедура (DialogProc), обработайте WM_INITDIALOG сообщение следующее:

INT_PTR CALLBACK TemplateDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
{
// Load the caption strings you want to use from the string table
// in the resource file, or get them from wherever you want.
// These are the "variables" you wanted to use in the question.
TCHAR* pszMessage;
LoadString(hInstance,   /* instance handle for app or resource DLL */
IDS_MESSAGE, /* ID of the string resource to load       */
reinterpret_cast<LPTSTR>(&pszMessage),
0);
TCHAR* pszOkBtn;
LoadString(hInstance, IDS_OKBUTTON, reinterpret_cast<LPTSTR>(&pszOkBtn), 0);
// ...etc.

// Set the caption text for each control.
SetDlgItemText(hwndDlg,     /* handle to the dialog box window */
IDC_MESSAGE, /* ID of the control to modify     */
pszMessage); /* variable containing text to set */
SetDlgItemText(hwndDlg, IDOK, pszOkBtn);
// ...etc.

// And, if you want to set some other properties, you can do that too.
// For example, you might set the caption of the dialog itself.
TCHAR* pszTitle;
LoadString(hInstance, IDS_DLGCAPTION, reinterpret_cast<LPTSTR>(&pszTitle), 0);
SetWindowText(hwndDlg, pszTitle);
// ...etc.

return TRUE;  // set the default focus
}
// ...process other messages as necessary
}
return FALSE;  // we did not process the message
}
2

Другие решения

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

DialogBoxIndirect принимает указатель на структуру, которая состоит из заголовка (DLGTEMPLATE), который описывает само диалоговое окно, за которым следует указанное количество элементов управления (DLGITEMTEMPLATE).

По сути, вы можете использовать вышеизложенное для создания нового диалогового шаблона в памяти каждый раз, когда вам нужен DialogBox с другим текстом на кнопке. Тем не менее, это немного экстрим, если все, что вы действительно хотите сделать, это изменить какой-то текст, что, как говорит Коди, вы можете сделать с SetDlgItemText,

Если вы действительно любопытно, вот пример.

1

По вопросам рекламы [email protected]