第二个按钮的方法(函数)中访问不到第一个按钮的方法的成员变量(内部变量), 如果这两个方法在同一个类中(就是说你的两个按钮是在同一个窗体上的话), 最简单的方式就是直接声明一个类变量, 如下:
以button1空间为例,给它的Anchor这个属性赋值不同的值就可以实现空间跟随窗体改变大小一下是源代码,thisbutton1Anchor = ((SystemWindowsFormsAnchorStyles)((((SystemWindowsFormsAnchorStylesTop | SystemWindowsFormsAnchorStylesBottom)
| SystemWindowsFormsAnchorStylesLeft)
| SystemWindowsFormsAnchorStylesRight)));
一下是在属性面板中设置/
主要是对 PictureBox 的 *** 作
截取屏幕图像
获取屏幕指定像素颜色
旋转和翻转
虚拟选择框绘制
控件绘图
为了方便,所有步骤在一个方法中完成
创建了一个新的 Form 对象
在该 Form 中添加了一个 PictureBox 对象
/
// 在 Form_Load 中调用
private void CSDNSample_PictureBoxHandle()
{
// 复制屏幕,创建原始
Bitmap image = new Bitmap(
ScreenPrimaryScreenBoundsWidth,
ScreenPrimaryScreenBoundsHeight);
using (Graphics g = GraphicsFromImage(image))
{
gCopyFromScreen(
0, 0, 0, 0,
imageSize,
CopyPixelOperationSourceCopy);
gSave();
}
// 创建 PictureBox 对象
PictureBox box = new PictureBox();
boxLocation = new Point(0, 0);
boxSizeMode = PictureBoxSizeModeStretchImage;
boxSize = imageSize;
boxImage = image;
// 创建 Form 对象
Form f = new Form();
fAutoScroll = true; // 自动滚动
fSize = new Size(800, 600);
// From_FormClosed 用于释放资源
fFormClosed += (sender, e) => { imageDispose(); };
// From_MouseWheel 用于缩放
// 由于滚动条和缩放同时进行 会有点不爽
// 建议右键菜单或 Control/Shift/Alt + 鼠标滚轮组合实现
fMouseWheel += (sender, e) =>
{
if (eDelta > 0)
{
// 限制放大效果 600% 以内
if (boxWidth / imageWidth < 6)
{
boxSize = new Size(
(int)(boxWidth 11),
(int)(boxHeight 11));
}
}
else
{
// 限制缩小效果 15% 以内
if ((float)boxWidth / (float)imageWidth > 015f)
{
boxSize = new Size(
(int)(boxWidth 09),
(int)(boxHeight 09));
}
}
};
// 用于记录鼠标按下时的位置
Point pt = PointEmpty;
// PictureBox_MouseDown 用于记录鼠标位置 绘制屏幕十字标记
boxMouseDown += (sender, e) =>
{
if (eButton == MouseButtonsLeft)
{
pt = eLocation;
// CursorPosition 获取全局鼠标位置(屏幕位置)
// CopyFromScreen 拷贝 1 个屏幕像素并生成
// BitmapGetPixel 获取上指定像素的颜色
using (Bitmap bitmap = new Bitmap(1, 1))
{
using (Graphics g = GraphicsFromImage(bitmap))
{
gCopyFromScreen(
CursorPositionX, CursorPositionY, 0, 0,
bitmapSize, CopyPixelOperationSourceCopy);
gSave();
}
// 设置窗口文本
// 显示鼠标当前位置和鼠标位置的像素颜色
Color color = bitmapGetPixel(0, 0);
fText = stringFormat("Pos: {0}, Color: {1}",
eLocation, color);
}
using (Graphics g = GraphicsFromHwnd(boxHandle))
{
using (Pen p = new Pen(ColorIndianRed, 3))
{
gDrawLine( // 画十字图形的 X 轴
p, new Point(eX - 10, eY), new Point(eX + 10, eY));
gDrawLine( // 画十字图形的 Y 轴
p, new Point(eX, eY - 10), new Point(eX, eY + 10));
}
}
}
};
// PictureBox_MouseUp 用于清除鼠标位置信息和屏幕十字标记
boxMouseUp += (sender, e) =>
{
if (eButton == MouseButtonsLeft)
{
pt = PointEmpty;
boxRefresh();
}
};
// PictureBox_MouseMove 用于绘制选择框
boxMouseMove += (sender, e) =>
{
// 设置窗口文本 显示鼠标当前位置
fText = stringFormat("Pos: {0}", eLocation);
if (eButton == MouseButtonsLeft && pt != PointEmpty)
{
using (Graphics g = GraphicsFromHwnd(boxHandle))
{
using (Pen p = new Pen(ColorIndianRed, 1))
{
// pt1 用于判断鼠标是否离开了 PictureBox
// 如果离开则重设 pt1
// 如此可保证被绘制的矩形一定出现在 PictureBox 中
Point pt1 = eLocation;
if (pt1X < 0) pt1X = 0;
if (pt1Y < 0) pt1Y = 0;
if (pt1X > boxWidth - 1) pt1X = boxWidth - 1;
if (pt1Y > boxHeight - 1) pt1Y = boxHeight - 1;
boxRefresh(); // 不刷新的话 会出现N个矩形
pDashStyle = SystemDrawingDrawing2DDashStyleDash;
gDrawPolygon(p, new Point[] {
pt,
new Point (pt1X, ptY),
pt1,
new Point(ptX, pt1Y) });
}
}
}
};
// 记录当前翻转样式
int rotate = 0;
// PictureBox_MouseDoubleClick 用于翻转
boxMouseDoubleClick += (sender, e) =>
{
if (eButton == MouseButtonsLeft)
{
// 由于是对 PictureBox 进行的 *** 作
// 只是进行了翻转,但大小未变
// 所以需要通过的某个边判断
// 是否因翻转而导致 Width / Height 互换
int imgWidth = boxImageWidth;
boxImageRotateFlip((RotateFlipType)rotate);
if (++rotate > 7) rotate = 0;
if (imgWidth == boxImageWidth) return;
boxSize = new Size(boxHeight, boxWidth);
}
};
fControlsAdd(box);
fShow();
}在有时候我们为了实现软件的美观,我们需要把窗体的边框隐藏,但是问题也会随之而来,在属性中设置了FormBorderStyle应该为None,边框便可以隐藏,但是我们在使用软件时却无法拖动窗体,那么我们该如何解决这个问题呢。其实代码很简单,只要override WndProc方法便可。在无边框窗体的代码中加入下面的protected override void WndProc(ref Message m)方法便可。具体代码如下:\x0d\using System;\x0d\using SystemWindowsForms;\x0d\\x0d\namespace WindowsFormsApplication1\x0d\{\x0d\ public partial class Form1 : Form\x0d\ {\x0d\ public Form1()\x0d\ {\x0d\ InitializeComponent();\x0d\ }\x0d\\x0d\ #region 移动窗体\x0d\ /// \x0d\ /// 重写WndProc方法,实现窗体移动和禁止双击最大化\x0d\ /// \x0d\ /// Windows 消息\x0d\ protected override void WndProc(ref Message m)\x0d\ {\x0d\ switch (mMsg)\x0d\ {\x0d\ case 0x4e:\x0d\ case 0xd:\x0d\ case 0xe:\x0d\ case 0x14:\x0d\ baseWndProc(ref m);\x0d\ break;\x0d\ case 0x84://鼠标点任意位置后可以拖动窗体\x0d\ thisDefWndProc(ref m);\x0d\ if (mResultToInt32() == 0x01)\x0d\ {\x0d\ mResult = new IntPtr(0x02);\x0d\ }\x0d\ break;\x0d\ case 0xA3://禁止双击最大化\x0d\ break;\x0d\ default:\x0d\ baseWndProc(ref m);\x0d\ break;\x0d\ }\x0d\ }\x0d\ #endregion\x0d\ }\x0d\}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)