首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

MFC 控件重疊點擊穿透:Z-Order 調整與 WS_CLIPSIBLINGS/WS_CLIPCHILDREN 樣式

     編輯:程式設計疑難解答

現象

表格控件點擊彈出月曆控件,兩者重疊。月曆雖在最上層(Z-Order),點擊時表格「漏出」,月曆顯示不全、事件錯亂。

原因

  • MFC 控件為 **子窗口**,重疊時繪製順序按 Z-Order,**但鼠標消息默認發給最頂層可見窗口**。
  • 若月曆未正確設置 `WS_CLIPSIBLINGS`/`WS_CLIPCHILDREN`,或父窗口未正確剪裁,會出現「點擊穿透」。

解決方案

  1. 確保月曆創建時帶樣式:
cal.Create(WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_BORDER, rect, this, IDC_CALENDAR);
  1. 顯式調整 Z-Order 置頂:
cal.SetWindowPos(&CWnd::wndTop, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
  1. 在表格點擊處理中,先隱藏/禁用表格,再顯示月曆:
void CMyGrid::OnLButtonDown(UINT nFlags, CPoint point) {
    if (hitTestCell(point)) {
        GetParent()->GetDlgItem(IDC_GRID)->EnableWindow(FALSE); // 禁用表格
        GetParent()->GetDlgItem(IDC_CALENDAR)->ShowWindow(SW_SHOW);
        GetParent()->GetDlgItem(IDC_CALENDAR)->SetFocus();
    }
    CWnd::OnLButtonDown(nFlags, point);
}
  1. 月曆選擇完成後,恢復表格:

GetParent()->GetDlgItem(IDC_GRID)->EnableWindow(TRUE);
GetParent()->GetDlgItem(IDC_CALENDAR)->ShowWindow(SW_HIDE);

參考資源

MFC 控件重疊 Z-Order 與剪裁樣式詳解

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