более общий вопрос о создании MFC ActiveX контрола (+)
От: ICBa  
Дата: 17.10.02 13:53
Оценка:
Значит делаю я проект типа "MFC ActiveX control".

Там есть функция:
void CTableCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
...
}

Которая, на сколько я понял, отрабатывает при запуске моего ActiveX-а.
В ней всё и рисуется, выводятся нужные данные и всё такое...

Еще есть у меня несколько публичных переменных и метод getData:

void CTableCtrl::getData(const VARIANT FAR& myData)
{
...
}

Который вызывается из контейнера и контейнер передает этому методу двумерный массив данных.
В этом же методе строится SafeArray в который пихаются переданные данные.

Хочется разделить программу по блокам таки образом, чтобы:
1. Сначала в ActiveX е что-то рисуется типа "Loading data..." и мы ждем пока getData получит данные и создаст SafeArray.

2. Потом мы вызываем некую третью функцию которая будет обрабатывать наш SafeArray массив и, в соответствии с данными в массиве, рисовать в ActiveX-е то что нам надо.

3. После обработки данных мы обрабатываем клики мышкой в нашем контроле и некоей четвертой функцией перерисовываем нужным образом некие области контрола.

Как это сделать?
В основном интересует реализация пункта 2.

P.S. На сколько я понял при создани SafeArray-а мы используем SafeArrayAccessData для получения указателя на массив данных, а после окончания работы с этим массивом нам надо сделать SafeArrayUnaccessData ?

Yuri.
Re: более общий вопрос о создании MFC ActiveX контрола (+)
От: Constructor  
Дата: 17.10.02 14:30
Оценка:
Здравствуйте ICBa, Вы писали:

ICB>Значит делаю я проект типа "MFC ActiveX control".


ICB>Там есть функция:

ICB>void CTableCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
ICB>{
ICB>...
ICB>}

ICB>Которая, на сколько я понял, отрабатывает при запуске моего ActiveX-а.

ICB>В ней всё и рисуется, выводятся нужные данные и всё такое...

ICB>Еще есть у меня несколько публичных переменных и метод getData:


ICB>void CTableCtrl::getData(const VARIANT FAR& myData)

ICB>{
ICB>...
ICB>}

ICB>Который вызывается из контейнера и контейнер передает этому методу двумерный массив данных.

ICB>В этом же методе строится SafeArray в который пихаются переданные данные.

ICB>Хочется разделить программу по блокам таки образом, чтобы:

ICB>1. Сначала в ActiveX е что-то рисуется типа "Loading data..." и мы ждем пока getData получит данные и создаст SafeArray.

ICB>2. Потом мы вызываем некую третью функцию которая будет обрабатывать наш SafeArray массив и, в соответствии с данными в массиве, рисовать в ActiveX-е то что нам надо.


ICB>3. После обработки данных мы обрабатываем клики мышкой в нашем контроле и некоей четвертой функцией перерисовываем нужным образом некие области контрола.


ICB>Как это сделать?

ICB>В основном интересует реализация пункта 2.

ICB>P.S. На сколько я понял при создани SafeArray-а мы используем SafeArrayAccessData для получения указателя на массив данных, а после окончания работы с этим массивом нам надо сделать SafeArrayUnaccessData ?


ICB>Yuri.


А как Вы делаете контейнер? На основе диалогового окна? Почему бы не добавить методов 1)"Подготовиться к приему данных" и 2)"Завершение приема данных" и не вызывать из контейнера 1), getData, 2)?
Re[2]: контейнером является... (+)
От: ICBa  
Дата: 18.10.02 05:19
Оценка:
Здравствуйте Constructor, Вы писали:


...Access-овская форма.
C>А как Вы делаете контейнер? На основе диалогового окна?
C>Почему бы не добавить методов 1)"Подготовиться к приему данных" и 2)"Завершение приема данных" и не вызывать из контейнера 1), getData, 2)?

Всё это можно, но вот проблемка: как рисовать в ActiveX-е из другого метода (не OnDraw) ?
Что-то пока не получается...
Re[3]: контейнером является... (+)
От: Constructor  
Дата: 18.10.02 09:08
Оценка:
Здравствуйте ICBa, Вы писали:

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


ICB>

ICB>...Access-овская форма.
C>>А как Вы делаете контейнер? На основе диалогового окна?
C>>Почему бы не добавить методов 1)"Подготовиться к приему данных" и 2)"Завершение приема данных" и не вызывать из контейнера 1), getData, 2)?

ICB>Всё это можно, но вот проблемка: как рисовать в ActiveX-е из другого метода (не OnDraw) ?

ICB>Что-то пока не получается...

Можно в ActiveX-е завести переменную, которая будет отвечать за текущее состояние. В зависимости от состояния пусть рисует себя по-разному. Остается только после вызова методов перерисовывать контрол.
Я делал контейнер не диалоговым окном, а SDI. Там классвизард создал класс-обертку для внедренного ActiveX, и у этого класса есть функция, чтоб нарисовать ActiveX (COleClientItem::Draw). Если ActiveX — элемент управления на диалоге, то там перерисовка как-то корявее сделана, но могу сказать, что работаешь с ним как с обычным элементом управления. Когда надо — вызвал для него перерисовку, да и все...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.