int CMainFrame::OnCreate(LPCREATESTRUCT lpCS) {
if (CFrameWnd::OnCreate(lpCS) == -1) return -1;
ModifyStyleEx(0, WS_EX_LAYERED | WS_EX_TRANSPARENT);
// WS_EX_TRANSPARENT:滑鼠事件穿透到底層視窗
return 0;
}
// 50% 半透明
SetLayeredWindowAttributes(0, 255 * 0.5, LWA_ALPHA);
// 參數:crKey(色鍵), bAlpha(0-255), dwFlags(LWA_ALPHA/LWA_COLORKEY)
void CPictureView::OnDraw(CDC* pDC) {
if (m_blending) {
// 1. 離屏 DC 繪製新圖
CDC memDC; memDC.CreateCompatibleDC(pDC);
CBitmap bmp; bmp.CreateCompatibleBitmap(pDC, w, h);
memDC.SelectObject(&bmp);
m_newPic.Render(&memDC, rect);
// 2. 計算 alpha (0-255)
int alpha = ((clock() - m_start) * 255) / 3000; // 3秒完成
alpha = max(255 - alpha, 0); // 由舊圖淡出
// 3. AlphaBlend 舊圖疊加
BLENDFUNCTION bf = { AC_SRC_OVER, 0, (BYTE)alpha, AC_SRC_ALPHA };
memDC.AlphaBlend(0, 0, w, h, &m_oldMemDC, 0, 0, w, h, bf);
// 4. 一次性 BitBlt 到螢幕
pDC->BitBlt(0, 0, w, h, &memDC, 0, 0, SRCCOPY);
if (alpha > 0) Invalidate(FALSE); // 持續重繪
else StopBlending(); // 結束
} else {
m_currentPic.Render(pDC, rect);
}
}
typedef struct {
BYTE BlendOp; // AC_SRC_OVER = 0
BYTE BlendFlags; // 必須 0
BYTE SourceConstantAlpha; // 0-255
BYTE AlphaFormat; // AC_SRC_ALPHA = 1 (來源含 alpha 通道)
} BLENDFUNCTION;
Graphics.DrawImage + ColorMatrix 第 4 行第 4 列設定 alphaOpacity 屬性動畫、OpacityMaskIDXTransform 轉換效果(漸變、擦除、推入等)
