核心技術難點
- 氣泡佈局:左右對齊、尖角繪制、自適應寬度(最大寬度限制)、多行文本/圖片/語音/視頻/文件混排。
- 富文本渲染:表情符號(圖片內嵌)、@提及高亮、鏈接可點擊、代碼塊、Markdown 子集支持。
- 虛擬化列表:數萬條消息流暢滾動、新消息滑動定位、圖片異步加載佔位。
- 自定義繪制:`TPaintBox`/`TCanvas` 手繪氣泡背景、尖角、狀態圖標(發送中/已讀/失敗)。
成熟開源參考項目
- DWFLT 開發者社區經典帖:
Delphi 實現類 QQ 聊天窗口完整源碼
包含:消息實體類、氣泡繪制單元、虛擬列表邏輯、表情面板、圖片預覽、語音播放。
- GitHub Delphi-Chat-UI:
搜索關鍵字 `Delphi chat bubble`、`Delphi RichEdit emoji`,近年有基于 FireMonkey (FMX) 跨平台實現。
- 商業級組件庫:
- TMS Software:`TAdvChat`、`TAdvRichEditor` (收費,功能極全)。
- Raize Components:`RzChat`、`RzRichEdit`。
- DevExpress VCL:`cxRichEdit` + 自定義 `cxGrid` 實現聊天列表。
自研最小原型關鍵點
// 消息實體
TChatMessage = class
MsgType: (mtText, mtImage, mtVoice, mtFile, mtSystem);
Content: string; // 文本/圖片路徑/文件路徑
Align: (alLeft, alRight); // 我發送/對方發送
Time: TDateTime;
Status: (stSending, stSent, stRead, stFailed);
end;
// 氣泡繪制 (OnPaint)
procedure DrawBubble(Canvas: TCanvas; Rect: TRect; Msg: TChatMessage);
var
R: TRect;
Path: TPathData;
begin
// 1. 計算文本/圖片實際寬高 (DrawTextEx DT_CALCRECT)
// 2. 構建氣泡路徑:圓角矩形 + 三角形尖角 (根據 Align 決定左/右)
// 3. 填充背景色 (我方綠/對方白/灰)
// 4. 繪制文本/圖片 (支持表情圖片內嵌)
// 5. 繪制時間戳/狀態圖標
end;
避坑指南
- 不要用 TLabel/TMemo 逐條創建控件:幾百條消息即卡死,必須**虛擬列表 + 自繪** 或 **FMX ListView + ItemAppearance 自定義**。
- 表情包方案:文本中用佔位符 `[em:001]`,繪制時解析替換為 `TImage`/`TBitmap` 繪製在 Canvas 上,而非真控件。
- 圖片異步加載:`TThread.CreateAnonymousThread` + `TBitmap.LoadFromFile` → 主線程 `Queue` 刷新對應 Item。
- 高 DPI 適配:所有坐標/字體大小乘以 `Screen.PixelsPerInch / 96` (VCL) 或直接用 FMX 內建縮放。
參考 DWFLT 經典源碼 + 現代 FMX 虛擬列表模式,Delphi 也能打造流暢 QQ 風聊天窗口。