Я знаю, что видел этот вопрос раньше, но ответы были неубедительными или неудовлетворительными (из того, что я мог видеть), поэтому я хотел бы изложить мою ситуацию здесь. Я создаю программу с настраиваемой рамкой формы (т. Е. Form Border Style = None с нашими собственными элементами управления вокруг нее). Программа не имеет анимации свертывания / закрытия, а просто привязывается.
Это форма .NET (с использованием C ++ / CLR) — что я могу сделать? Я видел, как это делают другие программы (например, в Photoshop CS6 / CC есть анимация восстановления, но не анимация минимизации).
Есть ли свойство / стиль, который я могу применить, переопределив CreateParams? Я играю за «хакерские» методы, но изменение стиля границы формы таким образом, чтобы пользователь мог временно видеть границу, здесь не подходит.
Заранее спасибо.
Я использовал собственную анимацию и решил поделиться соответствующим кодом. Следующее переопределение WndProc ловит, минимизирует / восстанавливает (в том числе от щелчка / двойного щелчка на панели задач). Имейте в виду, что установка WindowState НЕ БУДЕТ вызывать это — вы должны вручную отправить SC_MINIMIZE lpa с WM_SYSCOMMAND в окно (или вручную анимировать его). Весь код анимации, включая таймер, приведен ниже.
//Define a variable so it knows what animation is happening
short fade_mode = 0; //0 is fade in, 1 is minimize, 2 is close
short close_on_close = FALSE; //a variable to tell the close handler to re-animate or not - this allows this->Close(); to trigger the animation but avoids a loop.
//The WndProc
protected: virtual void WndProc(System::Windows::Forms::Message% msg) override {
switch (msg.Msg) {
case WM_SYSCOMMAND:
switch (msg.WParam.ToInt32()) {
case SC_MINIMIZE:
msg.Result = IntPtr::Zero;
fade_mode = 1;
fadetimer->Start();
return;
break;
}
break;
case WM_ACTIVATE: {
if (HIWORD(msg.WParam.ToInt32()) == 0) { //because non-zero wpa here means the form is minimized
this->WindowState = FormWindowState::Normal;
fade_mode = 0;
fadetimer->Start();
msg.Result = IntPtr::Zero;
return;
}
}
}
Form::WndProc(msg);
}//The button event handlers
private: System::Void btn_close_Click(System::Object^ sender, System::EventArgs^ e) {
this->Close();
}
private: System::Void btn_minimize_Click(System::Object^ sender, System::EventArgs^ e) {
SendMessage(HWND(this->Handle.ToPointer()), WM_SYSCOMMAND, SC_MINIMIZE, NULL);
}
//The event animation code itself (set to a tick of 10ms) and the form closing handler:
private: System::Void fadetimer_Tick(System::Object^ sender, System::EventArgs^ e) {
if (this->IsDisposed == true) { //In the event that the form opened/closed quickly and has not stopped properly, clean up to avoid crashes.
fadetimer->Stop();
return;
}
switch (fade_mode) {
case 0: //fading in
if (this->Opacity < 1)
this->Opacity += 0.2;
else {
fade_mode = -1;
fadetimer->Stop();
}
break;
case 1: //minimizing
if (this->Opacity > 0)
this->Opacity -= 0.2;
else {
fade_mode = -1;
fadetimer->Stop();
this->WindowState = Windows::Forms::FormWindowState::Minimized;
}
break;
case 2: //closing
if (this->Opacity > 0)
this->Opacity -= 0.2;
else {
fade_mode = -1;
fadetimer->Stop();
close_on_close = TRUE;
this->Close();
}
break;
}
}
private: System::Void loginform_FormClosing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e) {
if (close_on_close == FALSE) {
e->Cancel = true;
fade_mode = 2;
fadetimer->Start();
}
}
Обязательно установите непрозрачность вашей формы на 0% по умолчанию — она должна автоматически исчезать, когда она впервые создается / показывается (моя делает, я не могу вспомнить, если я сделала что-то еще, что делает это так).