Я изменяю существующий проект, и в диалоговом окне есть элементы управления. В некоторых случаях я подклассифицирую в тему по-другому (в других случаях я оставлю это полностью один).К тому времени, когда DDX_Control()
вызывается во время DoDataExchange()
, hwnd для ListBox
уже имеет примененные стили.В частности, в настоящее время, даже если я SetWindowLongPtr()
, LBS_OWNERDRAWFIXED
не работает.Под «не работает» я подразумеваю, что, хотя стиль применяется, сообщения рисования владельца не принимаются CListBox.
И наоборот, если я избегаю DDX_Control()
и просто делаю создание, ListBox делаетполучать сообщения и могут быть отозваны владельцем.Но если я сделаю это, то теперь будет два HWND, только один из которых будет возвращен GetDlgItem()
.Я полагаю, что могу сделать эту работу при необходимости, но мне было интересно, есть ли секрет, чтобы перехватить создание HWND элементов управления в диалоге (на самом деле CPropertyPage).
Ниже приведен код, который не работает,с более прокомментированным кодом, который «работает», но не так, как я хотел, чтобы он работал, если это возможно.
void CMyPropertySheet::DoDataExchange(CDataExchange* pDX)
{
HWND hWndCtrl;
pDX->m_pDlgWnd->GetDlgItem(IDC_LIST1, &hWndCtrl);
if (themed) {
DWORD style = GetWindowLongPtr(hWndCtrl, GWL_STYLE) | LBS_OWNERDRAWFIXED;
SetWindowLongPtr(hWndCtrl, GWL_STYLE, style);
DDX_Control(pDX, IDC_LIST1, m_listbox);
//RECT wr;
//::GetWindowRect(hWndCtrl, &wr);
//m_listbox.Create(style, wr, this, IDC_LIST1);
} else {
DDX_Control(pDX, IDC_LIST1, m_listbox);
}
Я, вероятно, должен добавить, что я попытался создать подкласс окна, но это не помогло, иCMyPropertySheet::PreSubclassWindow
тоже было недостаточно скоро.