Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.10.2007, 18:56   #1
exolot128
.Net C# програмер
 
Регистрация: 06.10.2007
Сообщений: 5
Стрелка Рисование графики на Win Api помогите

Нужно написать програмку с помощью Win API , в которой рисуется круг, и при нажатии мышкой на етот круг его можно было бы перетягивать на форме.

как рисовать круг я разобрался:
Код:

HBRUSH hbr = CreateSolidBrush(RGB(200,200,200));

case WM_PAINT:                                // обработка сообщения WM_PAINT

              hdc=BeginPaint(hWnd,&ps);      //  получаем разрешение рисовать

              GetClientRect(hWnd,&rect);       // определяем размеры рабочей области


              SelectObject(hdc,hbr);   //выбираем кисть другого цвета

                  Ellipse   (hdc, 50,50,150,150) ; //рисуем круг

               EndPaint(hWnd,&ps);       // заканчиваем рисовать

              break;                     // выход из конструкции switch()
а вот как проверить нажатие мышкой именно в етом Ellipce и сделать перетаскивание не могу понять, напишите пожалуйста пример

ЗЫ: желательно на C++ Builder 6
exolot128 вне форума Ответить с цитированием
Старый 06.10.2007, 19:42   #2
SkyM@n
Laravel/Vue expert
Старожил Подтвердите свой е-майл
 
Аватар для SkyM@n
 
Регистрация: 08.08.2007
Сообщений: 2,832
По умолчанию

Если вопрос в проверке нажатия указателем, то при чем здесь название темы "Рисование графики на Win Api помогите"?

На счет вопроса, то просто проверяйте в событии MouseMove текущее положение курсора. Например , если оно за пределами какой-то области, то реагировать по-другому. А что вы хотите реализовать?
SkyM@n вне форума Ответить с цитированием
Старый 06.10.2007, 19:55   #3
exolot128
.Net C# програмер
 
Регистрация: 06.10.2007
Сообщений: 5
Смущение

Цитата:
Сообщение от SkyM@n Посмотреть сообщение
Если вопрос в проверке нажатия указателем, то при чем здесь название темы "Рисование графики на Win Api помогите"?

На счет вопроса, то просто проверяйте в событии MouseMove текущее положение курсора. Например , если оно за пределами какой-то области, то реагировать по-другому. А что вы хотите реализовать?

большое спасибо за пример...........

а на счет названия темы то меня кроме MouseMove интересует как перерисовать Ellipce c новыми координатами(самое главное как ети координаты получить)
exolot128 вне форума Ответить с цитированием
Старый 06.10.2007, 20:04   #4
SkyM@n
Laravel/Vue expert
Старожил Подтвердите свой е-майл
 
Аватар для SkyM@n
 
Регистрация: 08.08.2007
Сообщений: 2,832
По умолчанию

Цитата:
Сообщение от exolot128 Посмотреть сообщение
большое спасибо за пример...........

а на счет названия темы то меня кроме MouseMove интересует как перерисовать Ellipce c новыми координатами(самое главное как ети координаты получить)
Какой пример?
А коррдинаты ты никак не получишь. Разве что, можешь считать побитово через контекст устройства для дальнейшего анализа, но это двлеко не оптимальный и главное, медленный вариант.
SkyM@n вне форума Ответить с цитированием
Старый 06.10.2007, 20:11   #5
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Написать не напишу, в чистом WinAPI не силен, могу на пальцах объяснить.
Нужна bool переменная, чтобы определять просто мышкой водим - false, или таскаем - true
bool drag;
По нажатию левой кнопки мыши (если оно в пределах круга) присваиваем ей true, при отпускании (в любом случае) false.
По движению мыши, если drag == true изменяй коодинаты отрисовки круга и вызывай WM_PAINT, вот и все.

p.s. а координаты узнавай из сообщения MOUSE_MOVE (или как там его).
Если хочешь красиво чтоб было, т.е. в каком месте взял, за него же и таскалось (а не так чтобы от указателя мыши рисовалось) то надо еще две int переменные - смещение по осям X и Y, то есть
координата отрисовкиX = координата мышиX - смещениеX
то же для Y
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 06.10.2007 в 20:28.
mutabor вне форума Ответить с цитированием
Старый 06.10.2007, 20:31   #6
SkyM@n
Laravel/Vue expert
Старожил Подтвердите свой е-майл
 
Аватар для SkyM@n
 
Регистрация: 08.08.2007
Сообщений: 2,832
По умолчанию

Цитата:
Сообщение от mutabor Посмотреть сообщение
p.s. а координаты узнавай из сообщения MOUSE_MOVE (или как там его)
Аффтар имел ввиду получение координат самой нарисованной фигуры, что сделать нельзя. Можно с самого начала их запомнить и контроллировать их значения в переменной или массиве (если фигур несколько). То, что рисованное вне области определения среды программирования (буть то Дельфи или Бейсик) - доступно для контрля и/или анализа также ВНЕ среды. То есть нарисовал на АПИ - тем же АПИ и читаешь/управляешь. Управлять можно теми обьектами, у каких есть хендлер. Поскольку фигура эллипс - не обьект, - ты не сможешь его захватить. Вожно лишь захватить DC и работать битово с ним.
Кстати, на каком языке делаете?
SkyM@n вне форума Ответить с цитированием
Старый 06.10.2007, 22:37   #7
exolot128
.Net C# програмер
 
Регистрация: 06.10.2007
Сообщений: 5
По умолчанию

Цитата:
Сообщение от SkyM@n Посмотреть сообщение
Аффтар имел ввиду получение координат самой нарисованной фигуры, что сделать нельзя. Можно с самого начала их запомнить и контроллировать их значения в переменной или массиве (если фигур несколько). То, что рисованное вне области определения среды программирования (буть то Дельфи или Бейсик) - доступно для контрля и/или анализа также ВНЕ среды. То есть нарисовал на АПИ - тем же АПИ и читаешь/управляешь. Управлять можно теми обьектами, у каких есть хендлер. Поскольку фигура эллипс - не обьект, - ты не сможешь его захватить. Вожно лишь захватить DC и работать битово с ним.
Кстати, на каком языке делаете?
нет мне можно лиш получать координаты MOUSE_MOVE и прибавлять разницу с предыдущими координатами MOUSE_MOVE к координатам прорисовки ellipce

на счет языка я писал в самом начале на С++
exolot128 вне форума Ответить с цитированием
Старый 06.10.2007, 22:51   #8
SkyM@n
Laravel/Vue expert
Старожил Подтвердите свой е-майл
 
Аватар для SkyM@n
 
Регистрация: 08.08.2007
Сообщений: 2,832
По умолчанию

Цитата:
Сообщение от exolot128 Посмотреть сообщение
нет мне можно лиш получать координаты MOUSE_MOVE и прибавлять разницу с предыдущими координатами MOUSE_MOVE к координатам прорисовки ellipce
Ну так а в чем проблема? Получить координаты MOUSE_MOVE разве так сложно?
SkyM@n вне форума Ответить с цитированием
Старый 06.10.2007, 23:45   #9
exolot128
.Net C# програмер
 
Регистрация: 06.10.2007
Сообщений: 5
По умолчанию

УРАААА!!!!!! получилось почти то что я хотел!!!!!

всем спасибо

единственное что я не сделал, может вы мне подскажите, при прорисовке ellipce вводятся координаты верхней левой и нижней правой точки прямоугольника в который вписывается елипс, но получается что если нажимать мышку за елипсом там где углы прямоугольника елипс можно перетягивать, а мне нужно так сделать чтобы перетягивать можно было только при нажатии на елипс, может хто-нибудь знает как ето сделать?


Код:
 LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam,  LPARAM lParam)

{  HDC hdc;

   PAINTSTRUCT ps;

   RECT  rect;

   HBRUSH hbr = CreateSolidBrush(RGB(200,200,200));
   HBRUSH hbr2 = CreateSolidBrush(RGB(255,255,255));

   static POINT apt[4] ;
   static int a=0,i=0,p[4]={50,50,150,150},r[4]={0,0,0,0};



   switch( uMsg )

   {

      case WM_MOUSEMOVE:

                if (a==1) {

               if (wParam & MK_LBUTTON )
                    {
                    hdc = GetDC (hWnd) ;

                    apt[1].x = LOWORD (lParam) ;
                    apt[1].y = HIWORD (lParam) ;



                        SelectObject (hdc, GetStockObject (WHITE_PEN)) ;
                        SelectObject(hdc,hbr2);

                        Ellipse   (hdc, p[0]+r[0],p[1]+r[1],p[2]+r[2],p[3]+r[3]) ;  
                        i=1;

                        r[0]=(apt[1].x-apt[0].x); 
                        r[2]=(apt[1].x-apt[0].x);
                        r[1]=(apt[1].y-apt[0].y);
                        r[3]=(apt[1].y-apt[0].y);


                        SelectObject (hdc, GetStockObject (BLACK_PEN)) ;
                        SelectObject(hdc,hbr);

                        Ellipse   (hdc, p[0]+r[0],p[1]+r[1],p[2]+r[2],p[3]+r[3]) ;

                    ReleaseDC (hWnd, hdc) ;
                    }
                }

               return 0 ;

      case WM_PAINT:                                



              hdc=BeginPaint(hWnd,&ps);      

              GetClientRect(hWnd,&rect);       

              SelectObject(hdc,hbr);

              if (i!=1)
                  Ellipse   (hdc, p[0],p[1],p[2],p[3]) ;        

              EndPaint(hWnd,&ps);       

              break;                     


      case WM_LBUTTONDOWN :              

               apt[0].x = LOWORD (lParam) ;
               apt[0].y = HIWORD (lParam) ;

        
               //проверка на нажатие мышкой в елипсе(получается проверка координат квадрата а нужно проверку координат елипса)
        
               if ( apt[0].x >= p[0] & apt[0].y>=p[1] & apt[0].x<=p[2] & apt[0].y<=p[3] )
               {
                        a=1;
               }

              InvalidateRect(hWnd,NULL,false);

                                  
                                   break;
       case WM_LBUTTONUP :
                a=0; p[0]=p[0]+r[0];p[1]=p[1]+r[1];p[2]=p[2]+r[2];p[3]=p[3]+r[3];
                break;

       case WM_DESTROY :      

              PostQuitMessage(0);

              break;

      default :

             

            return( DefWindowProc( hWnd, uMsg, wParam, lParam ) );

   }

   return( 0L );      

}
может хто нибудь поможет разобратся юному програмеру, вот исходники:

PS: писалась прога на Borland C++ Builder 6
Вложения
Тип файла: rar исходники и екзешник.rar (197.4 Кб, 42 просмотров)
exolot128 вне форума Ответить с цитированием
Старый 07.10.2007, 01:06   #10
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

ну раз ты юный ты наверное еще не забыл геометрию -
Пифагоровы штаны и прочее
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Графики в БД ~LiS~ БД в Delphi 1 05.06.2008 22:19
графики ZhekON Помощь студентам 6 10.04.2008 18:14
Графики delphin100 Общие вопросы Delphi 6 16.03.2008 10:40