DrGraph图形博士

导航

DrGraph软件升级:实现最近使用文档功能

简要说明

  1. 最近使用文档

提交人

DrGraph 2013/04/23

处理状态

处理完毕

同步状态

 

现象

试图在软件中实现类似WORD2010的最近所用文件界面效果

定位及调试过程

  1. 首先找控件,该控件具备以下功能:左侧画出图标,右侧显示相应信息

    没找到

    后来一想,干脆画出

  1. 放置TPaintBox * PaintBox_RecentFiles,处理其OnPaint事件即可
  1. 在处理前,先加上数据成员

    vector<UnicodeString>FHistoryFiles;

    在打开图片文件或演示文件后,调用函数AddHistoryFile

    先简单实现之:

    void __fastcall TMainForm::AddHistoryFile(UnicodeString fileName) {

        // 加入历史文件

        if(find(FHistoryFiles.begin(), FHistoryFiles.end(), fileName) != FHistoryFiles.end())

            FHistoryFiles.erase(find(FHistoryFiles.begin(), FHistoryFiles.end(), fileName));

    FHistoryFiles.insert(FHistoryFiles.begin(), fileName);

    }

  1. 现在开始处理OnPaint事件

    先画出头部

    void __fastcall TMainForm::PaintBox_RecentFilesPaint(TObject *Sender) {

        TCanvas * canvas = PaintBox_RecentFiles->Canvas;

        canvas->Font->Assign(Label2->Font);

        canvas->Brush->Style = bsClear;

        int startX = 50, startY = 30;

        UnicodeString headerString = L"最近使用的图片文件";

        int wordHeight = canvas->TextHeight(headerString);

        canvas->TextOut(startX, startY, headerString);

        canvas->TextOut(PaintBox_RecentFiles->Width / 2 + startX, startY,

            L"最近使用的交流文件");

        startY += wordHeight + 20;

     

        Gdiplus::Graphics g(canvas->Handle);

        TColor color = (0xFFFFFF - Ribbon->ColorScheme->GetPartColor(rfspRibbonForm)

             ) / 2;

        Gdiplus::Pen * dotPen = CreateDotPen(color, 1);

        if (dotPen) {

            g.DrawLine(dotPen, startX, startY, PaintBox_RecentFiles->Width / 2 - 10,

                startY);

            g.DrawLine(dotPen, PaintBox_RecentFiles->Width / 2 + startX, startY,

                PaintBox_RecentFiles->Width - 10, startY);

        }

    }

  1. 下面开始画出各历史文件内容,主要内容为文件图标,文件名称,文件路径,如

  1. 画出图标

    画出图标可采用GdiPlus,代码很简单:

            Gdiplus::Graphics g(Canvas->Handle);

            g.DrawImage(FBitmap, Rect2RectF(r), 0, 0, FBitmap->GetWidth(),

                FBitmap->GetHeight(), Gdiplus::UnitPixel, NULL);

    关键是FBitmap中的内容从何而来。

    为什么选择Gdiplus::Bitmap而不是更通用的Image,因为立足于以下思路:

    内容唯一标识符就是文件名称,由此来确定图标、路径。图标如何确定?尤其是该文件并不是可执行文件或DLL时,怎么得到图标。

    这点可以参考WINDOWS的做法,取得关联的EXE或DLL程序就可以了。

    FindExecutable(ExeFileName.w_str(), NULL, exeFileName);

    可以达到这个目的。

    得到EXE或DLL,就可以取得图标:

    HICON hIcon = ExtractIcon(HInstance, ExeFileName.w_str(), 0);

    当然,下来有一种笨的办法,是把hIcon存盘,然后用Image读出,这肯定慢。所以,查一下构造函数,选用Bitmap,可以直接用HICON构造

    FBitmap = new Gdiplus::Bitmap(hIcon);

    这样即可画出。

  1. 输出文件名称和路径名,太EASY了

    Canvas->Font->Color = clBlack;

    Canvas->TextOut(Left + 80, Top, ExtractFileName(FFileName));

    Canvas->Font->Color = clGray;

        Canvas->TextOut(Left + 80, Top + 35, ExtractFilePath(FFileName));

    现在的效果:

  1. 处理鼠标事件,移动时变红显示(可以更改),点击时打开文件
  1. 最终效果

    2007Pink皮肤

    SpringTime皮肤

 

顺便把DrGraph软件的最近使用文件功能也实现一下:

posted on 2013-04-23 23:13  drgraph  阅读(235)  评论(0编辑  收藏  举报