• 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软件的最近使用文件功能也实现一下:

  • 相关阅读:
    Install Edge Browser to RedHat Linux 7.7
    Beam简介
    Beam Schema定义
    Beam Pipeline的几种模式
    centos 查询磁盘空间占用情况 以及Can't create/write to file '/tmp/#sql_1f98_0.MYI' (Errcode: 28)
    Caused by: org.flywaydb.core.api.FlywayException: Validate failed: Migration checksum mismatch for migration 1 -> Applied to database
    SSTI学习
    2020/11/22周总结
    2020/11/15周总结
    2020/11/08周总结
  • 原文地址:https://www.cnblogs.com/drgraph/p/3039227.html
Copyright © 2020-2023  润新知