Как программно изменить размер окна?
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.141] |
|
|
Правила раздела Visual C++ / MFC / WTL (далее Раздела)
FAQ Раздела
Обновления для FAQ Раздела
Поиск по Разделу
MSDN Library Online
Как программно изменить размер окна?
|
Сообщ.
#1
,
|
|
|
|
Доброе время суток!
Не подскажете, как изменить программно размер окна в SDI приложении написанного на MFC? |
|
Сообщ.
#2
,
|
|
|
|
SetWindowPos
|
|
Сообщ.
#3
,
|
|
|
|
Спасибо, но ведь там Хендл окна надо указывать, а как его получить?
|
|
Сообщ.
#4
,
|
|
|
|
Если пытаешь изменить положение окна не из класса окна, то можно вот так:
![]() ![]() CMainFrame *pMainFrm = NULL; pMainFrm = (CMainFrame *)m_pMainWnd; if(pMainFrm != NULL); ::SetWindowPos(pMainFrm->m_hWnd,.... |
|
Сообщ.
#5
,
|
|
|
|
MoveWindow можно использовать.
|
|
Сообщ.
#6
,
|
|
|
|
Цитата IEZ @ MoveWindow можно использовать. Это приведет к бОльшему геморрою. |
|
Сообщ.
#7
,
|
|
|
|
Цитата byte @ Это приведет к бОльшему геморрою. А именно? |
|
Сообщ.
#8
,
|
|
|
|
Цитата IEZ @ А именно? У функции SetWindowPos есть последним аргументом флаги, которые как раз и характеризуют действие. То есть чтобы просто установить новый размер окна, надо поставить флаги: SWP_NOMOVE | SWP_NOZORDER которые говорят, что не надо менять положение окна + его Z-порядок. А MoveWindow сразу изменяет положение окна. То есть чтобы окно осталось на том же месте, надо узнать положение окна и передать его параметрами. Лишние движения.. |
|
Сообщ.
#9
,
|
|
|
|
byte, Но Russel, не упомянул для какого окно ему нужно изменить размер (родительское, дочернее).
А так вот пример по таймеру окно меняет размеры. Прикреплённый файл MoveWindow.rar (94.17 Кбайт, скачиваний: 288)
|
|
Сообщ.
#10
,
|
|
|
|
Цитата IEZ @ Но Russel, не упомянул для какого окно ему нужно изменить размер (родительское, дочернее). и как это влияет? Чтобы окно не изменило свое положение, надо перед вызовом MoveWindow его знать, а перед вызовом SetWindowPos - нет. |
|
Сообщ.
#11
,
|
|
|
|
Цитата byte @ Чтобы окно не изменило свое положение, надо перед вызовом MoveWindow его знать Ну и что. Это только одна строка кода добавляется. И в конце концов выбор вариантов за Russel. Вот тот же пример, но окно стоит как вкопаное, изменяя свои размеры. Прикреплённый файл MoveWindow.rar (94.9 Кбайт, скачиваний: 217)
|
|
Сообщ.
#12
,
|
|
|
|
Я уточнил в каком окне - это SDI приложение то бишь - одно окно
|
|
Сообщ.
#13
,
|
|
|
|
Всем большое спасибо за помощь и советы - искренне благодарен
|
|
Сообщ.
#14
,
|
|
|
|
Цитата Kezya @ Если пытаешь изменить положение окна не из класса окна, то можно вот так: ![]() ![]() CMainFrame *pMainFrm = NULL; pMainFrm = (CMainFrame *)m_pMainWnd; if(pMainFrm != NULL); ::SetWindowPos(pMainFrm->m_hWnd,.... Компилятор ругается на m_pMainWnd - не знает что такое... Я все делаю в классе документ |
|
Сообщ.
#15
,
|
|
|
|
![]() ![]() CMyApp* pApp = (CMyApp*)AfxGetApp(); pMainFrm = (CMainFrame*)pApp->m_pMainWnd; |
|
Сообщ.
#16
,
|
|
|
|
Я уже давно догадался, что меня имеет это VC++6
но теперь он не знает что такое CMyApp класс... ААААА |
|
Сообщ.
#17
,
|
|
|
|
Цитата Russel @ - блин.. при чем здесь студия?но теперь он не знает что такое CMyApp класс... ААААА CMyApp - это класс твоего приложения, наследованый от: ![]() ![]() class CMyApp : public CWinApp Добавлено класс приложения у тебя есть однозначно глянь как ты его там обозвал, или мастер нагенерил.. |
|
Сообщ.
#18
,
|
|
|
|
РАБОТАЕТ УРА
|
|
Сообщ.
#19
,
|
|
|
|
Russel, И что сделал?
|
|
Сообщ.
#20
,
|
|
|
|
Russel, - партизан
ни за что не признаеться.. |
|
Сообщ.
#21
,
|
|
|
|
Привожу полный код:
Приложение WinMine Rows & Columns - размеры поля программы САПЕР... вот и все ![]() ![]() void CWinMineDoc::ChangeWindow(int Rows, int Columns) { CWinMineApp* pApp = (CWinMineApp*)AfxGetApp(); CMainFrame *pMainFrm = NULL; pMainFrm = (CMainFrame*)pApp->m_pMainWnd; if(pMainFrm != NULL) ::SetWindowPos(pMainFrm->m_hWnd, NULL, 0, 0, Columns*16+10, Rows*16+10+::GetSystemMetrics(SM_CYMENU)+::GetSystemMetrics(SM_CYCAPTION), SWP_NOMOVE | SWP_NOZORDER); } Всем спасибо за обсуждение |