C++ Builder XE2随意学习 (1)
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("剪贴板中没有图片信息,请重试!");
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("剪贴板中没有图片信息,请重试!");
运行后,选项设置界面:
复制图片,点击粘贴后
图片文档自动命名保存在指定目录下