Как обработать сообщения от динамично созданных средств управления в приложении MFC?

LPCWSTR DesPath = (StringUtil::StrToWstr(setting)).c_str();`

Это создает временный wstring, который выходит из области видимости сразу после назначения DesPath, оставляя DestPath висящим и указывая на недопустимую память. Вам нужно сначала сохранить результат StrToWstr() в локальной переменной wstring, а затем вызывать c_str() для нее, поэтому строковая память остается в области видимости:

wstring wstr = StringUtil::StrToWstr(setting);
LPCWSTR DesPath = wstr.c_str();

В противном случае вызовите StrToWstr().c_str() непосредственно во входном параметре ExpandEnvironmentStringsForUser():

ExpandEnvironmentStringsForUser(hToken, StringUtil::StrToWstr(setting).c_str(), ExpandedDesPath, MAX_PATH - 1);
8
задан davidag 13 May 2009 в 11:00
поделиться

5 ответов

These are the solutions I've found so far in order of relevance:

  1. Use ON_COMMAND_RANGE if you can define the range of the control IDs you want to handle.

  2. Overload CWnd::PreTranslateMessage() and do whatever stuff you want with the messages received. NOTE: When dealing with buttons, take into account that the BN_CLICKED event is NOT sent to PreTranslateMessage but directly sent to the window procedure.

  3. Overload CWnd::WindowProc() and do whatever stuff you want with the messages received. NOTE that when dealing with buttons this is the ONLY WAY I've found to handle the BN_CLICKED event.

Interesting links:

I hope this helps... thank you all for your contributions.

7
ответ дан 5 December 2019 в 12:12
поделиться

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

BEGIN_MESSAGE_MAP(MyDialog, CDialog)
    ...
    ...
    ON_COMMAND_RANGE(1000, 5000, OnButtonDynamic)
END_MESSAGE_MAP()


void MyDialog::OnButtonDynamic(UINT nID)
{

}

Это будет работать для идентификаторов в диапазоне 1000 - 5000.

5
ответ дан 5 December 2019 в 12:12
поделиться

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

Статья

0
ответ дан 5 December 2019 в 12:12
поделиться

Подробную информацию (и многое другое) о немодальных диалогах можно найти здесь .

0
ответ дан 5 December 2019 в 12:12
поделиться

вставьте запись идентификатора обработчика в Resouce.h Затем вставьте запись в карту сообщений обработчика, например ON_BN_CLICKED (IDC_BTNCREATE, OnBnClickedrunCreated) , или вы можете напрямую использовать целочисленный идентификатор как ON_BN_CLICKED (1200, OnBnClickedrunCreated). Если вы используете вторую версию, то нет необходимости вставлять запись в resource.h. Дайте определение и объявление обработчика в файлах .h и .cpp. вы получите свой ответ.

0
ответ дан 5 December 2019 в 12:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: