powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / MoveWindow
8 сообщений из 8, страница 1 из 1
MoveWindow
    #32788293
Alex_VC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема заключается в следующем: имеется диалоговое окно, на нем разные контролы (в том числе ActiveX).
Делаю Resizing контролов при изменении размеров окна. Все работало ОК.
Но решил я избавиться от mfc-ового CWnd (использовал от него метод MoveWindow для изменения позиции и размера контрола).
Решил пользоваться апишным MoveWindow. Опять все хорошо, только у ActiveX элемента одного есть Scroll Bar (сделан дочерним окном от основного окна контрола). Так вот основное окно данного ActiveX меняет размеры и положение, а эти скролл бары -нет (при пользовании CWnd - было все ОК).
Вопрос: может кто знает в чем дело ? (может необходимо досылать доп. сообщения, которое не делает апишная MoveWindow, какие ?)

Спасибо за внимание...
...
Рейтинг: 0 / 0
MoveWindow
    #32788890
Siebentearbeit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MFC
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
void CWnd::MoveWindow(int x, int y, int nWidth, int nHeight, BOOL bRepaint)
{
	ASSERT(::IsWindow(m_hWnd));

	if (m_pCtrlSite == NULL)
		::MoveWindow(m_hWnd, x, y, nWidth, nHeight, bRepaint);
	else
		m_pCtrlSite->MoveWindow(x, y, nWidth, nHeight, bRepaint);
}

где
	COleControlSite* m_pCtrlSite;       // for wrapping an OLE control

...
Рейтинг: 0 / 0
MoveWindow
    #32789118
Alex_VC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А по хендлу контрола можно выяснить что это OLE -элемент? (если можно, то как?)
Спасибо.
...
Рейтинг: 0 / 0
MoveWindow
    #32790391
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хмм.. первый способ приходящий в голову труден и долог.

А попробуй сначала отослать ему WM_SIZE,

с другой стороны, если у тебя контрол на форме, ты должен "знать" его хэндл, или указатель на сам объект, через который и можно получить доступ к методу MoveWindow cамого объекта
...
Рейтинг: 0 / 0
MoveWindow
    #32790686
Alex_VC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbХмм.. первый способ приходящий в голову труден и долог.

А попробуй сначала отослать ему WM_SIZE,

с другой стороны, если у тебя контрол на форме, ты должен "знать" его хэндл, или указатель на сам объект, через который и можно получить доступ к методу MoveWindow cамого объекта

WM_SIZE - не помогает, т.к. MoveWindow окромя данного сообщения посылает еще несколько сообщений (до WM_SIZE и после).
Хендл контрола знаю (передаю его в объект класса производящего resizing).
Пытаюсь выполнить ::MoveWindow(hWnd,...) (hWnd-хендл контрола): главное окно (рамка) контрола- масштабируется -внутренности нет. Как продемонстрировал Siebentearbeit MFC для OLE-контролов вызывает их собственный метод MoveWindow.
Попробовать чтоль вместе с хендлом еще и ссылку на объект для данных контролов передавать ?
Это будет не очень красиво или нормально?
Или оставить MFC ?
...
Рейтинг: 0 / 0
MoveWindow
    #32790796
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siebentearbeit зря не скажет... :)

в MFC-шной версии дёргается метод самого контрола, я надеялся, что WM_SIZE cпровоцирует вызов этого метода,.. ан нет...
(кстати, интересно, чё будет, если контрол такой метод не поддерживает?...)

авторПопробовать чтоль вместе с хендлом еще и ссылку на объект для данных контролов передавать ?
Передавать куда?
Тебе надо просто взять и вызвать pMyOLEObj->MoveWindow(...)
...
Рейтинг: 0 / 0
MoveWindow
    #32791235
Alex_VC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb
Передавать куда?
Тебе надо просто взять и вызвать pMyOLEObj->MoveWindow(...)
Дык, я же говорю, что у меня есть класс, который всем этим безобразием (в смысле масштабирования) занимается и нужно какое-то однообразие в обработке масштабирования контролов: в класс передается хендл диалогового окна, устанавливаются параметры масштабирования и далее на OnSize(...) окна вызывается метод объекта масштабирования, который все контролы на диалоговом окне располагает в соответствии с заданными параметрами. А ежли для таких "особых" контролов отдельно pMyOLEObj->MoveWindow(...) делать: как-то неуклюже получается...
...
Рейтинг: 0 / 0
MoveWindow
    #32792070
Siebentearbeit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо тебе, СЕМЬ, на добром слове :)

Итак...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
void COleControlSite::MoveWindow(int x, int y, int nWidth, int nHeight, BOOL)
{
	ASSERT(m_pInPlaceObject != NULL);
	ASSERT(m_pObject != NULL);

	CRect rectOld(m_rect);
	m_rect.SetRect(x, y, x + nWidth, y + nHeight);
	if (SetExtent())
	{
		m_rect.SetRect(x, y, x + m_rect.Width(), y + m_rect.Height());
		m_pInPlaceObject->SetObjectRects(m_rect, m_rect);
	}
	else
	{
		m_rect = rectOld;
	}
}
Далее зовёт...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
BOOL COleControlSite::SetExtent()
{
	CSize size(m_rect.Size());
	CClientDC dc(NULL);
	dc.DPtoHIMETRIC(&size);

	HRESULT hr;

	if (SUCCEEDED(hr = m_pObject->SetExtent(DVASPECT_CONTENT, (SIZEL*)&size)))
	{
		if (SUCCEEDED(m_pObject->GetExtent(DVASPECT_CONTENT, (SIZEL*)&size)))
		{
			dc.HIMETRICtoDP(&size);
			m_rect.right = m_rect.left + size.cx;
			m_rect.bottom = m_rect.top + size.cy;
		}
	}

	return SUCCEEDED(hr);
}

где m_pObject - это LPOLEOBJECT, описаный в SDK в ole.h

а вот как оно у этого объкта SetExtent зовёт... я уже не понял... ибо нету его там... Так что, имхо, лучше оставить MFC методы, если не критично...
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / MoveWindow
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]