我用以下代码,实现了重画标题栏和窗体四边,有了很好的效果,但是在窗体在活动与非活动之间切换时,出现闪烁,请问怎么解决!

xiaotian2000 2002-09-09 10:47:12
我用以下代码,实现了重画标题栏和窗体四边,有了很好的效果,但是在窗体在活动与非活动之间切换时,出现闪烁,请问怎么解决!

LRESULT CTitleBarDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
LRESULT lrst=CDialog::DefWindowProc(message, wParam, lParam);

if (!::IsWindow(m_hWnd))
return lrst;

if (message==WM_MOVE||message==WM_PAINT||message == WM_NCACTIVATE||message == WM_NCPAINT ||message == WM_NOTIFY)
{
CDC* pWinDC = GetWindowDC();
if (pWinDC)
DrawTitleBar(pWinDC);
ReleaseDC(pWinDC);
}

return lrst;
}

//响应双击非客户区,就是最大化和恢复
void CTitleBarDlg::OnNcLButtonDblClk(UINT nHitTest, CPoint point)
{
if (IsZoomed())
SendMessage(WM_SYSCOMMAND, SC_RESTORE, MAKELPARAM(point.x, point.y));
else
{
SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, MAKELPARAM(point.x, point.y));
Invalidate();
}
}

void CTitleBarDlg::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
//检测各按钮是否按到
if (m_rtIcon.PtInRect(point))
AfxMessageBox("美丽的窗口!");
else if (m_rtButtHelp.PtInRect(point))
SendMessage(WM_HELP);
else if (m_rtButtExit.PtInRect(point))
SendMessage(WM_CLOSE);
else if (m_rtButtMin.PtInRect(point))
SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, MAKELPARAM(point.x, point.y));
else if (m_rtButtMax.PtInRect(point))
{
if (IsZoomed())
SendMessage(WM_SYSCOMMAND, SC_RESTORE, MAKELPARAM(point.x, point.y));
else
{
SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, MAKELPARAM(point.x, point.y));
Invalidate();
}
}
else if (!IsZoomed())
{
Default();
}
}

void CTitleBarDlg::OnNcMouseMove(UINT nHitTest, CPoint point)
{
//
if (m_rtButtMin.PtInRect(point)||m_rtButtMax.PtInRect(point)||m_rtButtExit.PtInRect(point)||m_rtIcon.PtInRect(point))
{
HCURSOR m_hButtonCursor = AfxGetApp()->LoadCursor(IDC_HAND);
::SetCursor(m_hButtonCursor);
}

CDialog::OnNcMouseMove(nHitTest, point);
}

...全文
67 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaotian2000 2002-09-09
  • 打赏
  • 举报
回复
void CTitleBarDlg::DrawTitleBar(CDC *pDC)
{
if (m_hWnd)
{
CBrush Brush(RGB(20,201,24));
CBrush* pOldBrush = pDC->SelectObject(&Brush);

CRect rtWnd, rtTitle, rtButtons, rtTitleBar;
GetWindowRect(&rtWnd);
//取得标题栏的位置
rtTitle.left = GetSystemMetrics(SM_CXFRAME);
rtTitle.top = GetSystemMetrics(SM_CYFRAME);
rtTitle.right = rtWnd.right - rtWnd.left - GetSystemMetrics(SM_CXFRAME);
rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYSIZE);

//准备画标题栏
CBitmap* pBitmap = new CBitmap;
CBitmap* pOldBitmap;
CDC* pDisplayMemDC=new CDC;
pDisplayMemDC->CreateCompatibleDC(pDC);

//画标题栏左上角
rtTitleBar.left = 0;
rtTitleBar.top = 0;
rtTitleBar.right = 100;//宽度
rtTitleBar.bottom = 48;
pBitmap->LoadBitmap(IDB_CAPTIONBAR);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
//if (IsWindowUnicode())
pDC->BitBlt(rtTitleBar.left, rtTitleBar.top, rtTitleBar.right, rtTitleBar.bottom, pDisplayMemDC, 0, 0, SRCCOPY);
//else
// pDC->BitBlt(rtTitleBar.left, rtTitleBar.top, rtTitleBar.right, rtTitleBar.bottom, pDisplayMemDC, 576, 0, SRCCOPY);
pDisplayMemDC->SelectObject(pOldBitmap);
pBitmap->DeleteObject();

//画标题栏中间位置
rtTitleBar.left = 100;
rtTitleBar.top = 0;
rtTitleBar.right = 30;
rtTitleBar.bottom = 48;
pBitmap->LoadBitmap(IDB_CAPTIONBAR);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
while (rtTitleBar.left<rtTitle.right)
{
pDC->BitBlt(rtTitleBar.left, rtTitleBar.top,rtTitleBar.right, rtTitleBar.bottom, pDisplayMemDC, 100, 0,SRCCOPY);
rtTitleBar.left+=30;
}
pDisplayMemDC->SelectObject(pOldBitmap);
pBitmap->DeleteObject();

//画标题栏文字
CString m_strFontFace="宋体";

LOGFONT lf;
CFont m_fontMe;

lf.lfHeight=12;
lf.lfWidth=0;
lf.lfWeight=700;
lf.lfCharSet=DEFAULT_CHARSET;
lf.lfClipPrecision=CLIP_DEFAULT_PRECIS;
lf.lfEscapement=0;
lf.lfItalic=0;
lf.lfOrientation=0;
lf.lfOutPrecision=OUT_TT_PRECIS;
lf.lfPitchAndFamily=DEFAULT_PITCH;
lf.lfQuality=DEFAULT_QUALITY;
lf.lfStrikeOut=0;
lf.lfUnderline=0;

strcpy(lf.lfFaceName, m_strFontFace);
m_fontMe.CreateFontIndirect(&lf);

int nOldMode = pDC->SetBkMode(TRANSPARENT);
COLORREF clOldText=pDC->SetTextColor(RGB(255, 255, 255));
//pDC->SelectStockObject(SYSTEM_FIXED_FONT);
pDC->SelectObject(&m_fontMe);
rtTitle.left += 100;
rtTitle.top += 5;
rtTitle.bottom = rtTitle.top + 24;
CString m_strTitle;
GetWindowText(m_strTitle);
pDC->DrawText(m_strTitle, &rtTitle, DT_LEFT);
pDC->SetBkMode(nOldMode);
pDC->SetTextColor(clOldText);

//画标题栏右上角
rtTitleBar.left = rtTitle.right-105;
rtTitleBar.top = 0;
rtTitleBar.right = 110;
rtTitleBar.bottom = 48;
pBitmap->LoadBitmap(IDB_CAPTIONBAR);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pDC->BitBlt(rtTitleBar.left, rtTitleBar.top,rtTitleBar.right, rtTitleBar.bottom, pDisplayMemDC, 130, 0, SRCCOPY);
pDisplayMemDC->SelectObject(pOldBitmap);
pBitmap->DeleteObject();

//画按钮

//重画关闭button
rtButtons.left = rtTitle.right - 18;
rtButtons.top = rtTitle.top-3;
rtButtons.right = rtButtons.left + 17;
rtButtons.bottom = rtButtons.top + 17;
pBitmap->LoadBitmap(IDB_CAPTIONBAR);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 246,6, SRCCOPY);
pDisplayMemDC->SelectObject(pOldBitmap);
m_rtButtExit = rtButtons;
m_rtButtExit.OffsetRect(rtWnd.TopLeft());
pBitmap->DeleteObject();

//重画还原最大化button
rtButtons.left = rtTitle.right - 18-17-2;
rtButtons.top = rtTitle.top-3;
rtButtons.right = rtButtons.left + 17;
rtButtons.bottom = rtButtons.top + 17;
pBitmap->LoadBitmap(IDB_CAPTIONBAR);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
if (IsZoomed())
pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 294, 6, SRCCOPY);
else
pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 342, 6, SRCCOPY);
pDisplayMemDC->SelectObject(pOldBitmap);
m_rtButtMax = rtButtons;
m_rtButtMax.OffsetRect(rtWnd.TopLeft());
pBitmap->DeleteObject();

//重画最小化button
pDC->SetBkMode(TRANSPARENT);
rtButtons.left = rtTitle.right - 18-17-17-2;
rtButtons.top = rtTitle.top-3;
rtButtons.right = rtButtons.left + 17;
rtButtons.bottom = rtButtons.top + 17;
pBitmap->LoadBitmap(IDB_CAPTIONBAR);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 393, 6, SRCCOPY);
pDisplayMemDC->SelectObject(pOldBitmap);
m_rtButtMin = rtButtons;
m_rtButtMin.OffsetRect(rtWnd.TopLeft());
pBitmap->DeleteObject();

//画左边界
rtTitleBar.left = 0;
rtTitleBar.top = 48;
rtTitleBar.right = 10;
rtTitleBar.bottom = 10;
pBitmap->LoadBitmap(IDB_BOARDS);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
while (rtTitleBar.top<rtWnd.Height())
{
pDC->BitBlt(rtTitleBar.left, rtTitleBar.top,rtTitleBar.right, rtTitleBar.bottom, pDisplayMemDC, 0, 0, SRCCOPY);
rtTitleBar.top+=10;
}
pDisplayMemDC->SelectObject(pOldBitmap);
pBitmap->DeleteObject();

//画右边界
rtTitleBar.left = rtWnd.Width()-9;
rtTitleBar.top = 48;
rtTitleBar.right = 10;
rtTitleBar.bottom = 10;
pBitmap->LoadBitmap(IDB_BOARDS);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
while (rtTitleBar.top<rtWnd.Height())
{
pDC->BitBlt(rtTitleBar.left, rtTitleBar.top,rtTitleBar.right, rtTitleBar.bottom, pDisplayMemDC, 40, 0, SRCCOPY);
rtTitleBar.top+=10;
}
pDisplayMemDC->SelectObject(pOldBitmap);
pBitmap->DeleteObject();

//画底边界
rtTitleBar.left = 0;
rtTitleBar.top = rtWnd.Height()-9;
rtTitleBar.right = 10;
rtTitleBar.bottom = 10;
pBitmap->LoadBitmap(IDB_BOARDS);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
while (rtTitleBar.left<rtWnd.Width())
{
pDC->BitBlt(rtTitleBar.left, rtTitleBar.top,rtTitleBar.right, rtTitleBar.bottom, pDisplayMemDC, 30, 0, SRCCOPY);
rtTitleBar.left+=10;
}
pDisplayMemDC->SelectObject(pOldBitmap);
pBitmap->DeleteObject();

//画左下边界
rtTitleBar.left = 0;
rtTitleBar.top = rtWnd.Height()-9;
rtTitleBar.right = 10;
rtTitleBar.bottom = 10;
pBitmap->LoadBitmap(IDB_BOARDS);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pDC->BitBlt(rtTitleBar.left, rtTitleBar.top,rtTitleBar.right, rtTitleBar.bottom, pDisplayMemDC, 20, 0, SRCCOPY);
pDisplayMemDC->SelectObject(pOldBitmap);
pBitmap->DeleteObject();

//画右下边界
rtTitleBar.left = rtWnd.Width()-9;
rtTitleBar.top = rtWnd.Height()-9;
rtTitleBar.right = 10;
rtTitleBar.bottom = 10;
pBitmap->LoadBitmap(IDB_BOARDS);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pDC->BitBlt(rtTitleBar.left, rtTitleBar.top,rtTitleBar.right, rtTitleBar.bottom, pDisplayMemDC, 60, 0, SRCCOPY);
pDisplayMemDC->SelectObject(pOldBitmap);
pBitmap->DeleteObject();

//图表位置,出菜单
rtButtons.left = 10;
rtButtons.top = 3;
rtButtons.right = rtButtons.left + 17;
rtButtons.bottom = rtButtons.top + 17;
m_rtIcon = rtButtons;
m_rtIcon.OffsetRect(rtWnd.TopLeft());

ReleaseDC(pDisplayMemDC);
delete pDisplayMemDC;
delete pBitmap;
}
}
siphonelee 2002-09-09
  • 打赏
  • 举报
回复
我想是因为你分成好几次bitblt到pdc的原因
futurewf 2002-09-09
  • 打赏
  • 举报
回复
太长了,没有时间看哪!

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧