我需要编写一个应用程序,在应用程序的两个实例中显示两个不同的图片。这些图片必须看起来好像是并排放在同一窗口的画布上,但由于内部原因,它必须是两个不同的应用程序而不是单个应用程序。无论用户的Windows设置是什么,有没有办法关闭窗口框架?我仍然想保留标题栏和关闭/最小化/最大化按钮。
如果两个(或多个)窗口看起来像用户一样做出反应,则会获得奖励积分。
一个Delphi的例子会很好但是我可以做一些关于使用Win32 API设置哪些标志或其他东西的提示(请不要使用dotNET)。
答案 0 :(得分:4)
由于标题栏的窗口始终有边框,因此您的下一个选项是创建一个无边框窗口,然后自己在窗口顶部绘制标题栏。这也意味着处理鼠标消息。从wm_NCHitTest
开始。要创建无边框窗口,请覆盖表单的CreateParams
方法并设置Style
字段,以便没有边框。
答案 1 :(得分:1)
这会创建一个没有边框或底边框的表单:
type
TForm1 = class(TForm)
private
FBorderWidth: Integer;
FTitleHeight: Integer;
procedure AppRestored(Sender: TObject);
procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE;
procedure WMNCPaint(var Message: TWMNCPaint); message WM_NCPAINT;
protected
procedure Resize; override;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.AppRestored(Sender: TObject);
begin
Repaint;
end;
procedure TForm1.Resize;
begin
inherited Resize;
if FBorderWidth = 0 then
begin
FBorderWidth := (Width - ClientWidth) div 2;
FTitleHeight := Height - ClientHeight - FBorderWidth;
Application.OnRestore := AppRestored;
end;
Invalidate;
end;
procedure TForm1.WMNCCalcSize(var Message: TWMNCCalcSize);
begin
inherited;
with Message.CalcSize_Params^ do
begin
Dec(rgrc[0].Left, FBorderWidth);
Inc(rgrc[0].Right, FBorderWidth);
Inc(rgrc[0].Bottom, FBorderWidth);
end;
end;
procedure TForm1.WMNCPaint(var Message: TWMNCPaint);
begin
DeleteObject(Message.RGN);
Message.RGN := CreateRectRgn(Left, Top, Left + Width, Top + FTitleHeight);
inherited;
end;