richeedit保存bmp图片的问题

yct0605 2019-09-19 07:38:38
用richeedit编辑文字信息,然后保存成bmp图片,保存时有保存路径和名称对话框,发现有的时候图片显示的内容会被保存对话框干扰,求解决方法!

原文字信息


保存对话框有时候会干扰图片保存


异常图片



保存代码

procedure TFrmSaveBmp.SaveButtonClick(Sender: TObject);
var
can: TCanvas;
bmp: TBitmap;
begin
//////////////////////////////////////////////////////////////////////////////
if SaveDialog.Execute then
begin
if FileExists(SaveDialog.FileName) then
if Application.MessageBox(PChar(Format(sOverWrite, [SaveDialog.FileName])),'提示',MB_YESNOCANCEL+MB_ICONINFORMATION)<>idyes then Exit;

can := TCanvas.Create;
bmp := TBitmap.Create;
try
bmp.Width := Editor.Width;
bmp.Height := Editor.Height;
bmp.PixelFormat:=pfDevice;
bmp.PixelFormat:=pf8bit;
can.Handle := GetDC(Editor.Handle);
bmp.Canvas.CopyRect(Rect(0,0,Editor.Width,Editor.Height),can,Editor.ClientRect);
bmp.SaveToFile(SaveDialog.FileName);
finally
bmp.Free;
can.Free;
end;
SetFileName(SaveDialog.FileName);
Editor.Modified := False;
SetModified(False);
end;
end;
...全文
168 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
yct0605 2019-09-28
  • 打赏
  • 举报
回复
引用 2 楼 天行归来 的回复:
是在什么情况下会被遮挡,我测试了几次都不会。dc指向的是editor,如果指向DeskTop,遮挡是正常。 试试看以下方式会不会出现遮挡。

var
  //can: TCanvas;
  bmp: TBitmap;
begin
  //////////////////////////////////////////////////////////////////////////////
  if SaveDialog.Execute  then
  begin
    if FileExists(SaveDialog.FileName) then
      if Application.MessageBox(PChar(Format(sOverWrite, [SaveDialog.FileName])),'提示',MB_YESNOCANCEL+MB_ICONINFORMATION)<>idyes then Exit;

      //can := TCanvas.Create;
      bmp := TBitmap.Create;
      try
        //can.Handle := GetDC(Editor.Handle);
        bmp.Width  := Editor.Width;
        bmp.Height := Editor.Height;
        bmp.PixelFormat:=pfDevice;
        bmp.PixelFormat:=pf8bit;
        BitBlt(bmp.Canvas.Handle,0,0,bmp.Width,bmp.Height,GetDC(Editor.Handle),0,0,SRCCOPY);
        //bmp.Canvas.CopyRect(Rect(0,0,Editor.Width,Editor.Height),can,Editor.ClientRect);
        bmp.SaveToFile(SaveDialog.FileName);
      finally
        bmp.Free;
        //can.Free;
      end;
    Editor.Modified := False;
  end;
也不是每次都会出现,偶尔也会出现,现在基本上确定是弹出对话框的问题。先用你的方法试一下
天行归来 2019-09-20
  • 打赏
  • 举报
回复
是在什么情况下会被遮挡,我测试了几次都不会。dc指向的是editor,如果指向DeskTop,遮挡是正常。 试试看以下方式会不会出现遮挡。

var
  //can: TCanvas;
  bmp: TBitmap;
begin
  //////////////////////////////////////////////////////////////////////////////
  if SaveDialog.Execute  then
  begin
    if FileExists(SaveDialog.FileName) then
      if Application.MessageBox(PChar(Format(sOverWrite, [SaveDialog.FileName])),'提示',MB_YESNOCANCEL+MB_ICONINFORMATION)<>idyes then Exit;

      //can := TCanvas.Create;
      bmp := TBitmap.Create;
      try
        //can.Handle := GetDC(Editor.Handle);
        bmp.Width  := Editor.Width;
        bmp.Height := Editor.Height;
        bmp.PixelFormat:=pfDevice;
        bmp.PixelFormat:=pf8bit;
        BitBlt(bmp.Canvas.Handle,0,0,bmp.Width,bmp.Height,GetDC(Editor.Handle),0,0,SRCCOPY);
        //bmp.Canvas.CopyRect(Rect(0,0,Editor.Width,Editor.Height),can,Editor.ClientRect);
        bmp.SaveToFile(SaveDialog.FileName);
      finally
        bmp.Free;
        //can.Free;
      end;
    Editor.Modified := False;
  end;
  • 打赏
  • 举报
回复
简单的方法:先保存图片,再弹出对话框
复杂的方法:给richedit发一个EM_FORMATRANGE消息,让它自己绘制到一个DC上,比如Bitmap.Canvas,这个支持多页/当前不可见区域绘制

5,391

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧