W
Hallo, ich programmiere gerade ein kleines Paintprogramm und nutze dazu die Drawingarea. Ich lade dann ein Bild und lasse es anzeigen. Nun möchte ich einen Breich markieren/auswählen (so eine art Maske), aber das funktioniert nicht so richtig. Kann mir da jemand helfen.
hier der Code der Klasse:
#include <iostream>
#include <sstream>
#include <gtkmm/image.h>
#include "Imagebox.h"
Imagebox::Imagebox(int xSize, int ySize)
{
Glib::RefPtr<Gdk::Colormap> colormap = get_default_colormap();
black_ = Gdk::Color("black");
white_ = Gdk::Color("white");
grey_ = Gdk::Color("grey");
red_ = Gdk::Color("red");
blue_ = Gdk::Color("blue");
colormap->alloc_color(black_);
colormap->alloc_color(white_);
colormap->alloc_color(grey_);
colormap->alloc_color(red_);
colormap->alloc_color(blue_);
x_Size = xSize; y_Size = ySize;
lMouseClicked = false;
mMouseClicked = false;
rMouseClicked = false;
drawing = false;
set_events( Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK );
signal_motion_notify_event().connect(sigc::mem_fun( *this, &Imagebox::on_area_motion_notify_event) );
signal_button_press_event().connect(sigc::mem_fun( *this, &Imagebox::on_area_button_press_event) );
signal_button_release_event().connect(sigc::mem_fun( *this, &Imagebox::on_area_button_release_event) );
buff = NULL;
}
Imagebox::~Imagebox()
{
}
void Imagebox::LoadPic(const std::string filename, unsigned char *picBuffer)
{
FILE *stream;
if ( (stream = fopen( (char*)filename.c_str() , "rb" )) == NULL )
{
std::cout<<"error while open file "<<filename<<std::endl;
}
else
{
// read the data from RAW input file
fread( picBuffer, 1392 * 1040, 1, stream );
fclose(stream);
}
}
bool Imagebox::on_area_motion_notify_event(GdkEventMotion* event)
{
std::ostringstream tmp;
if (event)
{
// hruler->property_position().set_value(event->x);
// vruler->property_position().set_value(event->y);
tmp<<event->x<<","<<event->y;
label_xypos->set_text( tmp.str() );
if ( lMouseClicked )
{
switch ( *tool )
{
case 1:
{
gc02->set_line_attributes(2,Gdk::LINE_ON_OFF_DASH,Gdk::CAP_NOT_LAST,Gdk::JOIN_MITER);
// gc01->set_line_attributes(2,Gdk::LINE_SOLID,Gdk::CAP_NOT_LAST,Gdk::JOIN_MITER);
xpos = (int)event->x;
ypos = (int)event->y;
if (lastx != xpos || lasty != ypos)
{
// erase old rectangle
gc02->set_foreground(white_);
window->draw_rectangle(gc02,false,startx,starty,lastx-startx,lasty-starty);
// window->draw_image(gc01,image,xpos-startx,ypos-starty,xpos-startx,ypos-starty);
// draw new rectangle
gc02->set_foreground(red_);
window->draw_rectangle(gc02,false,startx,starty,xpos-startx,ypos-starty);
// image = window->get_image (startx+1,starty+1,xpos-startx-1,ypos-starty-1);
lastx = xpos;
lasty = ypos;
}
break;
}
case 2:
{
gc02->set_line_attributes(2,Gdk::LINE_SOLID,Gdk::CAP_NOT_LAST,Gdk::JOIN_MITER);
xpos = (int)event->x;
ypos = (int)event->y;
gc02->set_foreground(red_);
draw_brush(xpos,ypos);
break;
}
default: break;
}// switch
}
else
{
}
if ( mMouseClicked )
{
}
if ( rMouseClicked )
{
}
}
return true;
}
bool Imagebox::on_area_button_press_event(GdkEventButton* event)
{
if ( event->type == GDK_BUTTON_PRESS )
{
/* linke Maustaste */
if ( event->button == 1 )
{
lMouseClicked = true;
startx = (int)event->x;
starty = (int)event->y;
lastx = startx;
lasty = starty;
drawing = true;
}
/* mittlere Maustaste */
if ( event->button == 2 )
{
mMouseClicked = true;
}
/* rechte Maustaste */
if ( event->button == 3 )
{
rMouseClicked = true;
}
}
return false;
}
bool Imagebox::on_area_button_release_event(GdkEventButton* event)
{
if ( event->type == GDK_BUTTON_RELEASE )
{
/* linke Maustaste */
if ( event->button == 1 )
{
lMouseClicked = false;
drawing = true;
// image = window->get_image (startx+1,starty+1,xpos-1,ypos-1);
window->draw_image(gc01,image,startx+1,starty+1,startx+1,starty+1,(xpos-1)-(startx+1),(ypos-1)-(starty+1));
/*
std::cout<<"x"<<xpos<<std::endl;
std::cout<<"y"<<ypos<<std::endl;
std::cout<<"lx"<<lastx<<std::endl;
std::cout<<"ly"<<lasty<<std::endl;
std::cout<<"sx"<<startx<<std::endl;
std::cout<<"sy"<<starty<<std::endl;
*/
}
/* mittlere Maustaste */
if ( event->button == 2 )
{
mMouseClicked = false;
}
/* rechte Maustaste */
if ( event->button == 3 )
{
rMouseClicked = false;
}
}
return false;
}
void Imagebox::on_realize()
{
Gtk::DrawingArea::on_realize();
window = get_window();
gc01 = Gdk::GC::create(window);
gc02 = Gdk::GC::create(window);
window->resize( x_Size, y_Size );
window->set_background(white_);
window->clear();
}
bool Imagebox::on_expose_event(GdkEventExpose* event)
{
int winx, winy, winw,winh,wind;
window = get_window();
window->get_geometry(winx,winy,winw,winh,wind);
image = window->get_image (0,0,x_Size,y_Size);
if ( buff != NULL)
{
window->draw_gray_image(gc01,0,0,w,h,Gdk::RGB_DITHER_NONE,buff,1*w);
}
// window->draw_image(gc01,image,0,0,0,0,image->get_width(),image->get_height());
return true;
}
void Imagebox::draw_brush(gdouble x, gdouble y)
{
window->draw_rectangle(gc02,true,(int)x-5,(int)y-5,10,10);
}
void Imagebox::push_picture(unsigned char *buffer, unsigned int nWidth, unsigned int nHeight)
{
buff = buffer;
w = nWidth;
h = nHeight;
window->draw_gray_image(gc01,0,0,nWidth,nHeight,Gdk::RGB_DITHER_NONE,buffer,1*nWidth);
}