Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Системные сообщения, или ShowModal без ShowModal 
V
    Опции темы
cyberstream
Дата 26.9.2006, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 7.9.2006

Репутация: 2
Всего: 4



Hello, ALL !!! Озадачился сегодня следующим:
Создаём пункт системного меню
Код

    hSystemMenu = GetSystemMenu(Handle, false);
    AppendMenu(hSystemMenu, MF_SEPARATOR, 0, "");
    AppendMenu(hSystemMenu, MF_STRING, SC_UserItem, "&Условие задачи");
 при клике на коем вызывается 2-я форма: 
Код

void __fastcall TForm1::WMSysCommand(TWMSysCommand& Msg)
{   if (Msg.CmdType == SC_UserItem) FormTask->ShowWnd(Form1);
     DefWindowProc(Handle,WM_SYSCOMMAND,Msg.CmdType, MAKELPARAM(Msg.XPos,Msg.YPos));
  Msg.Result=0;
}
 центрируется по главному окну
Код

void __fastcall TFormTask::ShowWnd(TForm *MainForm)
{   Top=MainForm->Top+MainForm->Height/2-Height/2;
   Left=MainForm->Left+MainForm->Width/2-Width/2;
   Show();
}
 и вылазит. Деактивируясь закрывается в стиле fade
Код

void __fastcall TFormTask::FormDeactivate(TObject *Sender)
{ // SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0,
    //               SWP_NOMOVE + SWP_NOSIZE);
      while (AlphaBlendValue!=0)
             AlphaBlendValue--;
//      SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0,
  //                 SWP_NOMOVE + SWP_NOSIZE);
 Close(); }
 Закомментированные строки придавали окну во время fading статус "Поверх всех", иначе оно перекроется главным, и эффект не виден (ShowModal не использовал - не позволяет деактивировать, кликать вне окна). Если раскомментрировать, то всё идёт как надо, НО, главное окно не становится активным, кнопки не отвечают на клики, окно можно только таскать, свернуть, ... Идёт непрерывное обращение к 
Код

        BEGIN_MESSAGE_MAP
        MESSAGE_HANDLER(WM_SYSCOMMAND,TWMSysCommand,WMSysCommand);
        END_MESSAGE_MAP(TComponent); 

Где копнуть, что упустил?
--------------------
Не знаешь кого спросить? - Спроси google!
PM MAIL   Вверх
Vyacheslav
Дата 26.9.2006, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Main form
Код

#include <vcl.h>
#pragma hdrstop

#include "Unit6.h"
#include "Unit7.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Form2Click(TObject *Sender)
{
    new TForm2(this)->Show();
}
//--------------------------------------------------------------------------


  
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit7.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormDeactivate(TObject *Sender)
{

     while (AlphaBlendValue--);
    Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
    Action = caFree;
}
//---------------------------------------------------------------------------





--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Vyacheslav
Дата 26.9.2006, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Виноват. Забыл указать для Form2 установить
FormStyle = fsStayOnTop(всегда по верху)
Postion = poOwnerFormCenter (по центру окна владельца)




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
cyberstream
Дата 27.9.2006, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 7.9.2006

Репутация: 2
Всего: 4



Действительно, всё гениальное просто. Преогромный thanks, Vyacheslav !!   smile 

Вот только:
  1. У вас работает изящная конструкция вида 
Код

while (AlphaBlendValue--);
 ? У меня ругается 
Код

Е2369 Cannot use the result of a property assignment as an rvalue
 Обидно !!  smile 
  2.Если у формы AlphaBlend=false; (чтобы не тормозило при Resize, Move...), 
Код

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{   AlphaBlend=true; 
    AlphaBlendValue=255;
    while (AlphaBlendValue>0)
           AlphaBlendValue--;

}
 При этом форма чернеет, и её чёрный прямоугольник fade-ится. Что за глюк? Как лечить?
--------------------
Не знаешь кого спросить? - Спроси google!
PM MAIL   Вверх
dumb
Дата 27.9.2006, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



Цитата(cyberstream @  27.9.2006,  16:56 Найти цитируемый пост)
AlphaBlend=true;

либо в дизайнере сделай, либо при создании формы.
PM MAIL   Вверх
Vyacheslav
Дата 27.9.2006, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Цитата(cyberstream @  27.9.2006,  16:56 Найти цитируемый пост)
У меня ругается 
Е2369 Cannot use the result of a property assignment as an rvalue

У меня тоже smile
Изящная конструкция не проходит. Так что Ваше решение более изящно, потому как работает smile 
Код

 while (AlphaBlendValue>0)
           AlphaBlendValue--;


Добавлено @ 17:43 
Цитата(cyberstream @  27.9.2006,  16:56 Найти цитируемый пост)
 При этом форма чернеет, и её чёрный прямоугольник fade-ится. Что за глюк? Как лечить?

Код

void __fastcall TForm2::FormDeactivate(TObject *Sender)
{
    AlphaBlend = true;
    Repaint();
     while(AlphaBlendValue)
     {
        AlphaBlendValue--;
     };
    Close();
}




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
dumb
Дата 28.9.2006, 02:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



Цитата(Vyacheslav @  27.9.2006,  17:40 Найти цитируемый пост)

Код

void __fastcall TForm2::FormDeactivate(TObject *Sender)
{
    AlphaBlend = true;
    Repaint();


так все равно заметно, как перед fade'ом мигает черным... так что лучше AlphaBlend выставлять при создании...
PM MAIL   Вверх
cyberstream
Дата 28.9.2006, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 7.9.2006

Репутация: 2
Всего: 4



Ладно, пускай тормозит, выставим при создании.
И ещё вопрос:
Вторую форму пихаем в dll, код коего следующий
Код

void ChildFormShow()
{ TFormTask* ChildForm = new TFormTask(Application);
  ChildForm->Show();
}//=============================================================================
 Вылазит окно и кидает свою кнопку на taskbar. Куда только не пихал  smile  
Код

ShowWindow(Handle, SW_HIDE);  
Как её скрыть с панели задач? В том я направлении мыслил?
--------------------
Не знаешь кого спросить? - Спроси google!
PM MAIL   Вверх
Vyacheslav
Дата 28.9.2006, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Не в том.
1)Первый вариант(не очень хороший).
Перед вызом формы из dll выполнить подмену Аpplication из dll на Application приложения. И перед выгрузкой dll выполнить замену обратно. В dll должны быть функции типа 
Код

TApplication* OldApp;
void InitApplication(TApplication* app)
{
       OldApp = Application;
        Application = app;

}
void RestoreApplication()
{
    Application = OldApp;
}


2)Второй вариант.
Собрать и dll и приложение с включенной опцией  Build with runtime package





--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
cyberstream
Дата 3.10.2006, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 7.9.2006

Репутация: 2
Всего: 4



Код

Второй вариант.
Собрать и dll и приложение с включенной опцией  Build with runtime package
 smile 
У меня не получается. Куда пихать вызов ShowWindow(Handle, SW_HIDE); и использовать ли его вообще? Другие варианты есть? Он не всегда работает, как хочется?

Код формы в DLL

Код

#include <vcl.h>
#pragma hdrstop
#include "TaskCode.h"
//==============================================================================
#pragma package(smart_init)
#pragma resource "*.dfm"
TFormTask *FormTask;
//TForm *MainForm;
//==============================================================================
__fastcall TFormTask::TFormTask(TComponent* Owner)
        : TForm(Owner)
{    }//========================================================================

void __fastcall TFormTask::PanelExit(TObject *Sender)
{ ActiveControl=Panel; }
//==============================================================================

void __fastcall TFormTask::FormDeactivate(TObject *Sender)
{   while (AlphaBlendValue!=0)
           AlphaBlendValue--;
    Close();
}
//==============================================================================

void __fastcall TFormTask::FormClose(TObject *Sender, TCloseAction &Action)
{  Action = caFree; }
//==============================================================================

void __fastcall TFormTask::FormShow(TObject *Sender)
{ HelpContext=1;     ShowWindow(Handle, SW_HIDE); }
//==============================================================================

void __fastcall TFormTask::FormPaint(TObject *Sender)
{   if (HelpContext)
    {  HelpContext=0;
       AlphaBlendValue=0;
       while (AlphaBlendValue!=255)
              AlphaBlendValue++;
    }
}//=============================================================================

void __fastcall TFormTask::FormMouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{ if(Button == mbLeft)
  {  long SC_DRAGMOVE = 0xF012;
     ReleaseCapture();
     SendMessage(Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);
  }
}//=============================================================================

Код DLL
Код

#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#include "TaskCode.h"
#include "TaskWnd.h"
#pragma argsused
void ChildFormShow();
void InsertSysMenuItem(HWND, UINT);
//==============================================================================
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{   return 1;   }
//==============================================================================

void ChildFormShow()
{ TFormTask* ChildForm = new TFormTask(Application);
  ChildForm->Show();
}//=============================================================================

void InsertSysMenuItem(HWND handle, UINT SC_UserItem)
{  HMENU hSystemMenu;
    hSystemMenu = GetSystemMenu(handle, false);
    AppendMenu(hSystemMenu, MF_SEPARATOR, 0, "");
    AppendMenu(hSystemMenu, MF_STRING, SC_UserItem, "&Условие задачи");
}//=============================================================================


И ещё вопрос. Имеем: простое приложение, 1 форма. 
Почему не вызывается FormDeactivate при потере фокуса? Что за специфика такая непростая у этого события?
Код

#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{ }//---------------------------------------------------------------------------

void __fastcall TForm1::FormDeactivate(TObject *Sender)
{    Close();   }
//---------------------------------------------------------------------------


--------------------
Не знаешь кого спросить? - Спроси google!
PM MAIL   Вверх
cyberstream
Дата 5.10.2006, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 7.9.2006

Репутация: 2
Всего: 4



Ладно, сделаем по-другому, как в OnDeactivate, Minimize example в Builder Нelp
Код

void __fastcall TForm1::AppDeactivate(TObject *Sender)
{   Application->Minimize();   }

void __fastcall TForm1::FormCreate(TObject *Sender)
{  Application->OnDeactivate = AppDeactivate;  } 
 Но это работает, пока не запихнём в DLL. У меня упорно не хочет ничего срабатывать при Deactivate !! А если код DLL и формы в ней не компилить в DLL, а подключать по-простому - модулями, то всё нормально. Разве это нормально? Как быть? 

Если отключить rBuild with runtime package, то будет fade-иться, но не спрячется в Taskbar-e, если влючить - наоборот, не появится на панели задач, но и не захочет закрываться при потере фокуса. Как это побороть? 
--------------------
Не знаешь кого спросить? - Спроси google!
PM MAIL   Вверх
cyberstream
Дата 7.10.2006, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 7.9.2006

Репутация: 2
Всего: 4



Ребята, вы где?
У кого какие мысли есть? 
Поделитесь !!
--------------------
Не знаешь кого спросить? - Спроси google!
PM MAIL   Вверх
Vyacheslav
Дата 9.10.2006, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Цитата(cyberstream @  3.10.2006,  15:31 Найти цитируемый пост)
 У меня не получается. Куда пихать вызов ShowWindow(Handle, SW_HIDE); и использовать ли его вообще? Другие варианты есть? Он не всегда работает, как хочется?

Должно получиться. Убедись, что точно экзешник и dll перестроены с данной опцией. Это весьма  известный эффект и способы его решения  стандартны
ShowWindow(Handle, SW_HIDE);  использовать не нужно.

Цитата(cyberstream @  3.10.2006,  15:31 Найти цитируемый пост)
И ещё вопрос. Имеем: простое приложение, 1 форма. 
Почему не вызывается FormDeactivate при потере фокуса? Что за специфика такая непростая у этого события?

А почему оно должно вызываться. Форма в приложении фокуса не теряет, так как форма в приложении одна. А то, что Вы переключаетесь на другое приложение, делая текущее неактивным, форме до этого дела нет.







--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
cyberstream
Дата 9.10.2006, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 7.9.2006

Репутация: 2
Всего: 4



Код

Убедись, что точно экзешник и dll перестроены с данной опцией

Убедился, да и по размеру видно, что И как было скомпилено. Сдвигов нет. 8(

Код

Это весьма  известный эффект
 Хотелось бы поподробнее! Линк например?

Код

и способы его решения  стандартны
 Подмена Аpplication-ов и runtime? Упрямятся. Ещё есть?

Код

ShowWindow(Handle, SW_HIDE);  использовать не нужно.
 То есть, если я правильно понял, 2-я форма не вывалится отдельной кнопкой на TaskBar если и dll и приложение собрать с включенной опцией Build with runtime package? Вроде так оно и происходит, если код DLL и формы в ней подключать  модулями. Как вы и указывали, безо всякого SW_HIDE. 
Но как только оформляем DLL, начинается ... Если с Build with runtime packages то 2-я кнопка появляется по-любому - и с SW_HIDE и без SW_HIDE. Зато закрывается, теряя фокус. Если компилим без runtime packages (при этом отключать Use dynamic RTL ??? ), то с подменой Аpplication-ов и с SW_HIDE 2-е окно не вылезет, но уже и не захочет прятаться при потере фокуса. Не знаю уже, что и делать! Есть подозрения, что присутствует разумное этому объяснение, вот только какое?

--------------------
Не знаешь кого спросить? - Спроси google!
PM MAIL   Вверх
Vyacheslav
Дата 9.10.2006, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Не могли бы Вы прояснить следущие взаимоисключающие фразы фразы
Цитата(cyberstream @  9.10.2006,  16:57 Найти цитируемый пост)
Вроде так оно и происходит, если код DLL и формы в ней подключать  модулями


Цитата(cyberstream @  9.10.2006,  16:57 Найти цитируемый пост)
Но как только оформляем DLL, начинается ... Если с Build with runtime packages то 2-я кнопка появляется по-любому - и с 

Так появляется или не появлется?
Уверяю Вас, что у Вы что-то собираете не так.  Совершенно точно, что кнопка не появится, если собирать с включенной опцией Build with runtime. 
И разумное объяснение этому делу есть. При такой сборке на exe и dll  присутсвует один общий эксземпляр Application.
Еще раз и очень громко(чтобы все слышали) НЕ ТОЛЬКО DLL, НО И ОСНОВНОЕ ПРИЛОЖЕНИЕ ДОЛЖНО БЫТЬ СОБРАНО С BUILD WITH RUNTIME PACKAGE. 
Что бы окончательно убедиться в этом идите сюда. Там внизу есть пример. 
К сожалению, он сразу не оттранслируется. Там прописались лишние пакеджи, которых нет у Вас.
Отредактируйте строчку, которая расположена ниже Build with runtime: уберите все, начиная с ExtAction. И оттранслировав, Вы сможите убедиться, что формыЮ загружаемые из DLL не создают лополнительных кнопок на таскбаре.
Кстати, может у Вас с этой строчкой что-то не впорядке. Например, она пустая ?








--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1172 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.