# Double Buffer Architecture Research v6
## Focus: Caret 行為與 HideCaret/ShowCaret 計數器

---

## 當前 Caret 流程（v4 模式）

```
WndProc WM_PAINT:
  (no HideCaret here — 原有的行為)

  CallWindowProcW → PaintText:
    BeginPaint      ← Windows 隱含 HideCaret (counter++)
    ... draw ...
    EndPaint        ← Windows 隱含 ShowCaret (counter--)
                      ← 此時 caret counter = 0，caret 可見

  ScanAndDrawUda:
    HideCaret       ← counter = 1，caret 隱藏
    ... capture from g_hPaintBuf (no caret in buffer — 正確) ...
    ... draw UDA ...
    ... BitBlt to screen ...
    DestroyCaret    ← 銷毀舊 caret
    CreateCaret     ← 建新 caret（正確寬度）
    ShowCaret       ← counter = 0，caret 可見
```

## 問題分析

### Q1: BeginPaint/EndPaint 之間 caret 狀態
- BeginPaint 隱藏 caret（從螢幕移除）
- PaintText 畫到 buffer（不影響螢幕）
- EndPaint 顯示 caret（畫回螢幕）
- **問題**：EndPaint 在 v4 模式下把 caret 畫到螢幕，但 PaintText 沒寫螢幕
- 螢幕上可能有舊內容 + 新 caret = caret 顯示在舊內容上
- **影響**：極短暫（EndPaint → HideCaret 之間，幾微秒）
- **使用者感知**：無

### Q2: HideCaret 在 capture 之前
- ScanAndDrawUda 呼叫 HideCaret 後從 g_hPaintBuf capture
- g_hPaintBuf 是 PaintText 的 buffer，不是螢幕 → 不含 caret
- **HideCaret 對 v4 capture 沒意義**（capture 來源不是螢幕）
- 但 HideCaret 仍需要：writeback BitBlt 會覆蓋 caret 位置

### Q3: Caret 是否需要移到 WndProc?
- v1/v2 嘗試過，失敗（「無法輸入」）
- 原因不明，但可能與 HideCaret/ShowCaret counter 不平衡有關
- **目前方案（ScanAndDrawUda 管理）可用，不需要改**

## 優化機會

### 跳過 HideCaret（在 v4 模式下）
```c
extern HDC g_hPaintBuf;
if( !g_hPaintBuf )
   HideCaret( hWnd );  // 原始模式：capture 來自螢幕，需要隱藏 caret
// v4 模式：capture 來自 buffer，caret 不在 buffer 裡，不需要 HideCaret
```

**風險**：writeback BitBlt 覆蓋 caret 位置。即使不 HideCaret，BitBlt 後 DestroyCaret+CreateCaret 會重建。
**但**：BitBlt 期間 caret 可能閃一下（幾微秒）。
**結論**：可以跳過 HideCaret，但改善極小，風險不為零。保持現狀。

## 結論

**Caret 管理在 ScanAndDrawUda 內是最安全的位置。** 移動到 WndProc 在 v1/v2 已證實造成問題。v4 模式下 HideCaret 仍有用（防止 writeback 期間 caret 閃爍）。不建議變更。
