【问题标题】:How can I get a TEdit's canvas in Delphi?如何在 Delphi 中获得 TEdit 的画布?
【发布时间】:2016-03-11 05:18:16
【问题描述】:

我想缩短文件名以适应 TEdit,例如

Edit1.Text := MinimizeName(FileName, Edit1.Canvas, Edit1.Width);

不幸的是,这无法编译,因为 TEdit 确实直接具有 Canvas 属性。画布的字体度量是必需的。 如何访问 TEdit 的画布?

MinimizeName 在 Vcl.FileCtrl 中声明。)

【问题讨论】:

    标签: delphi delphi-xe8 tcanvas


    【解决方案1】:

    由于画布仅用于获取指标,如果假设 TEdit 指标与表单指标相同,则在 MinimizeName 调用中使用表单画布就足够了。除非有理由导致指标不同,否则这更简单且有效。

    【讨论】:

      【解决方案2】:

      您可以使用TControlCanvas。您还应该考虑控件的字体。

      例如:

      var
        Canvas: TControlCanvas;
      
      Canvas := TControlCanvas.Create;
      try
        Canvas.Control := Edit1;
        Canvas.Font.Assign(Edit1.Font); 
      
        // Do something with Canvas... 
      finally
        Canvas.Free;
      end;
      

      【讨论】:

      • 好主意,但不能包装在接收 TWinControl 作为参数的函数中,因为 Font 属性未在 TWinControl 中公开。所以,我们只是将一个问题(画布无法访问)换成另一个问题(字体无法访问)。
      【解决方案3】:

      好的,我找到了。有兴趣的朋友:

      procedure TForm1.Button1Click(Sender: TObject);  
      var  
        aCanvas: TCanvas;  
      begin  
        if FileOpenDialog1.Execute then begin  
          aCanvas := TCanvas.Create;  
          try  
            aCanvas.Handle := GetDC(Edit1.Handle);  
            Edit1.Text := MinimizeName(FileOpenDialog1.FileName, aCanvas, Edit1.Width - 8);  
          finally  
            ReleaseDC(Edit1.Handle, aCanvas.Handle);
            aCanvas.Free;  
          end;  
        end;  
      end;
      


      【讨论】:

      • 您还需要在使用完毕后致电ReleaseDC。您还应该考虑在启动时创建它,并在关闭时释放它。更重要的是,你应该只在 Windows 通过WM_PAINT 消息告诉你的情况下进行绘制,否则 Windows 只会在你绘制的内容上重新绘制。
      • @Jerry 关于 ReleaseDC 的好点,虽然我不同意在启动时获取句柄:您不应该分配内存超过所需的时间。另外,我不需要 WM_PAINT;就像我在我的 OP 中所说的那样,我只需要用于字体度量的画布。我将文件名分配给 TEdit 的 text 属性,然后 VCL 负责绘画。
      • 这不准确,如果您希望它准确,您需要选择编辑的字体到设备上下文。
      • @djsoft 看起来确实更简单,但出现运行时错误“Canvas 不允许绘图”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-03
      • 2016-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多