Как включить тень для диалога с нарисованным владельцем

Я использую нарисованный владельцем диалог. Мне нравится давать тень для моего под-диалога. Является ли это возможным?

Заранее спасибо.

1

Решение

Конечно, это возможно. Вы можете настроить фон диалога, используя OnEraseBkgnd ().

В качестве примера я наложил тени на кнопки «ОК» и «Отмена» диалогового окна (CDialogControlShadowDlg) …

Сначала несколько объявлений в заголовочном файле вашего диалогового класса:

// Implementation
protected:
HICON m_hIcon;

CRect ComputeDrawingRect(int control_id);   // <-- !!!
void DrawShadow(CDC* pDC, CRect &r);        // <-- !!!

// Generated message map functions
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);        // <-- !!!
DECLARE_MESSAGE_MAP()
};

Затем добавьте OnEraseBkgnd к вашей карте сообщений в файле .cpp:

BEGIN_MESSAGE_MAP(CDialogControlShadowDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_ERASEBKGND()          // <-- !!!
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

И последнее, но не менее важное: определения функций-членов:

// gets the actual drawing location of a control relative to the dialog frame
CRect CDialogControlShadowDlg::ComputeDrawingRect(int control_id)
{
CRect r;
GetDlgItem(control_id)->GetWindowRect(&r);
ScreenToClient(&r);

return r;
}

#define SHADOW_WIDTH 6
// draws the actual shadow
void CDialogControlShadowDlg::DrawShadow(CDC* pDC, CRect &r)
{
DWORD dwBackgroundColor = GetSysColor(COLOR_BTNFACE);
DWORD dwDarkestColor = RGB(GetRValue(dwBackgroundColor)/2,
GetGValue(dwBackgroundColor)/2,
GetBValue(dwBackgroundColor)/2); // dialog background halftone as base color for shadow
int nOffset;
for (nOffset = SHADOW_WIDTH; nOffset > 0; nOffset--)
{
DWORD dwCurrentColorR = (GetRValue(dwDarkestColor)*(SHADOW_WIDTH-nOffset)
+ GetRValue(dwBackgroundColor)*nOffset) / SHADOW_WIDTH;
DWORD dwCurrentColorG = (GetGValue(dwDarkestColor)*(SHADOW_WIDTH-nOffset)
+ GetGValue(dwBackgroundColor)*nOffset) / SHADOW_WIDTH;
DWORD dwCurrentColorB = (GetBValue(dwDarkestColor)*(SHADOW_WIDTH-nOffset)
+ GetBValue(dwBackgroundColor)*nOffset) / SHADOW_WIDTH;
pDC->FillSolidRect(r + CPoint(nOffset, nOffset), RGB(dwCurrentColorR, dwCurrentColorG, dwCurrentColorB));
}
}

BOOL CDialogControlShadowDlg::OnEraseBkgnd( CDC* pDC )
{
// draw dialog background
CRect rdlg;
GetClientRect(&rdlg);
DWORD dwBackgroundColor = GetSysColor(COLOR_BTNFACE);
pDC->FillSolidRect(rdlg, dwBackgroundColor);

// draw shadows
CRect r1, r2;
r1 = ComputeDrawingRect(IDOK);
r2 = ComputeDrawingRect(IDCANCEL);
DrawShadow(pDC, r1);
DrawShadow(pDC, r2);

return TRUE;
}

После применения этих изменений диалог должен выглядеть следующим образом:

скриншот http://www.easyct.de/images/dialogcontrolshadow.png

2

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

Других решений пока нет …