Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > SetWindowPos()


Автор: S.A.G. 20.7.2009, 15:51
Код

static WINDOWINFO StWInfo;

StWInfo.cbSize = sizeof(WINDOWINFO);

GetWindowInfo(hStatic1, &StWInfo);

unsigned ucx, ucy, uleft, uright, utop, ubottom;

uleft = StWInfo.rcWindow.left;
uright = StWInfo.rcWindow.right;
utop = StWInfo.rcWindow.top;
ubottom = StWInfo.rcWindow.bottom;
ucx = uright - uleft;
ucy = ubottom - utop;
    
SetWindowPos(hStatic1, 0, uleft + 1, utop, 0, 0, SWP_NOZORDER | SWP_NOSIZE);


Почему не проходит последний вызов? Что нужно делать с параметрами, которые не используются? Есть ли еще какие-то функции, которые позволяют сдвинуть контрол?

Автор: niteo 20.7.2009, 16:08
По идее этого достаточно. Только не понятно, он у тебя исчезает 
Цитата

SetWindowPos(), приводит к исчезанию контрола 

или не двигается????
Цитата

Почему не проходит последний вызов?


Если исчезает, пробуй убрать флаг SWP_NOZORDER

Флаг SWP_NOSIZE грит что 5 и 6 параметр не используются, это точки нижнего правого угла окна. А так сматри MSDN.

Автор: GremlinProg 20.7.2009, 16:40
Цитата(S.A.G. @  20.7.2009,  17:51 Найти цитируемый пост)
StWInfo.rcWindow

это координаты окна относительно левого-верхнего угла экрана, а SetWindowPos ждет координат относительно родительского окна
т.е. перед SetWindowPos нужно их преобразовать:
Код

::MapWindowPoints(HWND_DESKTOP,GetAncestor(hStatic1,GA_PARENT),(POINT*)&StWInfo.rcWindow,2);

Цитата(niteo @  20.7.2009,  18:08 Найти цитируемый пост)
это точки нижнего правого угла окна

это ширина и высота окна

Добавлено через 1 минуту и 16 секунд
кстати есть функция попроще GetWindowInfo:
GetWindowRect

Автор: S.A.G. 20.7.2009, 17:09
GremlinProg, спасибо, невнимательный я что-то

Автор: DrHex 21.7.2009, 11:26
MoveWindow - вроде быстрее(наверное из за перересовки)

Автор: Andrey44 21.7.2009, 12:39
Цитата(DrHex @  21.7.2009,  11:26 Найти цитируемый пост)
MoveWindow - вроде быстрее(наверное из за перересовки) 

MoveWindow - внутри себя вызывает апишную функцию. Отгадайте с трех раз какую? smile 

Автор: DrHex 21.7.2009, 13:11
Упс......

Автор: S.A.G. 21.7.2009, 16:04
GremlinProg, а существует ли функция, которая сразу возвращает координаты контрола в клиентских координатах родительского окна?

Автор: GremlinProg 21.7.2009, 16:24
Цитата(S.A.G. @  21.7.2009,  18:04 Найти цитируемый пост)
а существует ли функция, которая сразу возвращает координаты контрола в клиентских координатах родительского окна?

нет, неприпомню такого

а в чем проблема?

если боишься запутаться, то MapWindowPoints в данном случае можно заменить на ScreenToClient:
Код

::ScreenToClient( parent, (POINT*)&rc.left );
::ScreenToClient( parent, (POINT*)&rc.right );

parent - дескриптор родительского окна
rc - экранные координаты дочернего окна
так немного проще, хотя суть от этого не меняется

Автор: S.A.G. 21.7.2009, 17:13
GremlinProg, спс, применил мап, просто я думал, может есть функция, которая возвращает сразу в клиентских - на один вызов было бы меньше.

Автор: GSasha 21.7.2009, 18:39
GetClientRect - не пробовал?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)