- System.Timers.Timer類(lèi)是一個(gè)線(xiàn)程類(lèi)润绎,使用該定時(shí)器控制主線(xiàn)程的控件時(shí)渠旁,直接調(diào)用控件會(huì)報(bào)錯(cuò):無(wú)法跨線(xiàn)程調(diào)用控件。
解決辦法是在調(diào)用控件時(shí)采用如下方法:
item.Invoke(new Action(() =>
{
item.Location = end;
}));
調(diào)用控件的invoke方法沼本,然后傳入一個(gè)委托對(duì)象敬察,通過(guò)委托對(duì)控件進(jìn)行操作。
- winform中的鼠標(biāo)事件如MouseDown, MouseUp, MouseMove等事件币他,只有當(dāng)鼠標(biāo)直接在定義了事件的控件上發(fā)生對(duì)應(yīng)的事件才會(huì)觸發(fā)坞靶。比如說(shuō),一個(gè)自定義控件上面放置了一個(gè)label蝴悉,但是對(duì)控件本身定義了鼠標(biāo)事件彰阴。那么只有當(dāng)鼠標(biāo)直接在控件上操作才能觸發(fā)事件,鼠標(biāo)在label上操作并不會(huì)觸發(fā)辫封。
- 鼠標(biāo)的坐標(biāo):
//絕對(duì)坐標(biāo)硝枉,即鼠標(biāo)相對(duì)于屏幕左上角的坐標(biāo)
Point point = Control.MousePosition;
//鼠標(biāo)相對(duì)于控件control的坐標(biāo)
Point point2 = control.PointToClient(Control.MousePosition);
//控件的坐標(biāo)(控件的左上角位置坐標(biāo)),相對(duì)于父控件計(jì)算
Point point3 = control.Location;
- 控件分層
control.BringToFront(); //將控件置于頂層
control.SendToBack(); //將控件置于底層
- 獲取圖片不透明部分的region(適用于做邊界不規(guī)則的透明控件)
private unsafe Region GetRegion(Bitmap bckImage)
{
GraphicsPath path = new GraphicsPath();
int w = bckImage.Width;
int h = bckImage.Height;
BitmapData bckdata = null;
try
{
bckdata = bckImage.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
uint* bckInt = (uint*)bckdata.Scan0;
for (int j = 0; j < h; j++)
{
for (int i = 0; i < w; i++)
{
if ((*bckInt & 0xff000000) != 0)
{
path.AddRectangle(new Rectangle(i, j, 1, 1));
}
bckInt++;
}
}
bckImage.UnlockBits(bckdata); bckdata = null;
}
catch
{
if (bckdata != null)
{
bckImage.UnlockBits(bckdata);
bckdata = null;
}
}
Region region = new System.Drawing.Region(path);
path.Dispose(); path = null;
return region;
}
由于該方法采用了指針倦微, 所以是不安全代碼妻味,若想運(yùn)行,需要在項(xiàng)目屬性中設(shè)置“允許不安全代碼運(yùn)行”欣福。