本例的運行結果圖如下
一、功能與原理
學習VC也沒多久,將我做的這個小工具和大家分享一下。其主要功能就是可以自定義生成公章圖形並保存為bmp圖片,希望對大家有點用。具體實現的方法如下:
步驟一:生成對話框工程,並加入相應的控件,圖片的顯示使用Picture控件;
步驟二:定義生成圖形所需要的參數;
步驟三:通過參數定義,生成對應的Bitmap,再在Picture控件中顯示該位圖,具體實現參看源程序。
步驟四:將生成的Bitmap保存為位圖文件。
二、程序實現的關鍵點
(一)、需要對LOGFONT、LOGPEN和LOGBRUSH結構很了解,並能靈活應用,特別是在排列字體的過程中,對字體的旋轉角度以及定位點的設置。
//繪制圖章基本圖形
void CMakeSealDlg::DrawSeal(CDC * MemDC)
{
int cx = 100;
int cy = 100;
POINT point;
point.x = point.y = 5;
LOGPEN logPen;
logPen.lopnColor = ChooseColor(&m_nRadioColor);
//繪制背景
logPen.lopnStyle = PS_NULL;
logPen.lopnWidth = point;
(*MemDC).SelectObject(CreatePenIndirect(&logPen));
(*MemDC).Rectangle(0,0,200,200);
//設置繪筆
logPen.lopnStyle = PS_SOLID;
(*MemDC).SelectObject(CreatePenIndirect(&logPen));
//設置填充
LOGBRUSH logBrush;
logBrush.lbStyle = BS_HOLLOW;
logBrush.lbColor = RGB(255, 0, 0);
(*MemDC).SelectObject(CreateBrushIndirect(&logBrush));
//繪制外圓
(*MemDC).Ellipse(cx - m_nRadius, cy - m_nRadius, cx + m_nRadius, cy + m_nRadius);
}
(二)、在顯示預覽時,通過使用 Picture 控件對內存中Bitmap的調用,可有效地防止因重繪造成的屏幕閃爍。
(1)創建位圖
void CMakeSealDlg::CreateBmp(CBitmap *bitmap)
(2)改變參數調用重繪函數
{
CClientDC dc(this);
//設置內存中CDC
CDC MemDC;
//創建相容的Bitmap和DC
bitmap->CreateCompatibleBitmap(&dc, 198, 198);
MemDC.CreateCompatibleDC(&dc);
MemDC.SelectObject(bitmap);
//在內存DC中繪制圖章
DrawSeal(&MemDC);
DrawSealText(&MemDC);
DrawSubText1(&MemDC);
DrawSubText2(&MemDC);
//判斷是否繪制五角星
if(m_bShowTri)
{
DrawTri(&MemDC);
}
//將創建圖片保存在內存中
MemDC.SelectObject(bitmap);
MemDC.DeleteDC();
}//改變主字體寬度
(3) 重繪picture
void CMakeSealDlg::OnChangeMainWidth()
{
UpdateData(TRUE);
CSpinButtonCtrl*pSpin= (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_MAIN_WIDTH);
pSpin->SetPos(m_nMainWidth);
UpdateShow( );
}void CMakeSealDlg::UpdateShow()
{
//刪除過期的圖形
m_pBitmap.DeleteObject();
//創建新的圖形
CreateBmp(&m_pBitmap);
//在picture控件中顯示位圖
m_picture.SetBitmap((HBITMAP)m_pBitmap.Detach());
}
(三)、保存位圖文件詳細見源文件,網上有很多詳細的介紹,也可以參看MSDN,這裡就不多講了。
三、總結
這是我用VC做的第一個小程序,中間難免會有一些錯誤,另外保存圖片的類型還沒有完善,感興趣的朋友也可繼續擴展。總的來說,這個程序在邏輯字體、Spin控件、位圖的應用上做了一個總體的概括,比較適合像我這樣的新手借鑒學習。赫赫,有什麼問題也可以給我來信聯系 。
本文配套源碼