MFC изменнить рамеры главно окна

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
nick1988
Сообщения: 4
Зарегистрирован: 07 янв 2010, 20:15

Не могу ни как изменить программно размеры главного окна, пробовал вот так:

Код: Выделить всё

LPRECT str;
str->left = 10;
str->top = 10;
str->right = 300;
str->bottom = 300;
AfxGetMainWnd()->MoveWindow(str);
Выдает ошибку выполнения:

Run-Time Check Failure #3 - The variable 'str' is being used without being initialized.

Нужен рабочий пример или ссылку по теме
Newbie
Сообщения: 148
Зарегистрирован: 06 сен 2009, 19:45

можно менять на прямую

CWnd* m_hWnd = AfxGetApp()->GetMainWnd();
m_hWnd->MoveWindow(0,0,100,100);

через структуру можно сделать так:
CWnd* m_hWnd = AfxGetMainWnd();
RECT rect;
rect.left = 10;
rect.top = 10;
rect.right = 300;
rect.bottom = 300;
LPRECT r = ▭
m_hWnd->MoveWindow(r);


В примере ошибка в том, что LPRECT это указатель на структуру, а не сама структура.
nick1988
Сообщения: 4
Зарегистрирован: 07 янв 2010, 20:15

Newbie писал(а):можно менять на прямую

CWnd* m_hWnd = AfxGetApp()->GetMainWnd();
m_hWnd->MoveWindow(0,0,100,100);

через структуру можно сделать так:
CWnd* m_hWnd = AfxGetMainWnd();
RECT rect;
rect.left = 10;
rect.top = 10;
rect.right = 300;
rect.bottom = 300;
LPRECT r = ▭
m_hWnd->MoveWindow(r);


В примере ошибка в том, что LPRECT это указатель на структуру, а не сама структура.

Спасибо все работает, только как узнать начальное положение окна? чтобы не менять положение окна а только его размеры?
Newbie
Сообщения: 148
Зарегистрирован: 06 сен 2009, 19:45

извратно канешна, но можно так
CWnd* m_hWnd = AfxGetMainWnd();
WINDOWINFO pwi;
m_hWnd->GetWindowInfo(&pwi);
RECT r = pwi.rcWindow;
r.bottom += 100;
r.right += 100;
m_hWnd->MoveWindow(&r);
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

nick1988 писал(а):

Код: Выделить всё

LPRECT str;
str->left = 10;
str->top = 10;
str->right = 300;
str->bottom = 300;
AfxGetMainWnd()->MoveWindow(str);

Выдает ошибку выполнения:

Run-Time Check Failure #3 - The variable 'str' is being used without being initialized.
Внимательнее относись к типам: LPRECT - это указатель на структуру RECT, а не объект. Поскольку он ни куда не указывает (не инициализирован), возникает ошибка при выполнении программы (строка str->left = 10; пытается записать значение по недопустимому адресу). Правильнее было бы так:

Код: Выделить всё

RECT str;
str->left = 10;
str->top = 10;
str->right = 300;
str->bottom = 300;
AfxGetMainWnd()->MoveWindow(&str);
nick1988
Сообщения: 4
Зарегистрирован: 07 янв 2010, 20:15

Всем спасибо за помощь в итоге получилось во что:

Код: Выделить всё

	//Установить размеры окна
	RECT rect;
	LPRECT prect = ▭

	CWnd* m_hWnd = AfxGetApp()->GetMainWnd();

	m_hWnd->GetWindowRect(prect);

	(*prect).right = (*prect).left + 300;
	(*prect).bottom = (*prect).top + 300;

	m_hWnd->MoveWindow(prect);
Вот еще какой вопрос. При данном способе меняется размер окна в целом, как изменить размер клиентской области окна?
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Обработать сообщение WM_NCCALCSIZE. Вообще почитай в MSDN описание сообщений WM_NC*, все они предназначены для работы с Non Client (отсюда сокращение) частью окна.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить