//★ BitBlt で描画 前田 稔
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
public class MyForm : Form
{ Face App;
public MyForm()
{
BackColor = SystemColors.AppWorkspace;
App = new Face();
float hdpi = App.m_bmp.HorizontalResolution;
float vdpi = App.m_bmp.VerticalResolution;
Width = App.m_bmp.Width * 96 / (int)hdpi;
Height = (App.m_bmp.Height + 32) * 96 / (int)vdpi;
Paint += new PaintEventHandler(MyHandler);
}
private void MyHandler(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
if (App.m_bmp == null) Application.Exit();
App.ViewWin32(g,0,0);
//App.View(g, 0, 0);
}
}
//☆ Face Object Class
class Face
{
public Bitmap m_bmp;
string ImgFile = "";
const int SRCCOPY = 0xcc0020;
[DllImport("gdi32.dll")]
private static extern int BitBlt(IntPtr hDestDC,
int x, int y, int nWidth, int nHeight,
IntPtr hSrcDC, int xSrc, int ySrc, int dwRop);
[DllImport("gdi32.dll")]
public static extern int SelectObject(IntPtr hdc, IntPtr hbmp);
[DllImport("gdi32.dll")]
public static extern int DeleteObject(IntPtr hdc);
// Constructor
public Face()
{
OpenFileDialog opendlg = new OpenFileDialog();
opendlg.Filter = "画像ファイル (*.bmp)|*.bmp|すべてのファイル (*.*)|*.*";
if (opendlg.ShowDialog() == DialogResult.OK)
{ ImgFile = opendlg.FileName; }
try
{ m_bmp = new Bitmap(ImgFile); }
catch
{
MessageBox.Show("画像ファイルが読めません!", ImgFile);
return;
}
}
// 画像を描画
public void View(Graphics g, int x, int y)
{
if (m_bmp != null) g.DrawImage(m_bmp, x, y);
}
public void ViewWin32(Graphics g, int x, int y)
{
IntPtr hDC = g.GetHdc();
IntPtr hBmpSrc = m_bmp.GetHbitmap();
Graphics gdraw = Graphics.FromImage(m_bmp);
IntPtr srcHDC = gdraw.GetHdc();
SelectObject(srcHDC, hBmpSrc);
BitBlt(hDC, x, y, m_bmp.Width, m_bmp.Height, srcHDC, 0, 0, SRCCOPY);
DeleteObject(hBmpSrc);
g.ReleaseHdc(hDC);
gdraw.ReleaseHdc(srcHDC);
}
}
class image01
{
[STAThread]
public static void Main()
{
MyForm mf = new MyForm();
Application.Run(mf);
}
}
|