Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9726777
  • 博文数量: 1227
  • 博客积分: 10026
  • 博客等级: 上将
  • 技术积分: 20273
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-16 12:40
文章分类

全部博文(1227)

文章存档

2010年(1)

2008年(1226)

我的朋友

分类: C/C++

2008-03-11 17:49:20

本例的运行结果图如下

一、功能与原理
    学习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控件、位图的应用上做了一个总体的概括,比较适合像我这样的新手借鉴学习。赫赫,有什么问题也可以给我来信联系 。


阅读(1889) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~