RichEdit 控制項透過 EM_SETCHARFORMAT 訊息設定字元格式。CHARFORMAT 結構中 yOffset 欄位控制垂直偏移(單位:twip,1 twip = 1/1440 英吋):
typedef enum {
CFM_Superscript, // 上標
CFM_Subscript, // 下標
CFM_Normal // 一般
} TCharacterFormat;
void MySetCharFormat(TRichEdit* RichEdit, TCharacterFormat fmt) {
CHARFORMAT cf = {0};
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_OFFSET; // 僅修改垂直偏移
switch (fmt) {
case CFM_Superscript: cf.yOffset = 60; break; // 60 twip ≈ 1/24 吋
case CFM_Subscript: cf.yOffset = -60; break;
case CFM_Normal: cf.yOffset = 0; break;
}
// SCF_SELECTION: 套用至目前選取範圍
RichEdit->Perform(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject* Sender) { // 上標按鈕
MySetCharFormat(RichEdit1, CFM_Superscript);
}
void __fastcall TForm1::Button2Click(TObject* Sender) { // 下標按鈕
MySetCharFormat(RichEdit1, CFM_Subscript);
}
Ctrl+Shift++ 上標、Ctrl+= 下標(於 OnKeyDown 處理)CFM_SIZE 與 yHeightEM_GETCHARFORMAT 讀取 yOffset 判斷狀態,更新工具列按鈕按下狀態SCF_SELECTION 無效,建議檢查 SelLength > 0 或改用 SCF_WORD 套用至游標所在字詞RichEdit 2.0+ (riched20.dll) 完整支援,1.0 版功能受限