sorry only read half the thread.

Should
var x_coord = integer(mouse_pos.x*(bmap_width(my_bmap)/screen_size.x));
be
var x_coord = integer(mouse_pos.x+[(bmap_width(my_bmap)/screen_size.x));

I'm using a function (hopefully) similar to what you're trying to achieve
Code:
void av_colorChange(var id, PANEL* pnl){
	
	var min_x, min_y, max_x, max_y;
	BMAP* bmp;
	
	switch(id){
		case 1: //color pallette
			min_x = pnl.pos_x + 6;
			min_y = pnl.pos_y + 42;
			max_x = pnl.pos_x + 6 + bmap_width(bmp_avColorPallette);
			max_y = pnl.pos_y + 42 + bmap_height(bmp_avColorPallette);
			bmp = bmp_avColorPallette;
		break;
		case 2: //skin pallette
			min_x = pnl.pos_x + 6;
			min_y = pnl.pos_y + 130;
			max_x = pnl.pos_x + 6 + bmap_width(bmp_avSkinPallette);
			max_y = pnl.pos_y + 130 + bmap_height(bmp_avSkinPallette);
			bmp = bmp_avSkinPallette;
		break;
		case 3: //pattern color pallette
			min_x = pnl.pos_x + 6;
			min_y = pnl.pos_y + 322;
			max_x = pnl.pos_x + 6 + bmap_width(bmp_avColorPallette);
			max_y = pnl.pos_y + 322 + bmap_height(bmp_avColorPallette);
			bmp = bmp_avColorPallette;
		break;
	}
	
	var format = bmap_lock(bmp, 0), pixel;
	VECTOR vec_temp;
	
	while(mouse_left){
		
		if((mouse_pos.x >= min_x) && (mouse_pos.x < max_x)){
			if((mouse_pos.y >= min_y) && (mouse_pos.y < max_y)){
				pixel = pixel_for_bmap(bmp, mouse_pos.x - min_x, mouse_pos.y - min_y);
			}
		}
		
		pixel_to_vec(vec_temp, NULL, format, pixel);
		vec_temp.x /= 256;
		vec_temp.y /= 256;
		vec_temp.z /= 256;
		
		switch(id){
			case 1: case 2:
				vec_set(var_avArea[0], vector(vec_temp.z, vec_temp.y, vec_temp.x));
			break;
			case 3:
				vec_set(var_avPattern[0], vector(vec_temp.z, vec_temp.y, vec_temp.x));
			break;
		}
		wait(1);
	}
	
	bmap_unlock(bmp);
}

1, 2 and 3 chooses the panel clicked and the limits of the bmap while holding mouse_left