Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перемещение контрола 
:(
    Опции темы
NiJazz
  Дата 16.12.2004, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 2
Всего: 23



Перенести, например, Edit в новое место на форме.
Вот код:
Код

CRect  rect(0, 0, 0, 0);

CEdit*  ed = (CEdit*)GetDlgItem(IDC_EDIT1);
ed->GetWindowRect(rect);
ed->SetWindowPos(NULL, rect.left, rect.top, 0, 0, SWP_NOSIZE);

Edit перекидывается чёрти куда. Хотя должен оставаться на месте. В чём тут дело?
Добавлено @ 16:04
Хотя вот сейчас возникло подозрение, что функция GetWindowRect возвращает координаты относительно всего экрана. Значит, чтобы передвинуть Edit, нужно посчитать координаты формы.

PM MAIL   Вверх
srd
Дата 16.12.2004, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


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

Репутация: 5
Всего: 49



Функция GetWindowRect возвращает позицию и размеры окна в экранных координатах, учитывая заголовок и границы окна. Посколько тебе требуется перемещать контрол внути окна, воспользуйся функцией GetClientRect, которая возвращает размеры окна в "клиентских" координатах.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
NiJazz
Дата 16.12.2004, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 2
Всего: 23



srd
Код

ed->SetWindowPos(NULL, rect.left, rect.top+100, 0, 0, SWP_NOSIZE);

Такое тоже не работает.
Добавлено @ 16:57
Он один только раз перемещает Edit вниз и почему-то налево (!!!) настолько же. А потом уже стоит на месте, сколько кнопку ни нажимай.
PM MAIL   Вверх
srd
Дата 16.12.2004, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


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

Репутация: 5
Всего: 49



Вот пример: edit каждые пол-секунды перескакивает на новое место внутри диалога.
Код

#include <tchar.h>
#include <windows.h>
#include "resource.h"

INT_PTR CALLBACK dlg_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);

int WINAPI _tWinMain(HINSTANCE hInstance,
                    HINSTANCE /* hPrevInstance */,
                    LPTSTR    /* lpCmdLine */,
                    int       nCmdShow)
{
   DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG), 0, dlg_proc);
   return 0;
}

INT_PTR CALLBACK dlg_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
   const UINT timer_id = 1;

   switch (msg)
   {
   case WM_TIMER:
       {
           RECT rc;
           GetClientRect(hwnd, &rc);

           HWND edit = GetDlgItem(hwnd, IDC_EDIT);

           RECT edit_rc;
           GetWindowRect(edit, &edit_rc);

           SetWindowPos(edit,
               0,
               rand() % (rc.right - edit_rc.right + edit_rc.left),
               rand() % (rc.bottom - edit_rc.bottom + edit_rc.top),
               0, 0, SWP_NOZORDER | SWP_NOSIZE);
       }
       break;

   case WM_INITDIALOG:
       SetTimer(hwnd, timer_id, 500, 0);
       break;

   case WM_CLOSE:
       KillTimer(hwnd, timer_id);
       EndDialog(hwnd, IDOK);
       break;

   case WM_DESTROY:
       PostQuitMessage(0);
       break;

   default:
       return FALSE;
   }

   return TRUE;
}

Добавлено @ 17:12
А не работает перемещение edit потому, что GetWindowRect возвращает позицию контрола в экранных координатах, а SetWindowsPos передаваемые ей координаты считает относительно родителя контрола (т.е. самой формы).
Добавлено @ 17:16
Забыл, ресурс диалога такой:
Код

#include "resource.h"
#include <windows.h>

IDD_DIALOG DIALOGEX 0, 0, 314, 173
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION |
   WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
   EDITTEXT        IDC_EDIT,123,69,40,14,ES_AUTOHSCROLL
END

Надеюсь, поможет.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Coocky
Дата 16.12.2004, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


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

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



Можно и по другому.Получи координаты ed->GetWindowRect(rect);Переведи в координаты окна ScreenToClient(rect); и ed->MoveWindow(.......


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


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 2
Всего: 23



Coocky
ScreenToClient(rect); - вот это и надо было! Попробую.
PM MAIL   Вверх
NiJazz
Дата 17.12.2004, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 2
Всего: 23



Не работает. ScreenToClient приводит к тому же результату, что и GetClientRect.
PM MAIL   Вверх
srd
Дата 17.12.2004, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


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

Репутация: 5
Всего: 49



Можешь показать код?


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
NiJazz
Дата 17.12.2004, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 2
Всего: 23



Цитата
Можешь показать код?

См. описание в MSDN. Проще сразу делать GetClientRect

PM MAIL   Вверх
srd
Дата 17.12.2004, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


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

Репутация: 5
Всего: 49



Собственно это и делалось в моём примере. Просто я не понял, что именно надо получить в результате...


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


 




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


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

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