Размер ActiveX в Design time
От: Vasily  
Дата: 16.04.01 09:15
Оценка:
Привет всем,

Пишу ActiveX, невидимый в рантайме, и хочу, чтобы в дизайнтайме невозможно было изменить его размер,
подобно любому невизуальному стандартному компоненту. Пробовал добавить следующий код в обработчик
OnSetObjectRects:

BOOL CErrorDlgCtrl::OnSetObjectRects(LPCRECT lpRectPos, LPCRECT lpRectClip)
{
RECT rcYourPosRect = *lpRectPos;
rcYourPosRect.right = rcYourPosRect.left + 40;
rcYourPosRect.bottom = rcYourPosRect.top + 40;

RECT rcYourClipRect = rcYourPosRect;

return COleControl::OnSetObjectRects(&rcYourPosRect, &rcYourClipRect);
}

Этот код действительно запрещает изменять размер компонента, но он никак не влиет на размер растягивающий
рамки(той, на которой находятся квадратики в углах и в центре граней :)), ее размер я могу менять без проблем.
Кто-нибудь может подсказать, как добиться того, чтобы и размер этой рамки возвращался к размеру компонента
после окончания изменения размера?

Василий.
Re: Размер ActiveX в Design time
От: Myth  
Дата: 16.04.01 12:46
Оценка:
Здравствуйте Vasily, 16.04.2001 03:15:25 вы писали:

>Привет всем,

>
>Пишу ActiveX, невидимый в рантайме, и хочу, чтобы в дизайнтайме невозможно было изменить его размер,
>подобно любому невизуальному стандартному компоненту. Пробовал добавить следующий код в обработчик
>OnSetObjectRects:
>
>BOOL CErrorDlgCtrl::OnSetObjectRects(LPCRECT lpRectPos, LPCRECT lpRectClip)
>{
> RECT rcYourPosRect = *lpRectPos;
> rcYourPosRect.right = rcYourPosRect.left + 40;
> rcYourPosRect.bottom = rcYourPosRect.top + 40;
>
> RECT rcYourClipRect = rcYourPosRect;
>
> return COleControl::OnSetObjectRects(&rcYourPosRect, &rcYourClipRect);
>}
>
>Этот код действительно запрещает изменять размер компонента, но он никак не влиет на размер растягивающий
>рамки(той, на которой находятся квадратики в углах и в центре граней :)), ее размер я могу менять без проблем.
>Кто-нибудь может подсказать, как добиться того, чтобы и размер этой рамки возвращался к размеру компонента
>после окончания изменения размера?
>
>Василий.

Попробуйте так:

int CErrorDlgCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (COleControl::OnCreate(lpCreateStruct) == -1)
return -1;

.....

SetControlSize(40, 40); // Размер, который Вы хотите
return 0;
}

BOOL CErrorDlgCtrl::OnSetExtent(LPSIZEL lpSizeL)
{
return FALSE;
}

Давно писал такой контрол, возможно что-то и упустил.
Re[2]: Размер ActiveX в Design time
От: vasily  
Дата: 16.04.01 14:16
Оценка:
Здравствуйте Myth, 16.04.2001 06:46:51 вы писали:

Действительно, изменение рамки размера предотвращается посредством перехвата
OnSetExtent, спасибо.

Но вот с размером самого компонента проблема.
Структура Create следущая:

BOOL CErrorDlgCtrl::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class

return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}

Пробовал изменять значение rect, не помогло,
в чем может быть дело?


>Здравствуйте Vasily, 16.04.2001 03:15:25 вы писали:

>
>>Привет всем,
>>
>>Пишу ActiveX, невидимый в рантайме, и хочу, чтобы в дизайнтайме невозможно было изменить его размер,
>>подобно любому невизуальному стандартному компоненту. Пробовал добавить следующий код в обработчик
>>OnSetObjectRects:
>>
>>BOOL CErrorDlgCtrl::OnSetObjectRects(LPCRECT lpRectPos, LPCRECT lpRectClip)
>>{
>> RECT rcYourPosRect = *lpRectPos;
>> rcYourPosRect.right = rcYourPosRect.left + 40;
>> rcYourPosRect.bottom = rcYourPosRect.top + 40;
>>
>> RECT rcYourClipRect = rcYourPosRect;
>>
>> return COleControl::OnSetObjectRects(&rcYourPosRect, &rcYourClipRect);
>>}
>>
>>Этот код действительно запрещает изменять размер компонента, но он никак не влиет на размер растягивающий
>>рамки(той, на которой находятся квадратики в углах и в центре граней :)), ее размер я могу менять без проблем.
>>Кто-нибудь может подсказать, как добиться того, чтобы и размер этой рамки возвращался к размеру компонента
>>после окончания изменения размера?
>>
>>Василий.
>
>Попробуйте так:
>
>int CErrorDlgCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
>{
> if (COleControl::OnCreate(lpCreateStruct) == -1)
> return -1;
>
> .....
>
> SetControlSize(40, 40); // Размер, который Вы хотите
> return 0;
>}
>
>BOOL CErrorDlgCtrl::OnSetExtent(LPSIZEL lpSizeL)
>{
> return FALSE;
>}
>
>Давно писал такой контрол, возможно что-то и упустил.
>
>
Re[3]: Размер ActiveX в Design time
От: Myth  
Дата: 17.04.01 06:41
Оценка:
Здравствуйте vasily, 16.04.2001 08:16:55

Действительно ошибачка вышла, правильто так будет:

int CErrorDlgCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (COleControl::OnCreate(lpCreateStruct) == -1)
return -1;

SetControlSize(40, 40);

m_bInited = true;

return 0;
}

BOOL CErrorDlgCtrl::OnSetExtent(LPSIZEL lpSizeL)
{
if (m_bInited)
return FALSE;
else
return COleControl::OnSetExtent(lpSizeL);

}

>Здравствуйте Myth, 16.04.2001 06:46:51 вы писали:

>
>Действительно, изменение рамки размера предотвращается посредством перехвата
>OnSetExtent, спасибо.
>
>Но вот с размером самого компонента проблема.
>Структура Create следущая:
>
>BOOL CErrorDlgCtrl::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
>{
> // TODO: Add your specialized code here and/or call the base class
>
> return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
>}
>
>Пробовал изменять значение rect, не помогло,
>в чем может быть дело?
>
>
>>Здравствуйте Vasily, 16.04.2001 03:15:25 вы писали:
>>
>>>Привет всем,
>>>
>>>Пишу ActiveX, невидимый в рантайме, и хочу, чтобы в дизайнтайме невозможно было изменить его размер,
>>>подобно любому невизуальному стандартному компоненту. Пробовал добавить следующий код в обработчик
>>>OnSetObjectRects:
>>>
>>>BOOL CErrorDlgCtrl::OnSetObjectRects(LPCRECT lpRectPos, LPCRECT lpRectClip)
>>>{
>>> RECT rcYourPosRect = *lpRectPos;
>>> rcYourPosRect.right = rcYourPosRect.left + 40;
>>> rcYourPosRect.bottom = rcYourPosRect.top + 40;
>>>
>>> RECT rcYourClipRect = rcYourPosRect;
>>>
>>> return COleControl::OnSetObjectRects(&rcYourPosRect, &rcYourClipRect);
>>>}
>>>
>>>Этот код действительно запрещает изменять размер компонента, но он никак не влиет на размер растягивающий
>>>рамки(той, на которой находятся квадратики в углах и в центре граней :)), ее размер я могу менять без проблем.
>>>Кто-нибудь может подсказать, как добиться того, чтобы и размер этой рамки возвращался к размеру компонента
>>>после окончания изменения размера?
>>>
>>>Василий.
>>
>>Попробуйте так:
>>
>>int CErrorDlgCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
>>{
>> if (COleControl::OnCreate(lpCreateStruct) == -1)
>> return -1;
>>
>> .....
>>
>> SetControlSize(40, 40); // Размер, который Вы хотите
>> return 0;
>>}
>>
>>BOOL CErrorDlgCtrl::OnSetExtent(LPSIZEL lpSizeL)
>>{
>> return FALSE;
>>}
>>
>>Давно писал такой контрол, возможно что-то и упустил.
>>
>>
Re[4]: Размер ActiveX в Design time
От: Vasily  
Дата: 17.04.01 07:29
Оценка:
Здравствуйте Myth, 17.04.2001 00:41:26 вы писали:

Myth, если использовать Ваш алгоритм, то контрол ведет себя также, как и в случае, который
был описан Вами до этого. Ведь сторока
return COleControl::OnSetExtent(lpSizeL) вообще никогда не выполнится.

На сколько я понял, то COleControl::OnCreate класса предка должен вызваться только один раз
при создании компонента.
тогда чтобы это работало надо написать так:

int CErrorDlgCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (COleControl::OnCreate(lpCreateStruct) == -1)
return -1;
SetControlSize(40, 40);
m_bInited = TRUE;
return 0;
}

BOOL CErrorDlgCtrl::OnSetExtent(LPSIZEL lpSizeL)
{
if (m_bInited)
{
m_bInited = FALSE;
return COleControl::OnSetExtent(lpSizeL);
}
else
return FALSE;
}

Но например, если в VB я кладу его наформу, выбрав в меню компонентов и затем растянув
на ворме, то первоначально он принимает размер, на который я его растянул, а не тот, который
указан в SetControlSize. А вот потом уже ведет себя так, как мне надо (не позволяет изменение расмера).
А если его тыстировать в ActiveX Control Test Container, то вообще себя странно ведет.

Или я что-то не понял?


>Здравствуйте vasily, 16.04.2001 08:16:55

>
>Действительно ошибачка вышла, правильто так будет:
>
>int CErrorDlgCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
>{
> if (COleControl::OnCreate(lpCreateStruct) == -1)
> return -1;
>
> SetControlSize(40, 40);
>
> m_bInited = true;
>
> return 0;
>}
>
>BOOL CErrorDlgCtrl::OnSetExtent(LPSIZEL lpSizeL)
>{
> if (m_bInited)
> return FALSE;
> else
> return COleControl::OnSetExtent(lpSizeL);
>
>}
>
Re[5]: Размер ActiveX в Design time
От: Myth  
Дата: 18.04.01 06:30
Оценка:
Здравствуйте Vasily, 17.04.2001 01:29:31

Почему не будет выполнятся?
В конструкторе нужно проинициализировать m_bInited = FALSE.
OnCreate вызывается всегда один раз! После того как отработает функция SetControlSize,
устанавливаем m_bInited = TRUE. И тогда OnSetExtent всегда будет возвращать FALSE.
Я проверил у меня все работает.

int CErrorDlgCtrl::CErrorDlgCtrl()
{
.....
m_bInited = false;
}

int CErrorDlgCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (COleControl::OnCreate(lpCreateStruct) == -1)
return -1;

// OnSetExtent вызовит COleControl::OnSetExtent(lpSizeL)
SetControlSize(40, 40);

m_bInited = true; // Теперь OnSetExtent всегда возвращает false

return 0;
}

BOOL CErrorDlgCtrl::OnSetExtent(LPSIZEL lpSizeL)
{
if (m_bInited)
return FALSE;
else
return COleControl::OnSetExtent(lpSizeL);

}


>Здравствуйте Myth, 17.04.2001 00:41:26 вы писали:

>
>Myth, если использовать Ваш алгоритм, то контрол ведет себя также, как и в случае, который
>был описан Вами до этого. Ведь сторока
>return COleControl::OnSetExtent(lpSizeL) вообще никогда не выполнится.
>
>На сколько я понял, то COleControl::OnCreate класса предка должен вызваться только один раз
>при создании компонента.
>тогда чтобы это работало надо написать так:
>
>int CErrorDlgCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
>{
> if (COleControl::OnCreate(lpCreateStruct) == -1)
> return -1;
> SetControlSize(40, 40);
> m_bInited = TRUE;
> return 0;
>}
>
>BOOL CErrorDlgCtrl::OnSetExtent(LPSIZEL lpSizeL)
>{
> if (m_bInited)
> {
> m_bInited = FALSE;
> return COleControl::OnSetExtent(lpSizeL);
> }
> else
> return FALSE;
>}
>
>Но например, если в VB я кладу его наформу, выбрав в меню компонентов и затем растянув
>на ворме, то первоначально он принимает размер, на который я его растянул, а не тот, который
>указан в SetControlSize. А вот потом уже ведет себя так, как мне надо (не позволяет изменение расмера).
>А если его тыстировать в ActiveX Control Test Container, то вообще себя странно ведет.
>
>Или я что-то не понял?
>
>
>>Здравствуйте vasily, 16.04.2001 08:16:55
>>
>>Действительно ошибачка вышла, правильто так будет:
>>
>>int CErrorDlgCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
>>{
>> if (COleControl::OnCreate(lpCreateStruct) == -1)
>> return -1;
>>
>> SetControlSize(40, 40);
>>
>> m_bInited = true;
>>
>> return 0;
>>}
>>
>>BOOL CErrorDlgCtrl::OnSetExtent(LPSIZEL lpSizeL)
>>{
>> if (m_bInited)
>> return FALSE;
>> else
>> return COleControl::OnSetExtent(lpSizeL);
>>
>>}
>>
>
Re: Размер ActiveX в Design time
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.04.01 17:30
Оценка:
А что у вас происходит на GetExtent?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.