System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。而且报错并不在这个ProgressBar的重绘函数WndProc中,而是在另一个线程的Excel.Application.Close()处报错;
当然从时间和执行顺序上估算,正好是ProgressBar控件所在窗口关闭时调用Excel.Application.Close()。protected override void WndProc(ref Message m)
{
const int WM_PAINT = 0x000F;
base.WndProc(ref m);
if (control == null) return;
switch (m.Msg)
{
case WM_PAINT:
IntPtr vDC = GetWindowDC(m.HWnd);
Graphics vGraphics = Graphics.FromHdc(vDC);
StringFormat vStringFormat = new StringFormat();
vStringFormat.Alignment = StringAlignment.Center;
vStringFormat.LineAlignment = StringAlignment.Center;
vGraphics.DrawString(text , font , new SolidBrush(foreColor) , new Rectangle(0 , 0 , control.Width , control.Height) , vStringFormat);
ReleaseDC(m.HWnd , vDC);
break;
}
//删掉这一句就没问题了
base.WndProc(ref m);
}
当然从时间和执行顺序上估算,正好是ProgressBar控件所在窗口关闭时调用Excel.Application.Close()。protected override void WndProc(ref Message m)
{
const int WM_PAINT = 0x000F;
base.WndProc(ref m);
if (control == null) return;
switch (m.Msg)
{
case WM_PAINT:
IntPtr vDC = GetWindowDC(m.HWnd);
Graphics vGraphics = Graphics.FromHdc(vDC);
StringFormat vStringFormat = new StringFormat();
vStringFormat.Alignment = StringAlignment.Center;
vStringFormat.LineAlignment = StringAlignment.Center;
vGraphics.DrawString(text , font , new SolidBrush(foreColor) , new Rectangle(0 , 0 , control.Width , control.Height) , vStringFormat);
ReleaseDC(m.HWnd , vDC);
break;
}
//删掉这一句就没问题了
base.WndProc(ref m);
}
解决方案 »
- 正则问题
- 遍历文件夹,有10万张图片,把地址插入mysql中,用什么方法快。
- 回文素数算法
- checkedListBox 不可用时,怎么样把那个勾变成灰色?
- 做随机数生成,如何让那些生成的数一直在跳,就像摇奖那样?
- c#能写成c/s架构的winform程序么?要是能怎么发布呀?
- VS中组件和类库什么区别?
- 请教各位DX,如何实现两个程序之间的数据交换,比如一个程序调另一个程序中的DataTable中的数据?
- Web程序 混淆加密后居然都不能用,请大家帮忙
- winform 需要访问同局域网内另一台电脑内的文件,不能设为共享,因为那是做为服务器的机器,该怎么做
- 如何用gridview读取sql 2005数据库里的XML字段
- 文本框掩码
private const int WM_PAINT = 0x000F;
protected override void WndProc(ref Message m)
{
if(m.Msg == WM_PAINT && control != null)
{
IntPtr vDC = GetWindowDC(m.HWnd);
Graphics vGraphics = Graphics.FromHdc(vDC);
StringFormat vStringFormat = new StringFormat();
vStringFormat.Alignment = StringAlignment.Center;
vStringFormat.LineAlignment = StringAlignment.Center;
vGraphics.DrawString(text , font , new SolidBrush(foreColor) , new Rectangle(0 , 0 , control.Width , control.Height) , vStringFormat);
ReleaseDC(m.HWnd , vDC);
}
base.WndProc(ref m);
}
base.WndProc(ref m);放在后面为什么不会把前面的绘图操作给覆盖了呢
只有public const int WM_ERASEBKGND = 0x14;才会重绘背景,这个是默认实现的。你调用消息处理会更新屏幕。
protected override void WndProc(ref Message m)
{
if(m.Msg == WM_PAINT && control != null)
{
IntPtr vDC = GetWindowDC(m.HWnd);
Graphics vGraphics = Graphics.FromHdc(vDC);
StringFormat vStringFormat = new StringFormat();
vStringFormat.Alignment = StringAlignment.Center;
vStringFormat.LineAlignment = StringAlignment.Center;
vGraphics.DrawString(text , font , new SolidBrush(foreColor) , new Rectangle(0 , 0 , control.Width , control.Height) , vStringFormat);
ReleaseDC(m.HWnd , vDC);
return;
}
base.WndProc(ref m);
}