Интересно, что ни один из ответов на этой странице не упоминает два крайних случая, надеюсь, никто не возражает, если я их добавлю:
Родовые словари в .NET не являются потокобезопасными, а иногда могут бросать NullReference
или даже (чаще) a KeyNotFoundException
при попытке получить доступ к ключу из двух параллельных потоков. Исключение в этом случае является довольно ошибочным.
Если код NullReferenceException
задан кодом unsafe
, вы можете посмотреть на переменные указателя , и проверьте их на IntPtr.Zero
или что-то в этом роде. Это одно и то же («исключение нулевого указателя»), но в небезопасном коде переменные часто переводятся в типы значений / массивы и т. Д., И вы ударяете головой о стену, задаваясь вопросом, как тип значения может исключение.
(Еще одна причина для небезопасного использования небезопасного кода, если вам это нужно)
Вы не можете сделать это с помощью простого CEdit, вам нужно переопределить несколько бит.
Внедрите свой собственный обработчик ON_WM_CTLCOLOR_REFLECT, затем верните цветной CBrush в обработчик:
( грубо говоря, вам нужно разместить обычное управление ресурсами там, rememebr, чтобы удалить кисть в деструкторе)
class CColorEdit : public CEdit
{
....
CBrush m_brBkgnd;
afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor)
{
m_brBkgnd.DeleteObject();
m_brBkgnd.CreateSolidBrush(nCtlColor);
}
}
Это также можно сделать без вывода CEdit:
ON_WM_CTLCOLOR()
в блок кода BEGIN_MESSAGE_MAP()
вашего диалога. OnCltColor()
в ваш диалог class: afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
OnCtlColor()
следующим образом: HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if ((CTLCOLOR_EDIT == nCtlColor) &&
(IDC_MY_EDIT == pWnd->GetDlgCtrlID()))
{
return m_brMyEditBk; //Create this brush in OnInitDialog() and destroy in destructor
}
return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
}