Как мне запрограммировать эффект «вспышки» при обновлении текстовых полей в форме Windows с помощью C #?

У меня есть форма Windows на C # с 7 текстовыми полями. Каждое текстовое поле обновляет 2 или 3 других, когда его значение изменяется и принимается. Я хочу каким-то образом взять те текстовые поля, которые нужно обновить, и заставить их «мигать» светлым цветом фона или чем-то подобным. Цель состоит в том, чтобы показать пользователю, что обновляется, с добавлением немного чутья.

Я не уверен, есть ли простой способ сделать это, и именно поэтому я спрашиваю здесь. Я могу использовать таймер, цикл while и задний цвет с уменьшающимся альфа-каналом в текстовом поле, я думаю, но я хочу посмотреть, есть ли лучший способ.

jQuery UI имеет " Эффект «Выделить», который показывает, чего я хочу достичь (хотя я хочу, чтобы мой был немного медленнее). Просто перейдите сюда, на страницу демонстрации эффектов пользовательского интерфейса jQuery , выберите «выделить» из раскрывающегося списка в окне и нажмите « У меня есть приложение в смешанном режиме, в котором нативный код выполняет всю тяжелую работу, соблюдая при этом производительность, а за это отвечает управляемый код ...

Как Ханс Пассан желает , вот мой сценарий . У меня есть приложение в смешанном режиме, в котором нативный код выполняет всю тяжелую работу, соблюдая при этом производительность, а управляемый код отвечает только за графический интерфейс. Также пользователи будут участвовать, написав свой собственный код на C #. У меня есть C ++ для собственных классов, C # для графического интерфейса и пользовательского кода и C ++ / Cli для классов-оболочек между ними. Среди всех моих классов C ++ есть один, который выполняет% 90 вычислений и каждый раз создает разные параметры. Назовем его NativeClass. Есть ок. 2000 экземпляров этого NativeClass, и я должен найти правильный экземпляр, связанный с некоторым параметром, прежде чем он выполнит расчет. Поэтому для этой цели я разработал hash_map с параметрами, являющимися хэш-кодом. Когда я получаю параметр, я ищу нужный экземпляр в hash_map, нахожу его и вызываю некоторые из его методов.
Когда пользователи переходят к вычислениям, написав код C #, и этот класс выполняет эти коды с помощью обратных вызовов. Это тривиально, но иногда мне нужна информация о классах .Net, созданных пользователями. Поэтому мне нужно как-то прикрепить этот конкретный ManagedClass к NativeClass. Мое первое решение - использование GChandle.Alloc () и передача адреса дескрипторов. Но есть некоторые опасения по поводу того, что сборщик мусора не будет выполнять свою работу должным образом. Ханс рекомендовал Marshal.AllocCoTaskMem () и Marshal.StructureToPtr () для выделения управляемых объектов в неуправляемой памяти, однако я считаю, что это справедливо для классов или структур типов значений. Как насчет реф-классов? Как я могу передать ссылку на NativeClass, не допуская их сбора GC, и одновременно заставить GC работать правильно?

Вот пример кода:

class NativeClass
{
private:
    int AddressOfManagedHandle;
public:
    static NativeClass * GetNativeClassFromHashMap(int SomeParameter)
    {
// return NativeClass associated with SomeParameter from NativeClassHashMap;
    }
    NativeClass(int addr, int SomeParameter) : AddressOfManagedHandle(addr)
    {

    }
    int GetAddress(){return AddressOfManagedHandle;}
void DoCalculation(){ 
// CALCULATIONS
}
};


public ref class ManagedClass : MarshalByRefObject
{
private:
    NativeClass* _nc;
//GCHandle handle;
    void FreeManagedClass()
    {
        Marshal::FreeHGlobal(IntPtr(_nc->GetAddress()));
//if(handle.IsAllocated)
//handle.Free();
        delete _nc;
    }
public: 
    ManagedClass()
    {
        IntPtr addr = (Marshal::AllocHGlobal(Marshal::Sizeof(this))); // Error
        Marshal::StructureToPtr(this,addr,true);
//handle = GCHandle.Alloc(this);
//IntPtr addr = handle.ToIntPtr();
        _nc = new NativeClass(addr.ToInt32());
    }
    ~ManagedClass() {FreeManagedClass();}
    !ManagedClass() {FreeManagedClass();}
    int GetAddress() {return _nc->GetAddress();};
    static ManagedClass^ GetManagedClass(int SomeParameter)
    {
int addr = NativeClass::GetNativeClassFromHashMap(SomeParameter)->GetAddress();
//Object^obj = GCHandle::FromIntPtr(IntPtr(addr)).Target;
Object^ obj = Marshal::PtrToStructure(IntPtr(addr), ManagedClass::typeid );
    return dynamic_cast(obj);

    }
};

Мне очень жаль, что это слишком долго и все еще неясно.

5
задан Community 23 May 2017 в 10:27
поделиться