本文介紹一個基於 MFC 對話框的電子印章生成小工具,支援自定義印章文字、半徑、字體、顏色、五角星顯示等參數,即時預覽並匯出 BMP 圖片。適用於學習 GDI 繪圖、LOGFONT/LOGPEN/LOGBRUSH 結構、雙緩衝防閃爍、位圖檔案儲存等核心技術。
DrawSeal() 繪製外圓、DrawSealText() 繪製圓弧文字、DrawTri() 繪製五角星CBitmap → Picture Control.SetBitmap() 顯示BITMAPFILEHEADER/BITMAPINFOHEADER)void CMakeSealDlg::DrawSeal(CDC *MemDC) {
int cx = 100, cy = 100;
POINT point = {5, 5};
LOGPEN logPen;
logPen.lopnColor = ChooseColor(&m_nRadioColor);
// 繪製背景(透明筆刷)
logPen.lopnStyle = PS_NULL;
logPen.lopnWidth = point;
MemDC->SelectObject(CPen::FromHandle(CreatePenIndirect(&logPen)));
MemDC->SelectObject(CBrush::FromHandle(CreateBrushIndirect(&LOGBRUSH{BS_HOLLOW, RGB(255,0,0), 0})));
MemDC->Rectangle(0, 0, 200, 200);
// 繪製外圓(實線筆刷)
logPen.lopnStyle = PS_SOLID;
MemDC->SelectObject(CPen::FromHandle(CreatePenIndirect(&logPen)));
MemDC->Ellipse(cx - m_nRadius, cy - m_nRadius, cx + m_nRadius, cy + m_nRadius);
}
void CMakeSealDlg::CreateBmp(CBitmap *bitmap) {
CClientDC dc(this);
CDC MemDC;
bitmap->CreateCompatibleBitmap(&dc, 198, 198);
MemDC.CreateCompatibleDC(&dc);
CBitmap* pOldBmp = MemDC.SelectObject(bitmap);
// 繪製所有元素
DrawSeal(&MemDC);
DrawSealText(&MemDC);
DrawSubText1(&MemDC);
DrawSubText2(&MemDC);
if (m_bShowTri) DrawTri(&MemDC);
MemDC.SelectObject(pOldBmp);
MemDC.DeleteDC();
}
void CMakeSealDlg::UpdateShow() {
m_pBitmap.DeleteObject(); // 釋放舊位圖
CreateBmp(&m_pBitmap); // 重新繪製
m_picture.SetBitmap((HBITMAP)m_pBitmap.Detach()); // 顯示於 Picture Control
}
void CMakeSealDlg::OnChangeMainWidth() {
UpdateData(TRUE);
CSpinButtonCtrl* pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_MAIN_WIDTH);
pSpin->SetPos(m_nMainWidth);
UpdateShow(); // 參數變更即時重繪預覽
}
| 技術點 | 關鍵類/結構 | 說明 |
|---|---|---|
| 字體旋轉與定位 | LOGFONT.lfEscapement, lfOrientation | 以 0.1 度為單位設定字體輸出角度,配合 SetTextAlign(TA_BASELINE|TA_CENTER) 實現圓弧排版 |
| 筆刷與畫筆樣式 | LOGPEN, LOGBRUSH | PS_NULL 空畫筆(不繪製邊框)、BS_HOLLOW 空心筆刷(透明填充) |
| 雙緩衝防閃爍 | CDC::CreateCompatibleDC, CBitmap::CreateCompatibleBitmap | 離屏繪圖後一次性 BitBlt 到螢幕/控件 |
| BMP 檔案格式 | BITMAPFILEHEADER, BITMAPINFOHEADER | 小端序寫入,注意行對齊 (4 位元組倍數) |
這個小工具雖簡單,但完整串聯了 GDI 繪圖核心流程:參數建模 → 記憶體 DC 離屏渲染 → 雙緩衝預覽 → 檔案落地。是 VC++ 初學者掌握圖形程式設計、資源管理(DeleteObject/Detach)、UI 即時回饋的優秀練習專案。