MFC绘图程序 我做完了后,怎么再添加双缓存 求一个简单的栗子

 我来答
bjl0523
2015-07-03 · TA获得超过118个赞
知道小有建树答主
回答量:104
采纳率:0%
帮助的人:74.6万
展开全部
GDI

void CDrawButton::DrawButton(HDC hDestDC)
{
CRect rc;
GetClientRect(&rc);
int nwindth = rc.Width();
int nheight = rc.Height();
HDC hdc = CreateCompatibleDC(hDestDC); // 创建兼容DC,采用双缓冲画出,避免闪烁
HDC hmaskdc = CreateCompatibleDC(hDestDC);
HBITMAP hbitmap = CreateCompatibleBitmap(hDestDC, nwindth, nheight);
HBITMAP hmaskbitmap = CreateCompatibleBitmap(hDestDC, nwindth, nheight);
HBITMAP holdbitmap =(HBITMAP)SelectObject(hdc, hbitmap);
HBITMAP holdmaskbitmap = (HBITMAP)SelectObject(hmaskdc, hmaskbitmap);
SetBkMode(hdc, TRANSPARENT);
// 把父窗口的背景图复制到按钮的DC上,实现视觉透明
ChineseChess* pparent = (ChineseChess*)GetParent();
CPoint pt(0, 0);
MapWindowPoints(pparent, &pt, 1);
pparent->m_bkimage.BitBlt(hdc, rc, pt, SRCCOPY);
//-----------------------
int nalpha = 100; // 0-255
int noffset = 0;
HBRUSH hbr = CreateSolidBrush(m_bkcolor);
FillRect(hmaskdc, &rc, hbr);
DeleteObject(hbr);
if (!m_bover)
{
if (m_ubtnstyle == 0)
{
m_bdisable = FALSE;
m_bdown = FALSE;
m_bover = FALSE;
}
else if (m_ubtnstyle == 1)
{
m_bdisable = FALSE;
m_bdown = TRUE;
}
}
if (m_bdisable)
{
nalpha = 100;
}
else if (m_bdown)
{
nalpha = 254;
noffset = 1;
}
else if (m_bover)
{
nalpha = 220;
}
else
{
nalpha = 100;
}

BLENDFUNCTION blend;
memset(&blend, 0, sizeof(blend));
blend.BlendOp = AC_SRC_OVER;
blend.SourceConstantAlpha = nalpha; // 透明度
HRGN hrgn = CreateRoundRectRgn(0, 0, nwindth, nheight, 3, 3);
SelectClipRgn(hdc, hrgn);
AlphaBlend(hdc, 0, 0, nwindth, nheight, hmaskdc, 0, 0, nwindth, nheight, blend);
CString strtext;
GetWindowText(strtext);
if (!strtext.IsEmpty())
{
rc.InflateRect(-2, -2);
rc.OffsetRect(noffset, noffset);
// HFONT hfont = (HFONT)SendMessage(WM_GETFONT);
// if (!hfont)
// {
// hfont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
// }
// HFONT holdfont = (HFONT)::SelectObject(hdc, &hfont);
CFont* holdfont = (CFont*)SelectObject(hdc, *m_textfont);
::SetTextColor(hdc, m_textcolor);
::DrawText(hdc, strtext, -1, &rc,DT_SINGLELINE|DT_CENTER|DT_VCENTER|DT_WORD_ELLIPSIS);
::SelectObject(hdc, holdfont);
}
SelectClipRgn(hdc, NULL);
DeleteObject(&hrgn);
// 复制到控件的dc上
BitBlt(hDestDC, 0, 0, nwindth, nheight, hdc, 0, 0, SRCCOPY);
// 删除资源,释放内存
SelectObject(hdc, holdbitmap);
DeleteObject(hbitmap);
DeleteDC(hdc);
SelectObject(hmaskdc, holdbitmap);
DeleteObject(hmaskbitmap);
DeleteDC(hmaskdc);
}
GDI+ CPaintDC dc(this);
// 双缓冲区显示界面内容
Bitmap * bmp = new Bitmap(m_clientRect.Width(),m_clientRect.Height());
Graphics gcache(bmp);
gcache.DrawImage(*m_pbackimage, 0, 0, bmp->GetWidth(), bmp->GetHeight());
Graphics gshow(dc.m_hDC);
gshow.DrawImage(bmp,0,0);
CDialog::OnPaint();
// 上面就是两种实现,你看明白了就会了。别问我问题哦。
house柠栀
2015-07-02 · TA获得超过837个赞
知道小有建树答主
回答量:1567
采纳率:0%
帮助的人:340万
展开全部
我会VB,不会VC
追问
应该差不多吧  怎么做
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式