Re: [gtkmm] ScrolledWindow doesn't scroll a DrawingArea
- From: "Nik A. Melchior" <nam1 cse wustl edu>
- To: gtkmm-list gnome org
- Subject: Re: [gtkmm] ScrolledWindow doesn't scroll a DrawingArea
- Date: Thu, 24 Jul 2003 13:51:49 -0500 (CDT)
I've found a far simpler example of a broken ScrolledWindow displaying a
DrawingArea. This is (as much as I know how) directly converted from a
straight C example that *does* work. I can post the C code if anyone is
interested in comparing, but the unintended behavior should be pretty
obvious from running this. I hope I'm simply missing an event handler or
something.
Much thanks,
Nik Melchior
#include <gtkmm.h>
#define WIDTH (1000)
#define HEIGHT (1000)
#define ADDR( X, Y ) (image + ((Y) * WIDTH + (X)) * 3)
class ExampleWin : public Gtk::Window {
public:
unsigned char image[WIDTH * HEIGHT * 3];
Gtk::DrawingArea darea;
Gtk::Adjustment *hadj;
Gtk::Adjustment *vadj;
Gtk::ScrolledWindow swin;
void
init_image( void )
{
int x, y;
for( y = 0; y < HEIGHT; y++ )
for( x = 0; x < WIDTH; x++ ) {
unsigned char * const p = ADDR( x, y );
p[0] = (256 * x) / WIDTH;
p[1] = (256 * y) / HEIGHT;
p[2] = x + y;
}
}
bool
expose( GdkEventExpose *event )
{
const unsigned char *buf = ADDR(event->area.x, event->area.y);
darea.get_window()->draw_rgb_image(darea.get_style()->get_white_gc(),
event->area.x,
event->area.y,
event->area.width,
event->area.height,
Gdk::RGB_DITHER_MAX,
(guchar *) buf, WIDTH * 3 );
return FALSE;
}
void
adj_centre( Gtk::Adjustment *adj )
{
const double range = adj->get_upper() - adj->get_lower()
- adj->get_page_size();
adj->set_value(adj->get_lower() + range / 2);
}
bool
conf (GdkEventConfigure *event)
{
hadj->set_upper(WIDTH);
vadj->set_upper(HEIGHT);
hadj->set_page_size(darea.get_allocation().width);
vadj->set_page_size(darea.get_allocation().height);
adj_centre(hadj);
adj_centre(vadj);
}
ExampleWin ()
{
init_image();
gtk_widget_set_default_colormap( gdk_rgb_get_cmap() );
gtk_widget_set_default_visual( gdk_rgb_get_visual() );
darea.signal_expose_event().connect(slot(*this, &ExampleWin::expose));
darea.signal_configure_event().connect(slot(*this, &ExampleWin::conf));
swin.add(darea);
hadj = swin.get_hadjustment();
vadj = swin.get_vadjustment();
add(swin);
set_size_request(500, 500);
show_all_children();
adj_centre(hadj);
adj_centre(vadj);
}
};
int
main( int argc, char **argv )
{
Gtk::Main kit(argc, argv);
ExampleWin window;
Gtk::Main::run(window);
return( 0 );
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]