首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

VC++ 實作自定義電子印章生成工具:從參數配置到 BMP 輸出完整指南

     編輯:關於VC++

前言

本文介紹一個基於 MFC 對話框的電子印章生成小工具,支援自定義印章文字、半徑、字體、顏色、五角星顯示等參數,即時預覽並匯出 BMP 圖片。適用於學習 GDI 繪圖、LOGFONT/LOGPEN/LOGBRUSH 結構、雙緩衝防閃爍、位圖檔案儲存等核心技術。

功能架構與實作流程

  1. 對話框介面:Picture Control 預覽 + Spin Control 參數調整 + 色彩選擇 + 匯出按鈕
  2. 參數模型:封裝印章幾何參數(半徑、寬度)、文字參數(字體、大小、旋轉角度)、顏色參數
  3. 繪圖核心:DrawSeal() 繪製外圓、DrawSealText() 繪製圓弧文字、DrawTri() 繪製五角星
  4. 雙緩衝預覽:記憶體 DC 繪圖 → CBitmap → Picture Control.SetBitmap() 顯示
  5. BMP 匯出:標準 BMP 檔案頭寫入(參考 MSDN BITMAPFILEHEADER/BITMAPINFOHEADER)

關鍵程式碼片段解析

1. 印章基礎圖形繪製

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);
}

2. 記憶體位圖建立與雙緩衝預覽

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
}

3. Spin 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, LOGBRUSHPS_NULL 空畫筆(不繪製邊框)、BS_HOLLOW 空心筆刷(透明填充)
雙緩衝防閃爍CDC::CreateCompatibleDC, CBitmap::CreateCompatibleBitmap離屏繪圖後一次性 BitBlt 到螢幕/控件
BMP 檔案格式BITMAPFILEHEADER, BITMAPINFOHEADER小端序寫入,注意行對齊 (4 位元組倍數)

擴展建議

  • 支援 PNG/JPEG 輸出(引入 GDI+ 或 libpng/libjpeg)
  • 增加印章邊緣磨損、墨跡擴散等真實感效果
  • 支援向量格式 (SVG/EMF) 匯出,實現無損縮放
  • 整合數位簽章時間戳、防偽碼等電子簽名合規功能

總結

這個小工具雖簡單,但完整串聯了 GDI 繪圖核心流程:參數建模 → 記憶體 DC 離屏渲染 → 雙緩衝預覽 → 檔案落地。是 VC++ 初學者掌握圖形程式設計、資源管理(DeleteObject/Detach)、UI 即時回饋的優秀練習專案。

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