以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  一个生成公章图片地简易工具  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=61477)


--  作者:卷积内核
--  发布时间:4/17/2008 2:23:00 PM

--  一个生成公章图片地简易工具
本例的运行结果图如下

按此在新窗口浏览图片

一、功能与原理
    学习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)

{

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

}


(2)改变参数调用重绘函数
//改变主字体宽度

void CMakeSealDlg::OnChangeMainWidth()

{

   UpdateData(TRUE);

  CSpinButtonCtrl*pSpin= (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_MAIN_WIDTH);

   pSpin->SetPos(m_nMainWidth);

   UpdateShow( );

}


(3) 重绘picture
void CMakeSealDlg::UpdateShow()

{

       //删除过期的图形

       m_pBitmap.DeleteObject();

       //创建新的图形

    CreateBmp(&m_pBitmap);

       //在picture控件中显示位图

       m_picture.SetBitmap((HBITMAP)m_pBitmap.Detach());

}


(三)、保存位图文件详细见源文件,网上有很多详细的介绍,也可以参看MSDN,这里就不多讲了。
三、总结       

    这是我用VC做的第一个小程序,中间难免会有一些错误,另外保存图片的类型还没有完善,感兴趣的朋友也可继续扩展。总的来说,这个程序在逻辑字体、Spin控件、位图的应用上做了一个总体的概括,比较适合像我这样的新手借鉴学习。


--  作者:hmpzz
--  发布时间:4/18/2008 4:29:00 PM

--  
不错噢,入门的好东东,可是为什么我下不来??

已经下来了,谢谢楼主的共享


--  作者:para_zhang
--  发布时间:4/26/2008 10:40:00 PM

--  
l楼主太有才了
下载了,很欣赏,谢谢楼主
--  作者:sytyong
--  发布时间:5/4/2008 10:20:00 PM

--  
顶 虽然是个小程序 但楼主能拿出来共享 值得学习
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
61.996ms