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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2012, 20:34   #1
kira_truelove
Пользователь
 
Регистрация: 04.12.2009
Сообщений: 14
По умолчанию Delphi. Перемещение региона мышью.

Здравствуйте! Необходимо выпонить задание:
В рабочей области окна существует единственный объект, представляющий собой геометрическую фигуру, отличную от прямоугольника (например, круг или треугольник). Нажатием цифровых клавиш 1..8 цвет объекта изменяется на один из 8 возможных. Стрелками осуществляется перемещение объекта на 1 пиксел в любую из 4 сторон. Предусмотреть также возможность перетаскивания объекта мышью.

Круг у меня стрелками двигается, цвет тоже меняет, но вот как сделать перемещение его мышью - ума не приложу
kira_truelove вне форума Ответить с цитированием
Старый 27.11.2012, 20:34   #2
kira_truelove
Пользователь
 
Регистрация: 04.12.2009
Сообщений: 14
По умолчанию

Код:
program LAB5;     {FFSoft}

uses windows,
  messages,
  sysUtils; {Служебные функции Дельфи для форматирования строк и т.д.}
type TKeyboardState=array [0..255] of byte;
var
    red,green,blue: byte;

function WndProc(hWnd: THandle; Msg: integer;
                 wParam: longint; lParam: longint): longint;
                 stdcall; forward;

procedure WinMain; {Основной цикл обработки сообщений}
  const szClassName='Shablon';
  var   wndClass:TWndClassEx;
        hWnd: THandle;
        msg:TMsg;

begin
  wndClass.cbSize:=sizeof(wndClass);
  wndClass.style:=cs_hredraw or cs_vredraw;
  wndClass.lpfnWndProc:=@WndProc;
  wndClass.cbClsExtra:=0;
  wndClass.cbWndExtra:=0;
  wndClass.hInstance:=hPrevInst;
  wndClass.hInstance:=hInstance;
  wndClass.hIcon:=loadIcon(0, idi_Application);
  wndClass.hCursor:=loadCursor(0, idc_Arrow);
  wndClass.hbrBackground:=GetStockObject(white_Brush);
  wndClass.lpszMenuName:=nil;
  wndClass.lpszClassName:=szClassName;
  wndClass.hIconSm:=loadIcon(0, idi_Application);

  RegisterClassEx(wndClass);

  hwnd:=CreateWindowEx(
         0,
         szClassName, {имя класса окна}
         'Лабораторная работа №5.Бригада №2',    {заголовок окна}
         ws_overlappedWindow,     {стиль окна}
         cw_useDefault,           {Left}
         cw_useDefault,           {Top}
         500,                     {Width}
         200,                     {Height}
         0,                       {хэндл родительского окна}
         0,                       {хэндл оконного меню}
         hInstance,               {хэндл экземпляра приложения}
         nil);                    {параметры создания окна}

  ShowWindow(hwnd,sw_Show);  {отобразить окно}
  updateWindow(hwnd);   {послать wm_paint оконной процедуре, прорисовав
                         окно минуя очередь сообщений (необязательно)}

  while GetMessage(msg,0,0,0) do begin {получить очередное сообщение}
    TranslateMessage(msg);   {Windows транслирует сообщения от клавиатуры}
    DispatchMessage(msg);    {Windows вызовет оконную процедуру}
  end; {выход по wm_quit, на которое GetMessage вернет FALSE}
end;

function WndProc(hWnd: THandle; Msg: integer; wParam: longint; lParam: longint): longint; stdcall;

var ps:TPaintStruct;
      hdc,newBrush,Elli:THandle;
      rect:TRect;
      Point: TPoint;
      s,s_red,s_green,s_blue:shortstring; //Строка как в Турбо-Паскале
      flag: boolean;  // флаг перерисовки окна
const x1:integer=0;
      y1:integer=0;
begin
  result:=0;
  case Msg of

    wm_paint:
      begin
        hdc:=BeginPaint(hwnd,ps); //Удалить WM_PAINT из очереди и начать рисование
        //GetClientRect(hwnd,rect);
        Elli:=CreateEllipticRgn(x1,y1,x1+100,y1+100);
        newBrush:=CreateSolidBrush(RGB(red,green,blue));    //кисть
        FillRgn(hdc,Elli,newBrush);
      end;

    WM_KEYDOWN:
      begin
         flag:=FALSE;
         if ((GetKeyState(VK_SHIFT) and $80)<>0) then  // $80 = 80h = 10000000b
          begin
            if ((GetKeyState(82) and $80)<>0) then
              red:=red+1;
            if ((GetKeyState(71)and $80)<>0) then
              green:=green+1;
            if ((GetKeyState(66)and $80)<>0) then
              blue:=blue+1;
            flag:=TRUE;
          end
         else
          begin
            if ((GetKeyState(49) and $80)<>0) then
              red:=100;
            if ((GetKeyState(50)and $80)<>0) then
              green:=100;
            if ((GetKeyState(51)and $80)<>0) then
              blue:=100;
            if ((GetKeyState(52) and $80)<>0) then
              red:=red+155;
            if ((GetKeyState(53)and $80)<>0) then
              green:=green+155;
            if ((GetKeyState(54)and $80)<>0) then
              blue:=blue+156;
            if ((GetKeyState(55) and $80)<>0) then
              red:=red+1;
            if ((GetKeyState(56)and $80)<>0) then
              green:=green+1;
            flag:=TRUE;
          end;
          if (flag=TRUE) then
            begin
              invalidaterect(hwnd,nil,true);
              updateWindow(hwnd); //Перерисовать окно сейчас же, не дожидаясь опустошения очереди
            end;

        case wParam of
          vk_up: dec(y1); // Движение надписи стрелками
          vk_down: inc(y1);
          vk_left: dec(x1);
          vk_right: inc(x1);
          vk_escape: begin x1:=0; y1:=0; end; // Вернуть по умолчанию
        else
          Flag:=false; // иначе надпись не двигалась
        end;
        if Flag then begin // Если надпись двигалась
          invalidaterect(hwnd,nil,true);
          updateWindow(hwnd); //Перерисовать окно сейчас же, не дожидаясь опустошения очереди
        end;
      end;
    wm_destroy:
      PostQuitMessage(0);


    else
      result:=DefWindowProc(hwnd,msg,wparam,lparam);
  end;
end;



begin
  WinMain;
end.
kira_truelove вне форума Ответить с цитированием
Старый 29.11.2012, 00:34   #3
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Ну, например, поймай событие нажатия левой кнопки мыши. Если в момент нажатия мышь была на фигуре - установи флаг в true. Сбрасывай флаг в false после получения события отпускания кнопки.
А потом лови событие перемещения мыши; и двигай фигуру соответственно, если флаг = true.
Все просто же.
Son Of Pain вне форума Ответить с цитированием
Старый 29.11.2012, 09:51   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Ну не так просто. Когда нажимается кнопка надо еще и запомнить координаты и потом при движениях мыши брать новые координаты, вычислять относительное перемещение (относительно старых координат) и потом двигать фигуру на относительное число точек. И не забывать обновлять сохраненные координаты.
waleri вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
выбор региона 6666 JavaScript, Ajax 3 02.02.2012 22:57
изменение размера региона adugent Win Api 0 19.12.2011 16:54
Перемещение мышью динамического TEdit в runtime singularity.storm Помощь студентам 1 15.06.2011 08:24
перемещение (перетаскивание) формы мышью segail Microsoft Office Excel 1 26.07.2010 12:50
Перемещение окна мышью за Image Viteef Общие вопросы Delphi 2 03.05.2007 23:48