On-line: Andrey, Dr. Oldwarez, гостей 0. Всего: 2 [подробнее..]
АвторСообщение



Пост N: 4
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 29.12.06 11:40. Заголовок: Нарисовать кривулину


Дорогие товарищи!
Прошу, кто сможет, ответить на такой глупый вопрос: как нарисовать кривую (график по точкам, т.е. по массиву значений) в Харборе (напр., через miniGui)?
Во-первых, есть ли функция, которая так и называется curve() или что-то в этом роде, а если нет и надо рисовать самому по точкам, то как сделать аппроксимацию?
Во-вторых, неужели для этого необходимо отд. окно? Или же график м.б. элементом формы, как хотелось бы? Чего-то я такого станд. элемента не нашёл.
Да ещё IDE работает как-то криво: картинка не соответствует тому, что написано (хотя написанное сохраняется и в программе работает как надо), и даже вылетает.
Кто-то спросит, зачем рисовать кривулину на Харборе, а не на C Builder и т.п.. Во-первых, Клиппер мне ближе. Во-вторых, там вообще-то большая работа с БД.
Всех с наступающим! Боюсь, что смогу получить ответ только после этих дурацких каникул, если не сегодня.

Спасибо: 0 
Профиль
Ответов - 6 [только новые]


Администратор




Пост N: 469
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 29.12.06 12:48. Заголовок: Re:


AM пишет:

 цитата:
Кто-то спросит, зачем рисовать кривулину на Харборе, а не на C Builder



Одно другому не мешает
Напиши функцию на C, передай ей паметры из харбора
Параметры - device handle (hDC), ну и координаты

А дальше используй винапишные функции - какие тебе понравятся. По точкам рисовать это будет жестоко, аппроксимируй кривую черет отрезки и используй функции

MoveToEx( hDC, x1, y1, NULL );
LineTo( hDC, x2, y2 );

Есть еще функции
Arc( hDC, x1, y1, x2, y2, 0, 0, 0, 0)
Ellipse( hDC, x1, y1, x2, y2)

определения в wingdi.h


Спасибо: 0 
Профиль



Пост N: 5
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 29.12.06 13:08. Заголовок: Re:


Pasha пишет:

 цитата:
Напиши функцию на C, передай ей паметры из харбора...


Да, если бы я всё это умел! Конечно, надо уметь подключать сишные программы, но чтоб сразу... И потом, как всё же поместить кривую в форму?

Спасибо: 0 
Профиль
Администратор




Пост N: 470
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 29.12.06 13:33. Заголовок: Re:


Дык это просто

Прямо в тело прг вставить:

anyfile.prg:

func test

DrawCurve(hDC, ...)

retu nil

#pragma BEGINDUMP

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

HB_FUNC( DRAWCURVE )
{
HDC hDC = ( HDC ) hb_parnl( 1 );
int x1 = hb_parni( 2 );
int y1 = hb_parni( 3 );
int x2 = hb_parni( 4 );
int y2 = hb_parni( 5 );

...

}


#pragma ENDDUMP

Ну а hDC получить у обьектов минигуи


Спасибо: 0 
Профиль
moderator


Пост N: 19
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 29.12.06 13:47. Заголовок: Re:


См. HwGUI - source/hgraph.prg, samples/graph.prg

Спасибо: 0 
Профиль
модератор




Пост N: 398
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 29.12.06 14:19. Заголовок: Рабочий пример




/*
* MINIGUI - Harbour Win32 GUI library Demo
*
* Copyright 2002-05 Roberto Lopez <roblez@ciudad.com.ar>
* http://www.geocities.com/harbour_minigui/
*
* Copyright 2006 Grigory Filatov <gfilatov@freemail.ru>
*/

ANNOUNCE RDDSYS

#include "minigui.ch"

#define PROGRAM 'Draw Curves'
#define PS_SOLID 0

PROCEDURE Main

DEFINE WINDOW Form_1 ;
AT 0,0 ;
WIDTH 800 HEIGHT 600 ;
TITLE PROGRAM + " - Contributed by Grigory Filatov" ;
MAIN ;
ICON "demo.ico" ;
NOMAXIMIZE ;
ON INIT OnInit() ;
ON PAINT DrawCurves() ;
BACKCOLOR WHITE ;
FONT "MS Sans Serif" SIZE 8

DEFINE MAIN MENU
DEFINE POPUP "Test"
MENUITEM "Do it!" ACTION RefreshWnd( _HMG_MainHandle )
MENUITEM "Exit" ACTION ThisWindow.Release()
END POPUP
END MENU

@ 10,Form_1.Width - 120 BUTTON Button_1 ;
CAPTION 'Close' ;
ACTION Form_1.Release

END WINDOW

Form_1.Center

ACTIVATE WINDOW Form_1

Return


PROCEDURE OnInit

Form_1.Button_1.Setfocus

CLEAN MEMORY

RETURN

#define WM_PAINT 15
*--------------------------------------------------------*
Static Procedure RefreshWnd( hWnd )
*--------------------------------------------------------*

SendMessage( hWnd, WM_PAINT, 0, 0 )
Do Events

Return

*--------------------------------------------------------*
Function DrawCurves()
*--------------------------------------------------------*

local nHeight := Form_1.Height - 20, nWidth := Form_1.Width - 20
local hWnd := GetActiveWindow()
local hDC := GetDC( hWnd )
local n, hPen, hOldPen
local cPoints

for n = 1 to 20
hPen = CreatePen( PS_SOLID, 5, Random( 65535 ) )
hOldPen = SelectObject( hDC, hPen )

cPoints = L2Bin( Random( nWidth ) ) + ;
L2Bin( Random( nHeight ) ) + ;
L2Bin( Random( nWidth ) ) + ;
L2Bin( Random( nHeight ) ) + ;
L2Bin( Random( nWidth ) ) + ;
L2Bin( Random( nHeight ) ) + ;
L2Bin( Random( nWidth ) ) + ;
L2Bin( Random( nHeight ) )

PolyBezier( hDC, cPoints, 4 )
SelectObject( hDC, hOldPen )

DeleteObject( hPen )
next

ReleaseDC( hWnd, hDC )

return nil


DECLARE DLL_TYPE_LONG GetDC( DLL_TYPE_LONG hWnd ) ;
IN USER32.DLL

DECLARE DLL_TYPE_LONG ReleaseDC( DLL_TYPE_LONG hWnd, DLL_TYPE_LONG hDC ) ;
IN USER32.DLL

DECLARE DLL_TYPE_LONG PolyBezier( DLL_TYPE_LONG hDC, DLL_TYPE_LPSTR Points, DLL_TYPE_LONG Amount ) ;
IN GDI32.DLL

DECLARE DLL_TYPE_LONG CreatePen( DLL_TYPE_LONG Style, DLL_TYPE_LONG Width, DLL_TYPE_LONG Color ) ;
IN GDI32.DLL

DECLARE DLL_TYPE_LONG SelectObject( DLL_TYPE_LONG hDC, DLL_TYPE_LONG hGDIobj ) ;
IN GDI32.DLL

DECLARE DLL_TYPE_LONG DeleteObject( DLL_TYPE_LONG hGDIobj ) ;
IN GDI32.DLL

Спасибо: 0 
Профиль



Пост N: 6
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 29.12.06 15:56. Заголовок: Re:


Спасибо, товарищи, попробую, но всё же - как сделать кривую элементом формы?

Спасибо: 0 
Профиль
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 119
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет