

CRect dstrect;
m_picture.GetWindowRect(&dstrect);
ScreenToClient(&dstrect);
CDC *ppicdc = m_picture.GetDC();
BLENDFUNCTION bf;
bf.BlendOp = AC_SRC_OVER; //AC_SRC_ALPHA;
bf.BlendFlags = 0;
bf.SourceConstantAlpha = 30; //半透明
CDC* pmemdc = new CDC();
CBitmap bmp, *poldbitmap;
pmemdc->CreateCompatibleDC(ppicdc);
bmp.CreateCompatibleBitmap(ppicdc, dstrect.Width(), dstrect.Height());
poldbitmap = pmemdc->SelectObject(&bmp);
pmemdc->FillSolidRect(selectrt.left, selectrt.top, selectrt.Width(), selectrt.Height(), RGB(0, 0, 255)); //藍色
::AlphaBlend(ppicdc->GetSafeHdc(), selectrt.left, selectrt.top, selectrt.Width(), selectrt.Height(), pmemdc->GetSafeHdc(), selectrt.left, selectrt.top, selectrt.Width(), selectrt.Height(), bf);
pmemdc->SelectObject(poldbitmap);
if (pmemdc != NULL)
{
ReleaseDC(pmemdc);
delete pmemdc, pmemdc = NULL;
}
mousemove的一段代碼selectrt是滑鼠經過時選中的那個矩形區域,一直呼叫mousemove半透明就會加深,怎樣才能使矩形保持一開始的半透明狀態呢?
uj5u.com熱心網友回復:
設個 標記 , 第一次 有效,以后無效。uj5u.com熱心網友回復:
不用picture控制元件區域的重繪,能不能通過區域擦除或者區域重繪的方式使滑鼠移開后恢復成全透明的呢?
uj5u.com熱心網友回復:
試試 SetROP2(hdc, R2_NOTXORPEN); 類似于橡皮筋的畫法uj5u.com熱心網友回復:
那也是需要做標記位來實作的。。。
uj5u.com熱心網友回復:
也可以 把 pic 的 背景 做成 一 個 PatternBrushpaint時 用它 先畫 背景
uj5u.com熱心網友回復:
pic 的派生處理// CMyStatic message handlers
void CMyStatic::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CRect rc;
GetClientRect(&rc);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
CBitmap bmp, *poldbitmap;
bmp.CreateCompatibleBitmap(&dc, rc.Width(), rc.Height());
poldbitmap = memdc.SelectObject(&bmp);
// 滑鼠在 pic 上 加一層 半透明 藍
if(m_hover)
{
// AC_SRC_ALPHA =1
memdc.FillSolidRect(rc,RGB(0, 0, 255)); //藍色
BLENDFUNCTION bf = { AC_SRC_OVER, 0, 30, 0 }; // constant alpha 0.5
AlphaBlend(dc.GetSafeHdc(),0,0,rc.Width(),rc.Height(),
memdc.GetSafeHdc(),0,0,rc.Width(),rc.Height(),bf);
}
else
{// 滑鼠不在 pic 上 重繪 原 背景 ;use patBr
if(!m_pPatBr)
{
CCrayonDlg *pDlg=(CCrayonDlg *)GetParent();
m_pPatBr=pDlg->GetPicPatBr();
}
memdc.FillRect(rc,m_pPatBr); //
dc.BitBlt(0,0,rc.Width(),rc.Height(),&memdc,0,0,SRCCOPY);
}
//
memdc.SelectObject(poldbitmap);
// Do not call CStatic::OnPaint() for painting messages
}
void CMyStatic::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(!m_hover)
{// 只有 1次
m_hover=TRUE;
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE|TME_HOVER;
tme.dwHoverTime = 20;
_TrackMouseEvent(&tme);
}
//
CStatic::OnMouseMove(nFlags, point);
}
LRESULT CMyStatic::OnMouseHover(WPARAM wParam, LPARAM lParam)
{
// afxDump << "hover\n" ;
Invalidate();
return 0;
}
LRESULT CMyStatic::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
// afxDump << "leave\n" ;
if(m_hover)
{
m_hover = FALSE;
Invalidate();
}
return 0;
}
uj5u.com熱心網友回復:
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/57548.html
標籤:界面
上一篇:影像背景透明化處理
