窗体caption自绘失败,怎么搞

wangwei244157887 2014-08-02 02:29:29
重会以后,当我弹出一个窗体,遮挡一下自定义标题的窗体,上面写的字就没有了,请问该怎么弄呢,下面是写的代码

procedure TForm1.DrawCaption;
var
ACanvas: TCanvas;
begin

ACanvas := TCanvas.Create;
try
ACanvas.Handle := GetWindowDC(Form1.Handle);
with ACanvas do
begin
Brush.Color := clActiveCaption;
Font.Name := 'Arial';
Font.Size := 10;
Font.Color := clCaptionText;
Font.Style := [fsBold];
TextOut(GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CXBORDER),
Round((GetSystemMetrics(SM_CYCAPTION) - Abs(Font.Height)) / 2) + 1,
' SwissDelphiCenter');
end;
finally
ReleaseDC(Form1.Handle, ACanvas.Handle);
ACanvas.Free;
end;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
DrawCaption ;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
DrawCaption;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
DrawCaption ;
end;

procedure TForm1.WMMove(var Msg: TWMMove);
begin
inherited;
DrawCaption ;
end;

procedure TForm1.WMSetText(var Msg: TWMSetText);
begin
inherited;
DrawCaption ;
end;


请问该怎么该呢,才能让写的东西,不消失
...全文
187 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ksjxqy 2014-08-15
  • 打赏
  • 举报
回复
用PopupMenu弹出。现在的很多软件都没主菜单了,即使有,也默认隐藏。你都用主菜单这么老土的东西了,还搞什么自绘?
ksjxqy 2014-08-11
  • 打赏
  • 举报
回复
既然用了别的皮肤套件,就不要折腾非客户区和标准控件自绘了。基本上所有的皮肤控件都会用钩子修改默认绘制。窗口过程替换来替换去很容易出问题,需要美化标题栏的,建议用无边框窗口,自己摆放控件做假的标题栏,又稳定又简单。
「已注销」 2014-08-11
  • 打赏
  • 举报
回复
引用 10 楼 u011512342 的回复:
既然用了别的皮肤套件,就不要折腾非客户区和标准控件自绘了。基本上所有的皮肤控件都会用钩子修改默认绘制。窗口过程替换来替换去很容易出问题,需要美化标题栏的,建议用无边框窗口,自己摆放控件做假的标题栏,又稳定又简单。
如果这样子做的话,我的关闭按钮,最小化,最大化之类怎么放置呢,因为我假如我放置panel,肯定是在mainmenu下面啊,
「已注销」 2014-08-05
  • 打赏
  • 举报
回复
等待答案,希望在DEV皮肤里面试验一下
ksjxqy 2014-08-04
  • 打赏
  • 举报
回复
从你目前的水平看,还是别折腾自绘标题栏了.连基本的消息机制都不懂.
「已注销」 2014-08-04
  • 打赏
  • 举报
回复
刚才试验了一下,我添加了两个消息

   procedure WMNCPaint(var Message:TWMNCPaint);message WM_NCPAINT;
    procedure WMNCActivate(var Message:TWMNCActivate);message WM_NCACTIVATE;
在不带皮肤的DELPHI程序里面,可以实现,但是放到DEV皮肤里面,发现没用,我该怎么改呢
「已注销」 2014-08-04
  • 打赏
  • 举报
回复
引用 6 楼 u011512342 的回复:
从你目前的水平看,还是别折腾自绘标题栏了.连基本的消息机制都不懂.
水平是比较差,不好意思,呵呵,我拦截了这个消息,但还是不行

type
  TForm1 = class(TForm)
  private
    { Private declarations }
    procedure DrawCaption;
    procedure WMNCPaint(var Message:TWMNCPaint);message WM_NCPAINT;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.DrawCaption;
var
  ACanvas: TCanvas;
begin

  ACanvas := TCanvas.Create;
  try
    ACanvas.Handle := GetWindowDC(Self.Handle);
    with ACanvas do
    begin
      Brush.Color := clActiveCaption;
      Font.Name := 'Arial';
      Font.Size := 10;
      Font.Color := clCaptionText;
      Font.Style := [fsBold];
      TextOut(GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CXBORDER),
      Round((GetSystemMetrics(SM_CYCAPTION) - Abs(Font.Height)) / 2) + 1,
      ' SwissDelphiCenter');
    end;
  finally
    ReleaseDC(Self.Handle, ACanvas.Handle);
    ACanvas.Free;
  end;
end;

procedure TForm1.WMNCPaint(var Message: TWMNCPaint);
begin
  inherited ;
  DrawCaption;
end;
一弹出别的窗体,还是会把form的caption弄的消失掉
「已注销」 2014-08-03
  • 打赏
  • 举报
回复
引用 4 楼 u011512342 的回复:
画标题栏要响应WM_NCPAINT消息。还是把窗口设置成无边框,做个假的标题栏吧
procedure TForm1.FormPaint(Sender: TObject); begin DrawCaption; end; 上面这个事件是不是就是响应WM_NCPAINT呢?貌似也没用
ksjxqy 2014-08-03
  • 打赏
  • 举报
回复
画标题栏要响应WM_NCPAINT消息。还是把窗口设置成无边框,做个假的标题栏吧
「已注销」 2014-08-02
  • 打赏
  • 举报
回复
引用 1 楼 yangb0803 的回复:
应该是你的弹出窗体遮挡再消失后,自绘窗体并没有马上得到焦点,所以不能激活 FormActivate 事件
对的挡住的时候,自毁的就消失了,但是当窗体再次获得焦点,还是不会重绘制,怎么办呢
lhy 2014-08-02
  • 打赏
  • 举报
回复
你直接把画好的结果保存成位图,只要尺寸不变状态不变,重新贴一遍位图就可以了。
道玄希言 2014-08-02
  • 打赏
  • 举报
回复
应该是你的弹出窗体遮挡再消失后,自绘窗体并没有马上得到焦点,所以不能激活 FormActivate 事件

5,392

社区成员

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

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