C++ Builder XE2随意学习 (1)

来源:岁月联盟 编辑:exp 时间:2012-02-03

编程N长时间了,Coding已成习惯,也是兴趣所在,一天不摸下键盘,仿佛总是少了点什么似的。

岁月是把杀猪刀,不单是催老了容颜,连学习新鲜知识的劲头也愈见低落,始终停留在Windows桌面应用程序编程,对管理系统相关知识尝试过,老是有点不温不火的状态。口口声声说是Borland的忠实粉丝,其实是为自己不愿或不能学习新东东找的一个借口。

时光荏冉,2012新年过了,龙年春节也过了,玛雅末日日渐逼近,再也找不到借口拖延时间。于是,老调新弹,“新年新气象”,准备学习,又开始计划。

计划什么呢,还是从自己感兴趣的入手吧。上网溜溜,居然发现C++ Builder版本已然发布到XE2!再看下介绍,N多新特性,N多新技术,哈,值得学习一下。尤其是FireMonkey,如此的炫。还支持GPU,很久以前就有想学GPU的冲动,这次一并解决了吧。

所以,这系列日志只是为我自己,写在博客里,谨为留念。

由于是从头开始学习C++ Builder XE2,其中观点仅为个人理解,严重的不权威,各位有选择地滤过。要是有人跟着走到沟里去了,概不负责哈。

 

决心是下了,写这一系列博文确实也需要一定时间。我也是一个很有中国特色的程序员,用别人的软件能不花钱就尽量不花钱,但自己编的程序,会花尽心思让用户掏银子,绑定硬盘、CPU、网卡等,让用户注册使用。在这里,这点小毛病又犯了,在网上写文章,被转载一大堆,感觉爽倒是爽,不过最后跟自己都没有什么关系。呃,必须扭转这个局面,借鉴一下图片水印,也就是说,在本系列BLOG文章中,里面的图片将印上我自己的水印。

 

怎么做呢,要么下载个软件,要么自己编个小程序。那当然是编个小程序的了,仅为写BLOG所用。从自己的需求来说,在WORD版本文档中,全是正常图片,但发到BLOG中时,会将这些图片复制出来,另存为图片文件。

 

OK,这个程序的使用方式就是,在程序中直接粘贴,就把剪贴板中图片信息直接加上水印,并自动保存到指定目录下。

 

开始编这个程序吧…

Coding...

 

没想到,居然断断续续花了两个小时才编好。又犯了程序员的通病,想做一个尽量好用的小工具,包括换肤、配置等,基本功能实现了,但还比较丑陋。

嗯,貌似C++ Builder XE2中,换肤是一件很容易的事,期待了解。

 

核心代码(没来得及写注释,应该能看明白):

if(Clipboard()->HasFormat(CF_BITMAP)) 
 

   Graphics::TBitmap * pBitmap = new Graphics::TBitmap; 
   pBitmap->Assign(Clipboard()); 
   Image_Canvas->Width = pBitmap->Width; 
   Image_Canvas->Height = pBitmap->Height; 
   Image_Canvas->Picture->Assign(pBitmap); 
   delete pBitmap; 
 
   TCanvas * canvas = Image_Canvas->Canvas; 
   canvas->Brush->Style = bsClear; 
   canvas->Font->Assign(Label_Font->Font); 
 
   int angle = 45, horz = 100, vert = 100; 
   try 
   { 
      angle = Edit_Angle->Text.ToInt(); 
      horz = Edit_Horz->Text.ToInt(); 
      vert = Edit_Vert->Text.ToInt(); 
   }catch(...) {} 
 
   UpdateFont(canvas, Label_Font->Font, 1, 1, 1, angle);   
   for(int x = 0; x < Image_Canvas->Width * 2; x += horz) 
      for(int y = 0; y < Image_Canvas->Height * 2; y += vert) 
         canvas->TextOut(x, y, Edit_Text->Text); 
 
   AnsiString bmpFileName = Edit_Path->Text; 
   if(!IsEndWith(bmpFileName, "//")) 
      bmpFileName += "//"; 
   CreateDirectory(bmpFileName); 
   for(int i = 1; ; ++i) 
   { 
      AnsiString tempFileName = Format("%scbw%d%s", 
         ARRAYOFCONST((bmpFileName.c_str(), i, ComboBox_PicType->Text.c_str()))); 
      if(!FileExists(tempFileName)) 
      { 
         bmpFileName = tempFileName; 
         break; 
      } 
   } 
   bmpFileName = ChangeFileExt(bmpFileName, ".BMP"); 
   Image_Canvas->Picture->SaveToFile(bmpFileName); 
   GlobalImageObject->OnCommand(Format("<request FileName='%s' Type='Set' />", 
      ARRAYOFCONST((bmpFileName.c_str())))); 
   GlobalImageObject->OnCommand(Format("<request Type='Set' ImageFormat='%s' />", 
      ARRAYOFCONST((ComboBox_PicType->Text.c_str())))); 
   if(!SameText(ComboBox_PicType->Text, ".bmp")) 
      DeleteFile(bmpFileName); 

else 
   ShowMessage("剪贴板中没有www.2cto.com图片信息,请重试!"); 
if(Clipboard()->HasFormat(CF_BITMAP)) { Graphics::TBitmap * pBitmap = new Graphics::TBitmap; pBitmap->Assign(Clipboard()); Image_Canvas->Width = pBitmap->Width; Image_Canvas->Height = pBitmap->Height; Image_Canvas->Picture->Assign(pBitmap); delete pBitmap; TCanvas * canvas = Image_Canvas->Canvas; canvas->Brush->Style = bsClear; canvas->Font->Assign(Label_Font->Font); int angle = 45, horz = 100, vert = 100; try { angle = Edit_Angle->Text.ToInt(); horz = Edit_Horz->Text.ToInt(); vert = Edit_Vert->Text.ToInt(); }catch(...) {} UpdateFont(canvas, Label_Font->Font, 1, 1, 1, angle); for(int x = 0; x < Image_Canvas->Width * 2; x += horz) for(int y = 0; y < Image_Canvas->Height * 2; y += vert) canvas->TextOut(x, y, Edit_Text->Text); AnsiString bmpFileName = Edit_Path->Text; if(!IsEndWith(bmpFileName, "//")) bmpFileName += "//"; CreateDirectory(bmpFileName); for(int i = 1; ; ++i) { AnsiString tempFileName = Format("%scbw%d%s", ARRAYOFCONST((bmpFileName.c_str(), i, ComboBox_PicType->Text.c_str()))); if(!FileExists(tempFileName)) { bmpFileName = tempFileName; break; } } bmpFileName = ChangeFileExt(bmpFileName, ".BMP"); Image_Canvas->Picture->SaveToFile(bmpFileName); GlobalImageObject->OnCommand(Format("<request FileName='%s' Type='Set' />", ARRAYOFCONST((bmpFileName.c_str())))); GlobalImageObject->OnCommand(Format("<request Type='Set' ImageFormat='%s' />", ARRAYOFCONST((ComboBox_PicType->Text.c_str())))); if(!SameText(ComboBox_PicType->Text, ".bmp")) DeleteFile(bmpFileName); } else ShowMessage("剪贴板中没有图片信息,请重试!");
 
 
 
 
 
运行后,选项设置界面:
 
 
 
  

 

/

 

复制图片,点击粘贴后

 

/

 

 

/

 

 

 图片文档自动命名保存在指定目录下

 

 

/

 已达到预期效果,不担心不负责任的转载了(www.2cto.com是个很负责的站)。准备开始写本系列文章有兴趣的朋友可加入群208894875进行深入沟通


摘自 ArWen的专栏