在创建MFC项目的时候最后一步把窗口继承的类由CDialogEx改为CDialog。这一步很重要哦。
用类向导实现窗口的WM_CTLCOLOR,代码如下:
HBRUSH CAlphaEditMfc10Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
//HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何特性
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)GetStockObject(NULL_BRUSH);
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
//return hbr;
}
导入一张位图,把OnPaint改一改:
void CAlphaEditMfc10Dlg::OnPaint()
{
CPaintDC dc(this); // 用于绘制的设备上下文
CRect rect;
GetClientRect(&rect);
if (IsIconic())
{
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
//CDialog::OnPaint();
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
CBrush br;
br.CreatePatternBrush(&bmp);
dc.FillRect(&rect,&br);
}
}
用代码改为全透明之后下面的按钮太难看,把它子类化,实现WM_PAINT消息:
void CMyButton::OnPaint()
{
PAINTSTRUCT ps;
CPaintDC* dc=(CPaintDC*)BeginPaint(&ps); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CButton::OnPaint()
dc->SetBkMode(TRANSPARENT);
dc->SelectObject(GetStockObject(NULL_BRUSH));
dc->SelectObject(CreatePen(PS_DOT,1,RGB(255,0,0)));
LOGFONT lf;
memset(&lf,0,sizeof(LOGFONT));
lstrcpy(lf.lfFaceName,L"微软雅黑");
lf.lfHeight=24;
dc->SelectObject(CreateFontIndirect(&lf));
dc->Rectangle(ps.rcPaint.left,ps.rcPaint.top,ps.rcPaint.right,ps.rcPaint.bottom);
dc->DrawText(L"确定",2,&ps.rcPaint,DT_CENTER|DT_VCENTER);
EndPaint(&ps);
}
CEdit透明之后需要实现一个EN_CHANGE消息,否则文件删除就像没删一样:
void CAlphaEditMfc10Dlg::OnChangeEdit1()
{
// TODO: 如果该控件是 RICHEDIT 控件,它将不
// 发送此通知,除非重写 CDialog::OnInitDialog()
// 函数并调用 CRichEditCtrl().SetEventMask(),
// 同时将 ENM_CHANGE 标志“或”运算到掩码中。
// TODO: 在此添加控件通知处理程序代码
RECT r;
GetDlgItem(IDC_EDIT1)->GetWindowRect(&r);
ScreenToClient(&r);
InvalidateRect(&r,TRUE);
}
好了,运行效果如下: