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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2007, 09:36   #1
saintninja
 
Регистрация: 16.10.2007
Сообщений: 4
По умолчанию Рисование фигур в Delphi7 без использования VCL

Столкнулся с проблемой. Имею задание создать, работая с ОС без возможностей VCL окно, в котором реализовать рисование 3 типов фигур по клику мыши. Пятиугольник, 6угольник и равнобедреный треугольник. Общее количество фигур ограничено 10. Реализовать смену активной фигуры на нажатие клавиш от 0 до 9. активная выделяется жирной линией. Также реализовать удаление фигуры. И еще поворот на заданный угол вокруг центра фигуры и симметрия относительно горизонтальной оси или вертикальной оси. Я сделал только само пустое окно. Но дальше тупик. Как реализовать создание фигур на клик мыши? И ограничить их количество? Вообщем суть вопроса как нажатиям кнопок присвоить некие процедуры?
saintninja вне форума Ответить с цитированием
Старый 16.10.2007, 10:18   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Начните с изучения MoveTo, LineTo и так далее (хэлп Дельфи).
Там все подробно расписано, вы легко разберетесь, тем более, что приведено много примеров рисования на канве...
mihali4 вне форума Ответить с цитированием
Старый 16.10.2007, 10:20   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Без VCL это значит MoveTo и LineTo отпадают.
Остается только API
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.10.2007, 10:30   #4
saintninja
 
Регистрация: 16.10.2007
Сообщений: 4
По умолчанию

С рисованием проблем не имею. Основное как к нажатиям кнопок привязать события? И как в месте клика мышкой создать фигуру? БЕЗ VCL
saintninja вне форума Ответить с цитированием
Старый 16.10.2007, 10:59   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Не понял... Тебе все нуна на API или ты просто не знаешь как в Делфе событие обработать?

Я почему так спрашиваю, ибо в Делфе без VCL мона только писуя на API, т.е. для кнопки прописывая обработку message ручками. А OnClick - это уже VCL фактически.

т.е. насчет "Без VCL" эт ты уточни в каких рамках "Без"
I'm learning to live...

Последний раз редактировалось Stilet; 16.10.2007 в 11:05.
Stilet вне форума Ответить с цитированием
Старый 16.10.2007, 11:23   #6
saintninja
 
Регистрация: 16.10.2007
Сообщений: 4
По умолчанию

Вообщем в подключеных библиотеках в юзес должны быть Виндовс и еще что то. и все. Окно, то есть форму, сам пишешь. ОнКлик действительно нельзя. Тема WINAPI
saintninja вне форума Ответить с цитированием
Старый 16.10.2007, 11:33   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Знаешь, я тебе советую приобрести програмку APIx2 с FreeSoft.ru
Она поможет Делфеподобно создать прогу на чистом API, причем делфовым кодом. Вот пример обработки нажатия на кнопку на форме :


Данный код был спроектирован в среде APIx - Visual WinAPI 2
Copyright (c) PiddleSoft 2004-2006
http://piddlesoft.narod.ru
piddlesoft@mail.ru

Дата генерации листинга - 16.10.2007 10:30:11
}

program APIx_Project8;

uses
windows, messages, commctrl; //Используемые модули

// Иконка
{$R 'icon.res'}

var
WinClass : TWndClass; //переменная класса TWndClass для создания главного окна
hInst : HWND; //хандлер приложения
Handle : HWND; //локальный хандлер
Msg : TMSG; //сообщение
hFont : HWND; //хандлер шрифта
Button1 : HWND; //TButton
Button2 : HWND; //TButton

procedure ShutDown; //процедура завершения программы
begin
DeleteObject(hFont); //удаление шрифта
UnRegisterClass('TAPIxForm', hInst); //удаление окна
ExitProcess(hInst); //закрытие программы
end;

function WindowProc(hwnd, msg, wparam, lparam: longint): longint; stdcall; //обработчик сообщений
begin
Result := DefWindowProc(hwnd, msg, wparam, lparam);
case Msg of

WM_COMMAND:
if (lParam = Button1) and (HiWord(wParam) = BN_CLICKED) then
begin
// Нажата кнопка
end

;

WM_DESTROY: ShutDown;
end;
end;

begin
hInst := GetModuleHandle(nil);
with WinClass do
begin
Style := CS_PARENTDC; //стиль класса главного окна
hIcon := LoadIcon(hInst, MAKEINTRESOURCE('APIXICON')); //иконка программы
lpfnWndProc := @WindowProc; //назначение обработчика сообщений
hInstance := hInst;
hbrBackground := COLOR_BTNFACE + 1; //цвет окна
lpszClassName := 'TAPIxForm'; //класс окна
hCursor := LoadCursor(0, IDC_ARROW); //активный курсор
end;
InitCommonControls;
RegisterClass(WinClass); //регистрация класса в системе

// Создание главного окна программы
Handle := CreateWindowEx(0, 'TAPIxForm', 'Форма1',
WS_OVERLAPPEDWINDOW or
WS_VISIBLE or WS_MINIMIZEBOX or WS_MAXIMIZEBOX or WS_SYSMENU,
219, 116, 550, 366,
0, 0,
hInst, nil);

// Создание шрифта
hFont := CreateFont(
-11, 0, 0, 0, 0, 0, 0, 0,
DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH or FF_DONTCARE, 'MS Sans Serif');

Button1 := CreateWindow(
'Button',
'Button1',
WS_CHILD or BS_TEXT or WS_VISIBLE,
16, 16, 105, 57, Handle, Button1, hInst, nil);
SendMessage(Button1, WM_SETFONT, hFont, 0);


Button2 := CreateWindow(
'Button',
'Button2',
WS_CHILD or BS_TEXT or WS_VISIBLE,
144, 16, 177, 73, Handle, Button2, hInst, nil);
SendMessage(Button2, WM_SETFONT, hFont, 0);


// Цикл сбора сообщений
while(GetMessage(Msg, 0, 0, 0)) do
begin
TranslateMessage(Msg); //прием сообщений
DispatchMessage(Msg); //удаление сообщений из очереди
end;
end.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.10.2007, 11:52   #8
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

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

Во первых неизвестно в каком порядке рисовать какие фигуры, будем считать что случайным выбором.
Код:
type 
TFigureKind = (Pentagon, Hexagon, Triangle);

TMyFigure = record
  x,y: integer; //координаты
  kind: TFigureKind;
  end; 

var
figures: array of TMyFigure;
//в кач-ве счетчика фигур будет длина массива - Length(figures)
selected: integer = -1; //индекс выделенной фигуры

procedure DrawFigure(f: TMyFigure; line: byte);// line - толщина линии
begin
case f.kind of
  Pentagon: рисуем пятиугольник; //координаты берем из f.x f.y
  Hexagon: рисуем шестиугольник;
  Triangle: рисуем треугольник;
  end;
end;

обработчик нажатия левой кнопки
var f: byte;
begin
if Length(figures) < 10 then //одинадцатая уже не нарисуется
  begin
  f:=Random(3);
  SetLength(figures,Length(figures)+1);
  case f of
    0: figures[Length(figures)-1].kind:=Pentagon;
    1: figures[Length(figures)-1].kind:=Hexagon;
    2: figures[Length(figures)-1].kind:=Triangle;
    end;
  figures[Length(figures)-1].x:=координата клика полученнная из сообщ.;
  figures[Length(figures)-1].y:=координата клика полученнная из сообщ.;
  DrawFigure(figures[Length(figures)-1],1);
  end;
end;

обработчик нажатия клавиши
var i: integer;
begin
if (нажат 0) then
  if Length(figures) > 0 then //исключаем ошибку
    begin
    selected:=0;
    Очищаем окно;
    for i:=0 to Length(figures)-1 do //перерисовываем все фигуры
      if i = 0 then DrawFigure(figures[i],2) //рисуем жирной линией 
      else DrawFigure(figures[i],1); //тонкой линией
    end;
if (нажат 1) then
  if Length(figures) > 1 then //исключаем ошибку
    begin
    selected:=1; 
    Очищаем окно;
    for i:=0 to Length(figures)-1 do //перерисовываем все фигуры
      if i = 1 then DrawFigure(figures[i],2) //рисуем жирной линией 
      else DrawFigure(figures[i],1); //тонкой линией
    end;

и так далее до 9-ти

//удаление
if (нажата Delete) then
  if selected <> -1 then
    begin
    for i:=selected to Length(figures)-2 do
    figures[i]:=figures[i+1];
    SetLength(figures,Length(figures)-1);
    selected:=-1;
    Очищаем окно;
    for i:=0 to Length(figures)-1 do //перерисовываем все фигуры
      DrawFigure(figures[i],1) //рисуем тонкой линией     
    end;
end;
как сделать вращение посмотри исходник, там правда на VCL, но принцип все равно общий
Вложения
Тип файла: rar rotate.rar (6.0 Кб, 34 просмотров)
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; 16.10.2007 в 17:44.
mutabor вне форума Ответить с цитированием
Старый 16.10.2007, 22:28   #9
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Без VCL это значит MoveTo и LineTo отпадают.
Остается только API
Ну зачем уж так категорично?
Вот вам, например, описание LineTo из WinAPI:
Цитата:
BOOL LineTo(
HDC hdc, // device context handle
int nXEnd, // x-coordinate of line's ending point
int nYEnd // y-coordinate of line's ending point
);
mihali4 вне форума Ответить с цитированием
Старый 18.10.2007, 14:04   #10
saintninja
 
Регистрация: 16.10.2007
Сообщений: 4
По умолчанию

Вопрос больше к математикам наверное. Как сделать симметрию относительно вертикальной (горизонтальной) оси? И еще как удалить фигуру корректно?
saintninja вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Dec to Hex - пример использования Roof Общие вопросы Delphi 8 03.08.2008 19:40
Примеры использования и выбор лучшей DB BOBAH13 БД в Delphi 4 03.05.2008 22:32
Право использования AlphaControls! Xenofibrius Компоненты Delphi 2 20.04.2008 16:08
Периметр сложніх фигур Hworang Общие вопросы C/C++ 7 01.04.2008 19:30