[Google Mapsみたいな感じ]
最終的には、Windows Mobileで実装したいと思っているのですが、現在の段階ではPC上で[スマートデバイスではなく]
テストプログラムを作っています。
C#で実装しておりまして、Graphicsに描画した後、
picturebox1.Imageに、Graphicsを入れているのですが、
どうしても画像を移動する際ににカクついてしまいます。ダブルバッファリングなどの対応はしているつもりなのですが・・・。
何かよい方法はないでしょうか。言語はC++,C#,VB,Javaぐらいでしたら、問いませんのでよろしくお願い致します。
Bitmap a2 = new Bitmap(@"./img/22.png");
gg = Graphics.FromImage(bitmapBuffer);
gg.DrawImage(a2, 256, 512);
pictureBox1.Image = bitmapBuffer;
gg.Dispose();
こんな感じでどうでしょう
フォームにピクチャーボックス貼って
イベントはつないでくださいね
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
namespace test2
{
public partial class Form2 : Form
{
Bitmap _memImage;
Graphics _gImage;
Point _drawPointOffset;
List<ViewImage> _viewImageList;
//マウスの押された位置
private Point mouseDownPoint = Point.Empty;
private Point mouseDownPointOffset = Point.Empty;
public Form2()
{
InitializeComponent();
_memImage = new Bitmap(pictureBox1.ClientSize.Width, pictureBox1.ClientSize.Height);
_gImage = Graphics.FromImage(_memImage);
_gImage.Clear(pictureBox1.BackColor);
}
private void Form2_Load(object sender, EventArgs e)
{
_drawPointOffset = new Point();
_viewImageList = new List<ViewImage>();
ViewImage vimag;
vimag = new ViewImage(new Point(0, 0));
vimag.SourcePicture = new Bitmap(@"./xxx1.png");
_viewImageList.Add(vimag);
vimag = new ViewImage(new Point(100, 0));
vimag.SourcePicture = new Bitmap(@"./xxx2ー.png");
_viewImageList.Add(vimag);
DrawMemImage(_drawPointOffset);
}
private void DrawMemImage(Point point)
{
_gImage.Clear(pictureBox1.BackColor);
foreach (var item in _viewImageList)
{
Point drawPoint = new Point(item.DrawPoint.X + point.X, item.DrawPoint.Y + point.Y);
//ここでクライアント領域内にイメージがあるか判断して
//描画するか判定する(クリッピング処理)
//面倒なので、全部描画
_gImage.DrawImage(item.SourcePicture, drawPoint);
}
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
//DrawImageで描画
g.DrawImage(_memImage, new Point());
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
mouseDownPoint = Point.Empty;
mouseDownPointOffset = Point.Empty;
}
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
Point clickPoint = new Point(e.X, e.Y);
mouseDownPoint = new Point(e.X, e.Y);
mouseDownPointOffset = new Point(_drawPointOffset.X - e.X, _drawPointOffset.Y - e.Y);
}
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (mouseDownPoint != Point.Empty)
{
System.Diagnostics.Debug.WriteLine(e.X, ToString() + "," + e.Y.ToString());
_drawPointOffset = new Point(mouseDownPointOffset.X + e.X, mouseDownPointOffset.Y + e.Y);
DrawMemImage(_drawPointOffset);
this.Refresh();
}
}
private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
_memImage.Dispose();
_gImage.Dispose();
}
}
/// <summary>
/// 画像データのクラス
/// </summary>
class ViewImage
{
private Point _point;
private Bitmap _bitmap;
/// <summary>
/// コンストラクタ
/// </summary>
public ViewImage(Point point)
{
_point = point;
}
public Point DrawPoint
{
set { _point = value; }
get { return _point; }
}
public Bitmap SourcePicture
{
set { _bitmap = value; }
get { return _bitmap; }
}
~ViewImage()
{
System.Diagnostics.Debug.Print("image デストラクタ");
}
}
}
PCの性能の問題だったりしませんか?
私のPCではカクつかずにスクロールできますが、これもカクつきませんか?
あとはC#で書いたソースコード全体を見せてもらうとわかるかも?