首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC 打造動態彈出對話框:SetWindowRgn 實現由小變大的視覺特效

     編輯:VC 教學

為何不用 MoveWindow?

傳統做法在 WM_INITDIALOG 循環呼叫 MoveWindow 漸變大小,但速度慢且因 MFC 記憶體洩漏導致畫面殘留,效果不佳。

核心思路:區域動態擴展

利用 SetWindowRgn 設定視窗可見區域。對話框初始隱藏,然後以中心點為基準,循環建立逐漸放大的矩形/橢圓區域並套用,形成「由小變大」的彈出動畫。

關鍵 API

int SetWindowRgn(HRGN hRgn, BOOL bRedraw);
// hRgn: 區域控制代碼(由 CRgn 建立)
// bRedraw: 是否立即重繪

實作範例:關於對話框動態彈出

BOOL CAboutDlg::OnInitDialog() {
    CDialog::OnInitDialog();
    ShowWindow(SW_HIDE); // 先隱藏

    CRect dlgRect; GetClientRect(&dlgRect);
    CPoint center(dlgRect.Width()/2, dlgRect.Height()/2);

    CRgn rgn;
    // 為避免邊框干擾,取得系統邊框寬度
    int frame = GetSystemMetrics(SM_CYSIZEFRAME);

    for(int i = 10; i < dlgRect.Width()/2 + frame; i += 5) {
        rgn.CreateRectRgn(center.x - i, center.y - i, center.x + i, center.y + i);
        SetWindowRgn((HRGN)rgn, TRUE);
        ShowWindow(SW_SHOW);
        CenterWindow(); // 確保置中
        rgn.DeleteObject();
        // 可加入 Sleep(10) 控制速度
    }
    return TRUE;
}

進階討論:非正方形對話框

本範例假設對話框接近正方形。若長寬比懸殊,建議依比例建立橢圓區域(CreateEllipticRgn)或圓角矩形(CreateRoundRectRgn),並同步調整 X/Y 方向擴展步長,以獲得自然視覺效果。

優缺點對比

方案速度殘影實作複雜度
MoveWindow 循環慢明顯低
SetWindowRgn 區域擴展快無中
Layered Window (WS_EX_LAYERED) + Alpha 淡入最快無高(需 Win2K+)

結語

SetWindowRgn 方案在不需分層視窗支援的舊系統上也能完美運行,是實現動態彈出特效的經典技巧。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved