Я пытался создать элемент управления подклассом в первый раз, но чувствую, что сделал что-то не так. Элемент управления — это кнопка, которую я разместил в дизайнере. Это его класс:
class TTTField : public CButton
{
public:
BEGIN_MSG_MAP_EX(TTTField)
MSG_WM_INITDIALOG(OnInitDialog);
END_MSG_MAP()
TTTField operator=(const CWindow& btn);
private:
const BOOL OnInitDialog(const CWindow wndFocus, const LPARAM lInitParam);
};
Пока ничего особенного.
Однако я не могу получить сообщения Windows в этом элементе управления. Это плохо, учитывая, что основной причиной попытки создания подкласса элемента управления был тот факт, что это должен быть повторно используемый класс с повторно используемым пользовательским поведением Paint. Я хочу перезаписать некоторые обработчики сообщений, сохранив при этом те, которые я явно не запрашивал, в обычную процедуру CButton.
Как видите, я реализовал карту сообщений, но сообщения просто не приходят.
Вот как я пытался настроить экземпляр этого класса:
TTTField fld;
является переменной-членом моего основного диалогового класса. В этом классе я добавил следующий DDX_MAP:
BEGIN_DDX_MAP(TTTMainDialog)
DDX_CONTROL_HANDLE(IDC_BTN, fld)
END_DDX_MAP()
где IDC_BTN является идентификатором кнопки в дизайнере.
В перегрузке оператора присваивания для TTTField у меня есть следующее:
TTTField TTTField::operator=(const CWindow& btn)
{
Attach(btn);
return *this;
}
Я чувствую, что эта перегрузка оператора может быть источником моих проблем, но я просто не могу найти веб-сайт, который правильно объясняет всю тему без использования кода, который кажется устаревшим уже лет 20.
Что я здесь делаю неправильно? Я действительно потерян прямо сейчас.
WM_INITDIALOG
?WM_NCCREATE
иWM_CREATE
сообщения, конечно. Но сообщение, предназначенное для диалогов? Хмммммм. В CodeProject есть миллион статей о подклассах класса CButton, если я не ошибаюсь. (Я не MFC - я предпочитаю кататься без седла) - person enhzflep   schedule 10.09.2016WM_INITDIALOG
, это не MFC. Это WTL, и что касается чистого кода, сгенерированный код в значительной степени таков. (Вы не можете сказать это по коду на самом деле, потому что это неправильно. Однако правильный код выдал бы это. См. ответы.) - person IInspectable   schedule 11.09.2016