Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GetClientRect- в чем ошибка? возвращает нули... 
:(
    Опции темы
Dreamer_0x01
Дата 23.5.2005, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Имеется диалог, в нем есть контрол. В некоторых ситуациях мне необходимо срыть контрол, а на его месте нарисовать окошко, производное от CWnd.

Делаю приблизительно так.

В вунксии OnInitDialog() пишу следующий код

Код

MyObj *mo; //MyObj - класс, происводный от CWnd
//mo проинициализирован и создан с помощью Create(....,this,...)
CWnd *temp;
temp=GetDlgItem(IDC_MY_CONTROL);
//IDC_MY_CONTROL - в данном случае статик текст на диалоге
CRect rect;
temp->GetClientRect(rect);
mo->SetWindowPos(this,r.left,r.top,0,0,SWP_NOSIZE|SWP_NOZORDER);
mo->ShowWindow(SW_SHOW);


В результате внутри диалога появляется объект моего класса, размером равный размеру контрола, но расположенный не на месте его, а в левом верхнем углу диалога.

где я напутал??


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Dreamer_0x01
Дата 23.5.2005, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



smile
Блин, только что нашел путь решения, но мне он не нравится.
Вместо GetClientRect() теперь использую следующую конструкцию:

Код

    WINDOWPLACEMENT lpwndpl;
    temp->GetWindowPlacement(&lpwndpl);
    rect=CRect(lpwndpl.rcNormalPosition);


Но структура WINDOWPLACEMENT содержит в основном инфу, касающуюся минимизации, максимизации, нормального состояния окна, которое я как раз использую, и прочую фигню.

Мне кажется, что такое решение не очень рациональное, ведь должно же быть решение проблемы что называется в одно действие, а у меня такое чувство, что я из пушки по воробьям пальнул, а потом еще котлован ложкой выкопал, а не эксковатором. smile


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
kometa_triatlon
Дата 23.5.2005, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



Ты куда получаешь координаты? В rect? Тогда что такое r.left? Может rect.left?
Кроме того, есть такая функция ScreenToClient(&rect); - попробуй использовать.

Кстати, насчет экскаватора я бы не переживал. Классы вообще вещь громоздкая. Посчитай, сколько нужно всего выполнить, чтобы инициализировать ту же кнопку.

Ну да, конечно! Я и сам сначала не заметил. GetClientRect(&rect); !!!! В качестве параметра функция принимает указатель на CRect. Так что амперсанд не забываем...

Это сообщение отредактировал(а) kometa_triatlon - 23.5.2005, 20:40


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
Dreamer_0x01
Дата 23.5.2005, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Цитата

В качестве параметра функция принимает указатель на CRect. Так что амперсанд не забываем...


Проюовал и так и так, причем в MSDN нашел, что оператор LPRECT преобразует CRect в RECT таким образом, что амперсанда не требуется.
Кроме того, при двойной буферезации (помнишь пример) там было именно без амперсанда, и все работало, так что не в этом дело.

Цитата

Ты куда получаешь координаты? В rect? Тогда что такое r.left? Может rect.left?

да, очепятался ;)
rect.left, все правильно.

Цитата

Кстати, насчет экскаватора я бы не переживал. Классы вообще вещь громоздкая. Посчитай, сколько нужно всего выполнить, чтобы инициализировать ту же кнопку.


Вот это мне как раз и не нравится. Раз уж классов до дури написано, то не просто так их писали, и наверное предполагается их использование именно в таком виде, как предполагалось разработчиками, а не через одно место. Хотя, ни раз убеждался, что именно через это место у них часто все и делается ;)

Просто под винды я программирую мало, основные мои проги пишу для микроконтроллеров, а вот там каждый бит кода на счету, отсюда привычка писать код более оптимальный, если это в пределах разуменого и доступного для понимания.


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Dov
Дата 23.5.2005, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: нет
Всего: 88



Код
    CRect rect;
GetDlgItem(IDC_MY_CONTROL)->GetWindowRect(rect);
ScreenToClient(rect); 
mo->MoveWindow(rect);
mo->ShowWindow(SW_SHOW);

По-моему так.



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Coocky
Дата 25.5.2005, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Dreamer_0x01
Тебе нужно перевести координаты из клиентской области в область окна. ClientToScreen()


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
kometa_triatlon
Дата 25.5.2005, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



Цитата
Кроме того, есть такая функция ScreenToClient(&rect); - попробуй использовать.


!!!!!!!!!!!!!!!!!!!!



--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
Dreamer_0x01
Дата 26.5.2005, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Coocky,
kometa_triatlon,
Dov -
Спасибо!!!




--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0506 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.