Re[18]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.08.09 18:19
Оценка:
Здравствуйте, jenyavb, Вы писали:

Вот это:
J>
J>    public AdvancedHint(
J>        Action<string> linkClickedNotifyer,
J>        Func<string, string> subHintGetter,
J>        IDictionary<string, Func<Span>> styles)
J>


как-то слишком сложно для восприятия.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[17]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 24.08.09 18:21
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Кстати, логично было бы предусмотреть маленькую кнопку (в углу хинта) навигации назад (так чтобы она была видна если задан некий флаг).


А при ёё нажатии что, делегат вызывать?
Re[18]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.08.09 18:22
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>subHintGetter — делегат, получающий содержимое вложенного хинта. есть еще простые хинты с указанием текста по месту, но без форматирования.


Какое-то переусложнение. Это же еще и использовать придется .

J>showAt у меня нет, ибо позиция курсора и так известна.


Курсора мыши? Но хинты то должны показываться относительно кода, а не относительно курстора. Иначе не ясно будет к чему они относятся.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[18]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.08.09 18:24
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>А при ёё нажатии что, делегат вызывать?


Одно из двух. Или просто вызваться некое событие. Или должен открываться предыдущий хинт (если мы не закрывая один хинт открыли еще один на событие нажатия мыши).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[19]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 24.08.09 18:32
Оценка:
Здравствуйте, VladD2, Вы писали:

J>>subHintGetter — делегат, получающий содержимое вложенного хинта. есть еще простые хинты с указанием текста по месту, но без форматирования.

VD>Какое-то переусложнение. Это же еще и использовать придется .

Для вложенных подхинтов больше никак и не сделаешь, потому что их может быть очень много, засовывать их в исходную строку вряд-ли захочется, да и пустая трата ресурсов это.

J>>showAt у меня нет, ибо позиция курсора и так известна.

VD>Курсора мыши? Но хинты то должны показываться относительно кода, а не относительно курстора. Иначе не ясно будет к чему они относятся.

А, вот оно зачем. Ну у меня просто хинт показывается внизу целевого прямоугольника.
Re[19]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 24.08.09 18:40
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Вот это:

J>>
J>>    public AdvancedHint(
J>>        Action<string> linkClickedNotifyer,
J>>        Func<string, string> subHintGetter,
J>>        IDictionary<string, Func<Span>> styles)
J>>

VD>как-то слишком сложно для восприятия.

Что сложного то? Кстати каждый параметр может быть null. Примерно так юзается:
var hint = new AdvancedHint(
    linkId => Console.WriteLine(linkId),
    hintId => GenerateHint(hintId),
    new Dictionary
    {
        { "bold", ()=> new Bold() },
        { "pre", ()=> new Run { FontFamily = "Courier New" } }
    ));

hint.Show(boundRect, "bla-bla-bla");
Re[19]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 24.08.09 19:02
Оценка:
Здравствуйте, VladD2, Вы писали:

Параметр с текстом хинта из метода Show пришлось убрать, поскольку Show нужно вызывать при движении по нужной области, чтобы когда мышь остановится он сработал, а постоянный парсинг — дело не дешевое.
Re[20]: Кто может написать контрол - крутой хинт?
От: jenyavb  
Дата: 24.08.09 19:08
Оценка:
J>Параметр с текстом хинта из метода Show пришлось убрать, поскольку Show нужно вызывать при движении по нужной области, чтобы когда мышь остановится он сработал, а постоянный парсинг — дело не дешевое.

Хотя нет, это не верно. Ведь если пользователь сделал клик в целевой обласи, то хинт не должен больше появляться снова, пока курсор не выйдет из обласи и зайдет туда вновь, значит эту логику нужно убрать в хинт, сигнатура Show останется как есть, но вызывать его нужно только при входе курсора в целевую область.
Re: AdvancedHints Beta
От: jenyavb  
Дата: 24.08.09 19:28
Оценка:
Решил выложить посмотреть то, что уже сделано.
Это ещё не окончательный вариант, некоторых фич ещё нет. Окончательный сделаю через 1-3 дня...

AdvancedHints.zip

Багрепорты — только с Exception'ами и вылетами. Логика ещё не доделана, я и сам всё знаю.
Re[2]: AdvancedHints Beta
От: yumi  
Дата: 25.08.09 02:04
Оценка: 2 (1)
Здравствуйте, jenyavb, Вы писали:

J>Багрепорты — только с Exception'ами и вылетами. Логика ещё не доделана, я и сам всё знаю.


При старте:

System.ComponentModel.Win32Exception was unhandled
Message="Невозможно установить нелокальный обработчик без дескриптора модуля"
Source="AdvancedHints"
ErrorCode=-2147467259
NativeErrorCode=1428
StackTrace:
at AdvancedHints.HookManager.EnsureSubscribedToGlobalMouseEvents() in D:\Projects\AdvancedHints\Hooks\HookManager.Callbacks.cs:line 211
at AdvancedHints.HookManager.add_MouseMove(MouseEventHandler value) in D:\Projects\AdvancedHints\Hooks\HookManager.cs:line 25
at AdvancedHints.AdvancedHint..ctor(Action`1 linkClickedNotifyer, Func`2 subHintGetter, IDictionary`2 styles) in D:\Projects\AdvancedHints\AdvancedHint.cs:line 44
at AdvancedHints.TestForm..ctor() in D:\Projects\AdvancedHints\TestForm.cs:line 17
at AdvancedHints.Program.Main() in D:\Projects\AdvancedHints\Program.cs:line 13
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:

Lisp is not dead. It’s just the URL that has changed:
http://clojure.org
Re[3]: AdvancedHints Beta
От: jenyavb  
Дата: 25.08.09 04:47
Оценка:
Здравствуйте, yumi, Вы писали:

Y>При старте:

Y>

Y>System.ComponentModel.Win32Exception was unhandled
Y> Message="Невозможно установить нелокальный обработчик без дескриптора модуля"
Y> Source="AdvancedHints"
Y> ErrorCode=-2147467259
Y> NativeErrorCode=1428
Y> StackTrace:
Y> at AdvancedHints.HookManager.EnsureSubscribedToGlobalMouseEvents() in D:\Projects\AdvancedHints\Hooks\HookManager.Callbacks.cs:line 211
Y> at AdvancedHints.HookManager.add_MouseMove(MouseEventHandler value) in D:\Projects\AdvancedHints\Hooks\HookManager.cs:line 25
Y> at AdvancedHints.AdvancedHint..ctor(Action`1 linkClickedNotifyer, Func`2 subHintGetter, IDictionary`2 styles) in D:\Projects\AdvancedHints\AdvancedHint.cs:line 44
Y> at AdvancedHints.TestForm..ctor() in D:\Projects\AdvancedHints\TestForm.cs:line 17
Y> at AdvancedHints.Program.Main() in D:\Projects\AdvancedHints\Program.cs:line 13
Y> at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
Y> at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
Y> at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
Y> at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
Y> at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
Y> at System.Threading.ThreadHelper.ThreadStart()
Y> InnerException:


Да, тут проблема есть. Для WinAPI функции SetWindowHook нужно указать хэндл текущего модуля. Где его взять — я так и не разобрался. Ещё не помешало бы указать туда ID потока. Сейчас туда просто передатся IntPtr.Zero и 0, соответственно. Кто разбирается в WinAPI — помогите, плиз.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Re[4]: AdvancedHints Beta
От: yumi  
Дата: 25.08.09 04:54
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>Да, тут проблема есть. Для WinAPI функции SetWindowHook нужно указать хэндл текущего модуля. Где его взять — я так и не разобрался. Ещё не помешало бы указать туда ID потока. Сейчас туда просто передатся IntPtr.Zero и 0, соответственно. Кто разбирается в WinAPI — помогите, плиз.


Так-с, поглядел код, а зачем ты вообще WinAPI используешь, неужели в .NET нет аналогов поставить хуки на MouseClick, MouseDown итд? То же самое кстати с клавиатурой.
Lisp is not dead. It’s just the URL that has changed:
http://clojure.org
Re[5]: AdvancedHints Beta
От: jenyavb  
Дата: 25.08.09 05:01
Оценка:
Здравствуйте, yumi, Вы писали:

J>>Да, тут проблема есть. Для WinAPI функции SetWindowHook нужно указать хэндл текущего модуля. Где его взять — я так и не разобрался. Ещё не помешало бы указать туда ID потока. Сейчас туда просто передатся IntPtr.Zero и 0, соответственно. Кто разбирается в WinAPI — помогите, плиз.

Y>Так-с, поглядел код, а зачем ты вообще WinAPI используешь, неужели в .NET нет аналогов поставить хуки на MouseClick, MouseDown итд? То же самое кстати с клавиатурой.

Да вроде нет.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Re[5]: AdvancedHints Beta
От: yumi  
Дата: 25.08.09 05:05
Оценка:
Здравствуйте, yumi, Вы писали:

Y>Так-с, поглядел код, а зачем ты вообще WinAPI используешь, неужели в .NET нет аналогов поставить хуки на MouseClick, MouseDown итд? То же самое кстати с клавиатурой.


Да, я кажется понял тебя, я вижу 2 пути, первое — принимать указатель на основную форму и подписаться на его события MouseXXX в своем AdvancedHint. Второй путь:
interface IAdvancedHint
{
  void MouseClick(...);
  void MouseMove(...);
  // etc ...
}

И пусть пользователи твоей компоненты сами дергают твои методы MouseXXX при определенных событиях.
Lisp is not dead. It’s just the URL that has changed:
http://clojure.org
Re[6]: AdvancedHints Beta
От: yumi  
Дата: 25.08.09 06:45
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>Здравствуйте, yumi, Вы писали:


J>>>Да, тут проблема есть. Для WinAPI функции SetWindowHook нужно указать хэндл текущего модуля. Где его взять — я так и не разобрался. Ещё не помешало бы указать туда ID потока. Сейчас туда просто передатся IntPtr.Zero и 0, соответственно. Кто разбирается в WinAPI — помогите, плиз.

Y>>Так-с, поглядел код, а зачем ты вообще WinAPI используешь, неужели в .NET нет аналогов поставить хуки на MouseClick, MouseDown итд? То же самое кстати с клавиатурой.

J>Да вроде нет.


Посмотри http://support.microsoft.com/kb/318804, может поможет. Кстати, увидел случайно, KeyboardHookStruct лучше назвать KeyboardLLHookStruct, т.к. по структуре оно вроде low level.

И да, я тут чуть поэкспериментировал. Если убрать _LL и передать Id треда, перестает падать, но в этом случае, нужно в обработчике MouseHookProc, нужно обрабатывать структуру MouseHookStruct, вместо MouseLLHookStruct. Только я не знаю, подойдет ли тебе обычный обработчик, а не low level.
// ...
s_MouseHookHandle = SetWindowsHookEx(
    WH_MOUSE, s_MouseDelegate, IntPtr.Zero, AppDomain.GetCurrentThreadId());
// ...


То же самое с клавиатурным обработчиком.
Lisp is not dead. It’s just the URL that has changed:
http://clojure.org
Re[7]: AdvancedHints Beta
От: yumi  
Дата: 25.08.09 07:01
Оценка:
А нет, все, нашел выход.

То есть должно получится как-то так:
                using (System.Diagnostics.Process process = System.Diagnostics.Process.GetCurrentProcess())
                using (System.Diagnostics.ProcessModule module = process.MainModule)
                {
                    IntPtr hModule = GetModuleHandle(module.ModuleName);

                    s_MouseHookHandle = SetWindowsHookEx(
                        WH_MOUSE_LL, s_MouseDelegate, hModule, 0);
                }


Самому проверять уже времени нет Там надо импортировать GetModuleHandle. Но я уверен, должно сработать.
Lisp is not dead. It’s just the URL that has changed:
http://clojure.org
Re[7]: AdvancedHints Beta
От: jenyavb  
Дата: 25.08.09 07:55
Оценка:
Здравствуйте, yumi, Вы писали:

Y>Посмотри http://support.microsoft.com/kb/318804, может поможет. Кстати, увидел случайно, KeyboardHookStruct лучше назвать KeyboardLLHookStruct, т.к. по структуре оно вроде low level.


Её вообще нужно назвать, как она в WinAPI называется.

Y>И да, я тут чуть поэкспериментировал. Если убрать _LL и передать Id треда, перестает падать, но в этом случае, нужно в обработчике MouseHookProc, нужно обрабатывать структуру MouseHookStruct, вместо MouseLLHookStruct. Только я не знаю, подойдет ли тебе обычный обработчик, а не low level.


Судя по вот этому — Keyboard/MouseHookStruct передается только при low lewel хуке, а HookStruct не делятся на обычные и LL. Вобщем я —
Re[7]: AdvancedHints Beta
От: jenyavb  
Дата: 25.08.09 08:04
Оценка:
Здравствуйте, yumi, Вы писали:

Y>
Y>// ...
Y>s_MouseHookHandle = SetWindowsHookEx(
Y>    WH_MOUSE, s_MouseDelegate, IntPtr.Zero, AppDomain.GetCurrentThreadId());
Y>// ...
Y>


AppDomain.GetCurrentThreadId() — метод помечен как Obsolete.
Да и при указании треда нужно указать хэндл модуля, иначе ошибка.
Re[20]: Кто может написать контрол - крутой хинт?
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.08.09 13:48
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>Для вложенных подхинтов больше никак и не сделаешь, потому что их может быть очень много, засовывать их в исходную строку вряд-ли захочется, да и пустая трата ресурсов это.


У нас есть два типа вложенных хинтов:
1. Полноценая ссылка на другое определение.
2. Простий текстовый хинт.
Примером второго типа являютсэ хинты для типов параметров.
Их будет очень неудобно оформлять полноценными хинтами.
Мне нужно чтобы я мог задать весь текст хинта (с простыми подхинтами) за один прием.

J>А, вот оно зачем. Ну у меня просто хинт показывается внизу целевого прямоугольника.


Область может быть довольно большой, так что хинт будет висеть где-то внизу экрана.
Это одна из проблем текущей риализации. Сейчас я пытаюсьобойти еепутем задавания в качестве области одного токена.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: AdvancedHints Beta
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.08.09 13:52
Оценка:
Здравствуйте, jenyavb, Вы писали:

J>Решил выложить посмотреть то, что уже сделано.

J>Это ещё не окончательный вариант, некоторых фич ещё нет. Окончательный сделаю через 1-3 дня...

J>AdvancedHints.zip


J>Багрепорты — только с Exception'ами и вылетами. Логика ещё не доделана, я и сам всё знаю.


Я до еонца недели (в лучшем случае до пятницы) на GPRS-е, так что качать ничего не могу.
Так что доводи до ума и тогда посмотрим.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.