Модераторы: ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите поправить код, Canvas 
V
    Опции темы
OutlawZ
  Дата 24.7.2010, 04:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 269
Регистрация: 19.10.2007

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



Доброе утро, столкнулся с маленькой проблемой, задача была такая нарисовать на форме клетку и на ней рисовать квадраты такой же ширины и высоты как в клетке, задача была выполнена но поменялось условие, надо сделать так что на какой квадрат нажал пользователь то он должен заполниться выбранным цветом. Вот код программы:

Код

#!perl

use threads;
use Win32::GUI();

 my (
    $MW, %MP, $X, $Y,
    );

 $MR = 40; # Количество клеток по вертикали
 $MC = 40; # Количество клеток по горизонтале
 $LEFT = 0;  # по X
 $TOP  = 1;  # по Y
 $W = 15; # Ширина клетки поля
 $H = 15; # Высота клетки поля
 $status = 0; #0 - Рисуем клетку, 1 - Рисуем символы
 
 $MP{'Menu'}  = Win32::GUI::MakeMenu (
   "&Файл"    => "Файл",
   ">&Цвет"   =>  { -name => "ChooseColor", -onClick => \&Form1_Color},
 ); 
 $MW = new Win32::GUI::Window (
    -name  => "Form1",
    -size  => [800, 700],
    -title => "Клетка",
    -vscroll => 1,
    -menu  => $MP{'Menu'},
 ) or die "$!";
 
 $MW->Center();
 $MW->Show();
  Win32::GUI::Dialog();

 sub Form1_Color {
    $color = Win32::GUI::ChooseColor (
      -owner => $WM,
    );
    $MP{'Brush'} = new Win32::GUI::Brush (
      -color => $color,
    );
 }
 sub Form1_Paint {
    $DC = shift;
    $threads = threads->new(\&ShamePoleShow,$status);
 }
 sub Form1_MouseDown {
    ($X, $Y) = @_;  
        $status = 1;
        ShamePoleShow(); 
 }
 sub ShamePoleShow {
    for($row = 1; $row <= $MR; $row++) {
        for($col = 1; $col <= $MC; $col++) {
            Kletka($row,$col);
        }
    }
 }
 sub Kletka {
    my($row,$col) = @_;
     $x = $LEFT + ($col-1) * $W;
     $y = $TOP  + ($row-1) * $H;
      if( $status == 0) {
       $DC->Rectangle($x-1,$y-1,$x+$W,$y+$H);
       return;
      }
      if( $status == 1) {
       $DC->SelectObject($MP{'Brush'});
       $DC->Rectangle($X-1,$Y-1,$X+$W,$Y+$H);
      }
 }


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


--------------------
user posted image
user posted image
PM MAIL   Вверх
OutlawZ
Дата 28.7.2010, 05:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 269
Регистрация: 19.10.2007

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



Нашел решение задачи, на этом форуме, переписал код, если кому интересно вот решение:
Код

#!perl

use threads;
use Win32::GUI();

 my (
    $MW, %MP, $X, $Y, $SelX,$SelY,
    );

 $MR = 30; # Количество клеток по вертикали
 $MC = 60; # Количество клеток по горизонтале
 $LEFT = 0;  # по X
 $TOP  = 1;  # по Y
 $W = 15; # Ширина клетки поля
 $H = 15; # Высота клетки поля
 $bSelect = 0;
 $MP{'Menu'}  = Win32::GUI::MakeMenu (
   "&Файл"    => "Файл",
   ">&Цвет"   =>  { -name => "ChooseColor", -onClick => \&Form1_Color},
 ); 
 $MW = new Win32::GUI::Window (
    -name  => "Form1",
    -size  => [800, 700],
    -title => "ShameCreate 0.2.3",
    -vscroll => 1,
    -menu  => $MP{'Menu'},
 ) or die "$!";
 
 $MW->Center();
 $MW->Show();
  Win32::GUI::Dialog();

 sub Form1_Color {
    $color = Win32::GUI::ChooseColor (
      -owner => $WM,
    );
    $MP{'Brush'} = new Win32::GUI::Brush (
      -color => $color,
    );
 }
 sub Form1_Paint {
    $DC = shift;
    $threads = threads->new(\&ShamePoleShow);
 }
 sub Form1_MouseDown {
    ($X, $Y) = @_;  
     $posX = ($X - $LEFT) / $W;
     $posY = ($Y - $TOP)  / $H;
      if ($X < $LEFT || $Y < $TOP) 
      {
        $bSelect = 0;
      }
      else
      {
        $bSelect = 1;
        $SelX = int($posX);
        $SelY = int($posY);
        ShamePoleShow();
      }       
 }
 sub ShamePoleShow {
    for($row = 0; $row <= $MR; $row++) {
        for($col = 0; $col <= $MC; $col++) {
            Kletka($row,$col);
        }
    }
 }
 sub Kletka {
    my($row,$col) = @_;
     $x = $LEFT + $col * $W;
     $y = $TOP  + $row * $H;
      if ($bSelect == 0 ) {
       $DC->Rectangle($x-1,$y-1,$x+$W,$y+$H);
      }
        if($bSelect == 1 && $SelX == $col && $SelY == $row)
        {
           $DC->MoveTo($x, $y);
           $DC->LineTo($x+$W, $y+$H);
           $DC->MoveTo($x+$W, $y);
           $DC->LineTo($x, $y+$H);
        }
      return;
 }



--------------------
user posted image
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: GUI | Следующая тема »


 




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


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

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