实现WM_CTLCOLOR消息
HBRUSH CtestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何特性
if (pWnd->GetDlgCtrlID() == IDC_TEST)
{
pDC->SetTextColor(m_color); //设置字体颜色
pDC->SetBkColor(RGB(255, 255, 255));//设置背景颜色
pDC->SetBkMode(TRANSPARENT); //设置背景透明
pDC->SetTextAlign(SS_LEFT); //设置对齐方式
pDC->SelectObject(&m_font); //设置字体
}
//return m_bru; //返回你需要的画笔
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
return hbr;
}
设置字体
方法一:
在onpaint中选择所需要的字体CFont
pDC->SelectObject(&m_font); //设置字体
方法二:
LOGFONT lf;
CClientDC dc(this);
font = dc.GetCurrentFont();
if(NULL != font)
font->GetLogFont(&lf);
::ZeroMemory(&lf, sizeof(&lf));
lf.lfHeight = 30;
具体字体操作参考:
http://www.360doc.com/content/16/1019/22/35648956_599729894.shtml
MFC中LOGFONT字体大小转换
MFC中,LOGFONT的lfHeihgt与FontSize的大小转换规则为:
LOGFONT.lfHeight = MulDiv(-m_FontSize,GetDeviceCaps(GetDC(NULL),LOGPIXELSX),72);
NULL也可以用hDC;
模拟给控件发送消息
如果是想在子窗口操作父窗口的按钮,那么可以模拟按钮事件:
WPARAM wParam;
wParam = BN_CLICKED;
wParam <<= 16;
wParam |= uID; //按钮ID
LPARAM lParam;
lParam = (LPARAM)::GetDlgItem(GetSafeHwnd(), uID);
//pWnd:接受按钮事件的窗口的指针
::PostMessage(pWnd->GetSafeHwnd(), WM_COMMAND, wParam, lParam);
设置DC属性,例如:画刷,画笔,字体等。
CPen *pOldPen=dc->SelectObject(&pen);//画笔选入设备描述表,并返回当前的画笔
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//创建一个透明的画刷
CBrush *pOldBrush=dc->SelectObject(pBrush);//选择画刷
dc->Rectangle(rect);
dc->FillRect(rect,pBrush);
dc->SelectObject(pOldBrush);//恢复以前 的画刷
消息反射
在windows里面,子控件经常向父控件发送消息,例如很多子控件要绘制自己的背景,就可能向父窗口发送消息WM_CTLCOLOR。对于从子控件发来的消息,父控件有可能在处理之前,把消息返还给子控件处理,这样消息看起来就像是从父窗口反射回来一样
在派生一个控件类时,往往需要设置控件本身的一些属性。可以使用向导类实现带等号的消息,例如: =WM_CTLCOLOR消息
具体参考网址:
https://blog.csdn.net/feimashenhua/article/details/7039859