Пишу ActiveX, невидимый в рантайме, и хочу, чтобы в дизайнтайме невозможно было изменить его размер,
подобно любому невизуальному стандартному компоненту. Пробовал добавить следующий код в обработчик
OnSetObjectRects:
Этот код действительно запрещает изменять размер компонента, но он никак не влиет на размер растягивающий
рамки(той, на которой находятся квадратики в углах и в центре граней :)), ее размер я могу менять без проблем.
Кто-нибудь может подсказать, как добиться того, чтобы и размер этой рамки возвращался к размеру компонента
после окончания изменения размера?
Здравствуйте 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;
}
Пробовал изменять значение 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; >} > >Давно писал такой контрол, возможно что-то и упустил. > >
}
>Здравствуйте 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; >>} >> >>Давно писал такой контрол, возможно что-то и упустил. >> >>
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;
}
Но например, если в VB я кладу его наформу, выбрав в меню компонентов и затем растянув
на ворме, то первоначально он принимает размер, на который я его растянул, а не тот, который
указан в SetControlSize. А вот потом уже ведет себя так, как мне надо (не позволяет изменение расмера).
А если его тыстировать в ActiveX Control Test Container, то вообще себя странно ведет.
Почему не будет выполнятся?
В конструкторе нужно проинициализировать 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;
>Здравствуйте 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); >> >>} >> >