Grafika: GUI, OpenGL

GTK# lebegő toolbox

Szisztok!

GTK#-pal szeretnék fejleszteni OpenMoko-ra.
A levelezési listák szerint már van Mono és GTK# portolva rá, tehát eddig rendben van.

Olyan GUI-t szeretnék csinálni, aminek a közepén egy nagyméretű DrawArea van (ami mellesleg egy térkép), tehát egy a program által rajzolt terület. Ez a terület alapesetben a teljes képernyőt elfoglalná, rajta az érintés és húzás műveletek már eleve jelentéssel bírnának.

Valamelyik sarokba gondoltam egy gombot, ami "lebeg" a DrawArea felett: tehát nem foglal el egy teljes sort, vagy teljes oszlopot, hanem csak a sarkot és éppen akkora, hogy az újjunkkal kényelmesen eltalálhassuk. A térképnek a gomb alatti részét is kirajzolhatjuk, ez mivel a teljes képernyőhöz képest kis terület nem lenne nagy veszteség szerintem.
Erre a gombra kattintva(érintve) jönne fel a toolbox (menüpontok, ha úgy tetszik).
A feljövő menüpontok is jó lenne, ha a DrawArea felett lebegnének, mert így a menü felugratása nem idézne elő (átméretezést és) újrarajzolást a DrawArea-n, tehát elvileg elég reszponzív lenne.
Tehát valami olyan gyermek ablak kellene, amit always on top paraméterrel keret nélkül jelenítünk meg. Egy ilyenre kerülne a nyomógomb és a felugró toolbox is.

Ezt hogy kell megoldani GTK#-pal?
A GTK# a GTK+ körül egy c# wrapper, tehát ha a GTK+-os megoldást tudod, az is ugyanúgy jó, át lehet alakítani GTK#-ra.

A GUI-t amúgy glade-del lenne a legjobb tervezni, tehát az lenne a legjobb, ha a glade-3-ban toplevel widget lenne a lebegő gomb és toolbox is.

GTK+ listview finditem

Lehet hogy van ilyen csak én nem találtam.
Ugy akarok feltölteni egy listviewet hogy ne legyenek benne duplikátumok.
Ha már van akkor ne tegye bele
win32-n erre van "LVM_FINDITEM" üzenet

Vagy tényleg végig kell olvasni az egész listviewet, minden elem beszúrása előtt?

képfrissítés ciklusonként

Sziasztok!

Egy olyan problémám támadt, hogy OpenGL-ben írnék egy programot (TravellingBusinessman).
Azt nem tudom megoldani, hogy amikor megváltoznak a koordináták, akkor azok megjelenjenek a képernyőn, mindig csak az első állapot jelenik meg.
(A program még nem tljes, eddig csak ezzel a frissítgetéssel szórakoztam)
Köszönöm a segítséget!

Üdv:Token

-----------------------------------------------------------------------------------------------

#include
#include
#include
#include
#include

#include
#include

FILE *f;
double *pp;
int *nn,CITY;

int i,j, adat;
double places[1000],proba[1000];
char c;

void tengely (void);
void display (void);
void reshape (int , int);
void plot (void);
void keyboard (unsigned char , int , int ) ;
void plotter ();

/***************************************************************************************************/

int main (int argc, char *argv[]) {

CITY=40;

for(j=0;j<5;j++){

for(i=0;i
places[2*i]=(double)(rand()%6);
places[(2*i)+1]=(double)(rand()%6);
}

pp=&places[0];
nn=&CITY;

plotter();
}

return 0;
}

/****************************************************************************************************/
/******************************* FÜGGVÉNYEK ***************************************/
/****************************************************************************************************/

void tengely (void) {
glColor3f(255,255,255);
glBegin(GL_LINES);
glVertex3f(-1000, 0, 0.0);
glVertex3f( 1000, 0, 0.0);
glVertex3f( 0, 1000, 0.0);
glVertex3f( 0, -1000, 0.0);
glEnd();
}

void plot (void) {
int i;
for(i=0;i<(*nn-1);i++) {
glMatrixMode(GL_MODELVIEW);
glColor3f(255,255,255);

glBegin(GL_LINES);
glVertex2d((10*pp[2*i]),(10*pp[(2*i)+1]));
glVertex2d((10*pp[2*i+2]),(10*pp[2*i+3]));
glEnd();
}

for(i=0;i<(*nn);i++) {
glColor3f(255,0,0);
glBegin(GL_POINTS);
glVertex2d((10*pp[2*i]),(10*pp[(2*i)+1]));
glEnd();

}
}

void display (void) {
glClearColor (0.0,0.0,0.0,1.0);
glClear (GL_COLOR_BUFFER_BIT);
glLoadIdentity();
gluLookAt (10.0, 0.0, 100.0, 10.0, 0.0, 0.0, 0.0, 100.0, 100.0);
glPointSize(5);
//tengely();
plot();
glutSwapBuffers();
}

void reshape (int w, int h) {
glViewport (0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective (60, (GLfloat)w / (GLfloat)h, 1.0, 100.0);
glMatrixMode (GL_MODELVIEW);
}

void keyboard (unsigned char key, int x, int y) {
switch(key) {
case 27:
exit(0);
break;
default:
break;
}
}

void plotter (void) {
glutInitDisplayMode (GLUT_DOUBLE);
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow ("EREDMÉNY");

glutDisplayFunc (display);
glutIdleFunc (display);
glutReshapeFunc (reshape);
glutKeyboardFunc (keyboard);
glutMainLoop ();
}

svg vagy más vektorgrafikus megoldás c#-ban

Sziasztok!

A következő problémám van.

Adott egy fa struktúra, ezt szeretném grafikusan megjeleníteni egy ablakban úgy, hogy
lehessen a viewport-ot mozgatni, illetve lehessen zoomolni ki/be.

A programot c#-ban fejlesztem, egyelőre windows alá, de linux alatt (mono-val) is egész szépen muzsikál.

a kérdésem az lenne, hogy tudtok-e c#-hoz valami crossplatform megoldást, amivel egy
ilyent meg lehet csinálni, és ingyenes? Adobe SVG plugin szerintem nem jó, mert az valszeg nem megy linux alatt.

Jelenleg saját osztályokat definiáltam, és azok csinálják a kirajzolást, de a megoldásom a nagyon
igényestől azért messze van sajnos, és nincs kedvem kiszenvedni egy teljes vektorgrafikus könyvtárat.

Amire szükségem van: vonal húzás, és doboz rajzolás (színátmenettel), semmi más elemre nincs most szükségem.

Ha van rá lehetőség, akkor jó lenne, ha az elemeket ki is lehetne jelölni, illetve akciókat futtatni rajta.

Qt gombok szinezési probláma

Hello!
A köv feladathoz kérénk egy kis segítséget!
Készítsünk dialógus alapú játékot a következők alapján! A játék egy 9x9-es táblán folyik, melynek mind a négy sarkából kivágtunk egy-egy 3x3-es részt. A mezőkön bábuk állnak, kivéve a középsőt. Egy bábuval át lehet ugrani egy másikat, ha az átugrandó bábu után az ugrás irányában közvetlenül üres hely található. Ekkor az átugrott bábut levesszük a tábláról, a másikat pedig áthelyezzük az ugrásnak megfelelően. Ugrani négy irányba lehet: fel, jobbra, le illetve balra. A játék célja, hogy egyetlen bábu maradjon a táblán. Adjon a program lehetőségünk a játék újrakezdésére! Tartsuk nyilván és kérésre jelenítsük meg az 5 legkevesebb bábut fennhagyó játékos nevét és a fennmaradt bábuk számát, ezeket kilépéskor egy szöveges állományba mentsük el, újraindításkor onnan töltsük be!

A gombokat legenerálom és a két kiválasztott gomb közötti gombot nem tudom sehogyse átszinezni
Van valakinek valami ötlete


ifndef BABU_H
#define BABU_H

#include <QApplication>
#include <QWidget>
#include <QProgressBar>
#include <QPushButton>
#include <QString>
#include <QFile>
#include <QTextStream>
#include <QMessageBox>
#include <QStringList>
#include <QLabel>
#include <QFont>
#include <QPixmap>
#include <QPalette>
#include <QDir>

class BabuButton : public QPushButton
{
	public:
		BabuButton(QWidget* parent = 0);
		void setIndex(int i,int j) { sor = i; oszlop = j; }
		int getSor() { return sor; }
		int getOszlop() { return oszlop; }
	private:
		int sor;
		int oszlop;
};

class GameForm : public QWidget
{
		Q_OBJECT
	public:
		GameForm(QWidget *parent = 0);
		void Initialize();
	private:
		bool sel;
		BabuButton **babuk;
		QPushButton *btnQuit;
		QPushButton *btnNew;
		QPushButton *btnTop;
	public slots:
		void newGame();
		void topList();
		//void leptet(int sor, int oszlop);
		void leptet();
	signals:
		void buttonClicked(int i, int j);
};

#endif

//babu.cpp
#include "babu.h"

GameForm::GameForm(QWidget *parent) : QWidget(parent)
{

	const int dbBabu = 45;
	btnQuit = new QPushButton(tr("Quit"), this);
	btnNew  = new QPushButton(tr("New Game"), this);
	btnTop  = new QPushButton(tr("Top List"), this);
	connect(btnQuit, SIGNAL(clicked()), qApp, SLOT(quit()));
	connect(btnNew, SIGNAL(clicked()), this, SLOT(newGame()));
	connect(btnTop, SIGNAL(clicked()), this, SLOT(topList()));
	this->setGeometry(100,10,285,250);
	btnQuit->setGeometry(190,205,80,30);
	btnNew->setGeometry(10,205,80,30);
	btnTop->setGeometry(100,205,80,30);
	sel = false;
	babuk = new BabuButton* [dbBabu];
	for (int j=0; j<9; ++j)
	{

		for (int i=0; i<9; ++i)
		{
			if ((i>2 || j>2) && (i<6 || j<6) && (i<6 || j>2) && (i>2 || j<6))
			{
				QString str, str_i, str_j;
				str_i = str_i.setNum(i);
				str_j = str_j.setNum(j);
				str = str_j + "," + str_i;
				babuk[i,j] = new BabuButton(this);
				babuk[i,j]->setIndex(i,j);

				int sor = babuk[i,j]->getSor();
				int oszlop = babuk[i,j]->getOszlop();
				babuk[i,j]->setGeometry(60+i*20, 10+j*20, 20, 20);
				babuk[i,j]->setPalette(QPalette(Qt::darkBlue));
				if (i==4 && j==4)
				{
					babuk[i,j]->setPalette(QPalette(Qt::white));
				}
				babuk[i,j]->setText(str);
				connect(babuk[i,j], SIGNAL(clicked()), this, SLOT(leptet()));
			}

		}
	}
}

void GameForm::leptet()
{
	BabuButton *button = (BabuButton*)sender();
	if (!sel)
	{
		//button->setEnabled(false);
		button->setPalette(QPalette(Qt::white));
		sel = true;
	}
	else
	{
		button->setPalette(QPalette(Qt::red));
		int i = button->getSor();
		int j = button->getOszlop();
		i--;
		button->setIndex(i,j);
		button->setPalette(QPalette(Qt::green));
		//babuk[0,0]->setPalette(QPalette(Qt::yellow)); //nem valtozik az index alapjan a helye
		/*QMessageBox *about2;
		QString gombok_ii, gombok_jj;
		gombok_ii.setNum(i);
		gombok_jj.setNum(j);
		about2 = new QMessageBox("Index", "Az indexek: " + gombok_jj + "  "+ gombok_ii , QMessageBox::Information, 1, 0, 0, this, 0);
		about2->exec();
		*/

		sel = false;
	}
}

void GameForm::newGame()
{
	Initialize();
}

void GameForm::topList()
{

}

void GameForm::Initialize()
{

}

BabuButton::BabuButton(QWidget* parent) : QPushButton(parent)
{
}

//main.cpp
#include <QApplication>
#include "babu.h"
int main(int argc, char** argv)
{
 QApplication app(argc, argv);
 GameForm* form = new GameForm();
 form->show();
 return app.exec();
}

inkscape segítség kellene (az FSF.hu logo kapcsán)

Szóval van egy ötletem FSF.hu logora. (lásd: FSF.hu Alapítvány logó pályázat)
Megkértem egy festészettel és grafikával komolyabban foglalkozó rajztanárt, hogy öntse formába. Erre két rajzot kaptam tőle. Az én ötletem mellé egy saját ötletet is megrajzolt. :-{)E
Már mind a kettőt beszkeneltem az inkscape "bitkép vektoralizálása" funkcióval át is alakítottam vektorosra. Ahhoz hogy a vektorizálást megcsináljam, a színeket eltávolítottam a rajzról, mondván majd utólag "beleöntom a lukakba" a piros és a zöld színt, mert ugye a fehér az marad fehér, bár az átlátszó verziónál oda is kell fehéret "önteni". A színezés azt hiszem temperával készült és nem volt teljesen egyenletes, ezért döntöttem amellet, hogy kiszedem a vektorizálás előtt.

Nos ez a gondom. A rajz digitalizálása kész, vektoros is, csak a lukakban nincs semmi, így azt színezni sem tudom. Hogy lehetne az inkskape-pel egy vektoros objektum által körülhatárolt lyukba egy objektumot készíteni, amit majd színezhetek?
Most használtam először az inkscapet. Tehát nagyon nem tudom, hogy hol kezdjem el.

gtkmm jó-e?

Sziasztok!

A következő dolog érdekelne: mióta Ubuntu-t is használok az openSuSE mellett, felvetődött, hogy a Qt mellett a GNOME-hoz közelebb álló Gtk+ irányába is körülszaglászom a dolgokat. Azonban nem igazán szeretnék GUI-t C-ben programozni, ezért inkább a C++-os wrapperét, a gtkmm-et venném célba. Megnéztem a honlapjukat, és nem győzött meg: a híreket 2005 óta nem frissítik. Azt szeretném kérdezni, hogy ez egy megbízható, folyamatosan karbantartott és fejlesztett dolog, ami lépést tart a Gtk+ fejlődésével, vagy egy kifulladt, vegetáló projekt? Egyáltalán, vannak valakinek gyakorlati tapasztalatai a cuccal?

Cairo + GTK (+ Windows)

Sziasztok!
Írnom kellene egy GUI-s programot, aminek a céljába most nem mennék bele.
Én linux-on fejlesztenék, de a target platform elsősorban windows lenne. Ehhez szépen kinéztem a komponenseket, gtk, cairo megfelel nekem, mindegyik keresztplatformos, és jó is.
A gond az, hogy amikor a cairo-val rajzolni szeretnék, akkor kell csinálni egy cairo-context-et, amit elvégez nekem gdk_cairo_create(), de csak linux alatt, mert win-re nem találtam gdkcairo.h-t.
Van valakinek valami ötlete? Vagy memóriába rajzoltassam a képet, és utána tegyem csak ki az ablakba?