【发布时间】:2020-03-18 12:55:51
【问题描述】:
我已经玩了几个小时了,但我无法让它工作。我有一个由两个表格组成的应用程序,我想从一个表格切换到另一个表格。我希望这个开关“平滑”(即混合效果)。
我想出了这个部分可行的解决方案:在 ShowForm() 方法中使用 AnimateWindow 函数。当我从 Form1 切换到 Form2 时,这工作正常。但是切换回 Form1 不起作用。 Form1 被绘制在 Form2 的“后面”,当 Form2 隐藏时,过渡已经完成。
下面是Form1的非常简单的代码:
#include <vcl.h>
#pragma hdrstop
#include "main_form.h"
#include "child_form.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form2 -> Show();
Form1 -> Hide();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
const int speed = 1000;
AnimateWindow(Handle, speed, AW_BLEND);
}
这里是Form2的代码:
#include <vcl.h>
#pragma hdrstop
#include "child_form.h"
#include "main_form.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
Form1 -> Show();
Form2 -> Hide();
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormShow(TObject *Sender)
{
const int speed = 1000;
AnimateWindow(Handle, speed, AW_BLEND);
}
我试图在 Form2 的代码中反转 Form1->Show() 和 Form2->Hide()statements,以在绘制 Form1 之前强制隐藏 Form2,但它也不起作用:Form2 被隐藏,然后在动画期间什么都不显示,并且然后突然显示Form1。
有什么想法吗?
谢谢。
【问题讨论】:
-
在我的版本(XE7)的帮助下,据说不要直接使用
TAnimateWindowProc()。但无论如何,表单都有一个属性AlphaBlend,它启用/禁用表单的字母混合,以及一个随附的AlphaBlendValue。在循环中增加一个表单值 (0..255),同时减少另一个表单值 (255..0) 会给您想要的效果。两种形式都必须有Visible = True。 -
@TomBrunberg 感谢您的回复。我实际上在发布此解决方案之前尝试了此解决方案,但它也不起作用。实际上它工作一次。第一次创建每个表单时都可以,然后直接显示表单,没有任何混合。明天我将尝试使用此解决方案的示例代码编辑初始问题。但是,不能控制哪个表格在另一个表格前面确实令人沮丧。
-
在我的测试中,我在循环中更改了
AlphaBlendValue两种形式,您描述的问题并不那么明显。但它的效果是,由于这两种形式在过渡过程中都是部分透明的,所以后面的东西都会简单地显示出来。我知道你想避免这种情况。您在问题中提出的问题是由于 其中一种形式是主要形式。如果您可以重新排列以使您想要平滑交换的表单是“非主表单”,那么您可以在循环之前将任何表单都放在前面。 -
确实主要问题是其中一种形式是主要形式。我尝试创建一个空白的第三种形式作为主要形式,黑色背景,部分解决了这个问题。由于目前缺乏更好的解决方案,我会将其发布为答案。您也可以使用 AlphaBlendValue 作为问题的答案来发布您的代码吗?所以我可以检查一下我的区别吗?
标签: c++ c++builder vcl