Форум пользователей Visio
http://visio.getbb.ru/

Перехват клика сишарпом
http://visio.getbb.ru/viewtopic.php?f=6&t=1322
Страница 1 из 1

Автор:  powercat [ 16 апр 2018, 10:46 ]
Заголовок сообщения:  Перехват клика сишарпом

Привет.
Начал реализацию.
Сразу возникает вопрос - как перехватить даблоклик в вижуо внешней прогой? Чтобы открылся не вижуо-диалог, а например, кастомная форма...
Библиотека вижуо в проекте, лист вижуо открывается на форме через контрол.

Автор:  Tumanov [ 16 апр 2018, 12:10 ]
Заголовок сообщения:  Re: Перехват клика сишарпом

Даблклики не нужно перехватывать. Они просто программируются.
Вручную - через Format / Behavior / Double-Click
Или через ShapeSheet - ячейка EventDblClick.

Автор:  powercat [ 16 апр 2018, 14:32 ]
Заголовок сообщения:  Re: Перехват клика сишарпом

Tumanov писал(а):
Даблклики не нужно перехватывать. Они просто программируются.
Вручную - через Format / Behavior / Double-Click
Или через ShapeSheet - ячейка EventDblClick.


Я что-то опять криво написал - нужно перехватить клик по шейпу, но при этом должно открыться, ну пусть форма из сишарпа. А не VBAшная или вижевая форма.
Если писать чисто в самом вижуо, я понимаю, как запустить форму. Но если писать на шарпе, то тут вот не понял пока...На EventDblClick повесить-то нечего )))

Автор:  Tumanov [ 16 апр 2018, 16:01 ]
Заголовок сообщения:  Re: Перехват клика сишарпом

Плоды того, что "нормальные герои всегда идут в обход" :)
В таком случае напрашивается прописать в EventDblClick QUEUEMARKER и ловить MarkerEvent. Однако, от DrawingControl до него еще нужно добраться...
Можно попробовать вариант проще, но еще кривее :) Превратить DblClick в событие, на которое можно навесить обработчик. Например, CellChanged.
Прописать в DblClick =SETF(GetRef(Scratch.A1),GetRef(Scratch.A1)+1)
Где-то в начале стартовать Set pg = DrawingControl1.Document.Pages(1)
И использовать обработчик pg_CellChanged
Private Sub pg_CellChanged(ByVal Cell As Visio.IVCell)
MsgBox Cell.Formula
End Sub
DblClick будет дергать Scratch.A1, а это изменение будет отлавливаться в CellChanged

Автор:  powercat [ 16 апр 2018, 16:21 ]
Заголовок сообщения:  Re: Перехват клика сишарпом

Tumanov писал(а):
Плоды того, что "нормальные герои всегда идут в обход" :)
В таком случае напрашивается прописать в EventDblClick QUEUEMARKER и ловить MarkerEvent. Однако, от DrawingControl до него еще нужно добраться...
Можно попробовать вариант проще, но еще кривее :) Превратить DblClick в событие, на которое можно навесить обработчик. Например, CellChanged.
Прописать в DblClick =SETF(GetRef(Scratch.A1),GetRef(Scratch.A1)+1)
Где-то в начале стартовать Set pg = DrawingControl1.Document.Pages(1)
И использовать обработчик pg_CellChanged
Private Sub pg_CellChanged(ByVal Cell As Visio.IVCell)
MsgBox Cell.Formula
End Sub
DblClick будет дергать Scratch.A1, а это изменение будет отлавливаться в CellChanged


Ёперный театр ))))
Но да, идея с изменением ячейки и отлов через экземпляр листа - отличное решение! благодарю...

Автор:  Tumanov [ 22 апр 2018, 17:57 ]
Заголовок сообщения:  Re: Перехват клика сишарпом

Ну да, QUEUEMARKEREVENT тоже нормально работает.
Естественно, это более чистое решение.
В VB6 это выглядит вот так
Код:
Dim WithEvents vApp As Visio.Application

Private Sub Form_Load()
    DrawingControl1.Src = "G:\!w\Ýêñï\Visio\DrawContrPopUp_AddAdvise_Marker\d1.vsd"
    Set vApp = DrawingControl1.Document.Application
End Sub
Private Sub Form_Unload(Cancel As Integer)
    Set vApp = Nothing
End Sub

Private Sub vApp_MarkerEvent(ByVal app As Visio.IVApplication, ByVal SequenceNum As Long, ByVal ContextString As String)
    MsgBox "DoubleClick from Sheet." & ContextString
End Sub

Нужные шейпы заряжаются функцией QUEUEMARKEREVENT и в качестве параметра передают, например, свой ID.

Вложения:
marker.jpg
marker.jpg [ 9.43 Кб | Просмотров: 602 ]

Автор:  powercat [ 25 апр 2018, 11:55 ]
Заголовок сообщения:  Re: Перехват клика сишарпом

Tumanov писал(а):
Ну да, QUEUEMARKEREVENT тоже нормально работает.
Естественно, это более чистое решение.
В VB6 это выглядит вот так
Код:
Dim WithEvents vApp As Visio.Application

Private Sub Form_Load()
    DrawingControl1.Src = "G:\!w\Ýêñï\Visio\DrawContrPopUp_AddAdvise_Marker\d1.vsd"
    Set vApp = DrawingControl1.Document.Application
End Sub
Private Sub Form_Unload(Cancel As Integer)
    Set vApp = Nothing
End Sub

Private Sub vApp_MarkerEvent(ByVal app As Visio.IVApplication, ByVal SequenceNum As Long, ByVal ContextString As String)
    MsgBox "DoubleClick from Sheet." & ContextString
End Sub

Нужные шейпы заряжаются функцией QUEUEMARKEREVENT и в качестве параметра передают, например, свой ID.


Благодарю, сделал под шарп. Напишу детально, может кому пригодится.

0. В вижуо в нужном шейпе в шейпшите в разделе событий на даблкли написать QUEUEMARKEREVENT(аргумент). В качестве аргумента я передаю Prop.name (кастомный) и Prop.id (кастомный) и разделитель между ними "|". В шарп вернется СТРОКА, которую нужно будет распарсить (ну или нет...). Этот шейп закинуть в стенсилсы, привязанные к проекту ссылкой на файл
1. В проект добавить ссылки на вижуо
2. Добавить ссылку на контрол AxMicrosoft.Office.Interop.VisOcx.AxDrawingControl
3. Создать объект (можно без него) AxMicrosoft.Office.Interop.VisOcx.AxDrawingControl drawing_area_on_form. Мне удобно работать с явным выделением листочка для рисования ))
4. Вытащить контрол на форму
5. Повесить на событие загрузки формы подписку на событие даблклика
Код:
drawing_area_on_form.Document.Application.MarkerEvent+=new Microsoft.Office.Interop.Visio.EApplication_MarkerEventEventHandler(Processing_double_click_on_shape);

6. Метод обработчик (вообще создается автоматически, но можно и руками)
Код:
          private void Processing_double_click_on_shape(Microsoft.Office.Interop.Visio.Application app, int SequenceNum, string ContextString)
          {

               if(ContextString!=null)
               {

                    MessageBox.Show(ContextString);

               }
          }

7. ContextString - это СТРОКА, отправленная из вижуо.

Автор:  powercat [ 25 апр 2018, 11:57 ]
Заголовок сообщения:  Re: Перехват клика сишарпом

Странно, под гостем вставилось :o

Страница 1 из 1 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/