http://www.carrefourstation.com

新蒲京娱乐场VC++大数据量绘图时无闪烁刷屏技能达成(小编的知道是,在内部存款和储蓄器上画画,然后手动呈现,

case WM_PAINT: {     hdc = BeginPaint(hWnd, &ps);     RECT rc = {0};     GetClientRect (hWnd, &rc) ;     HDC hMemDC = CreateCompatibleDC(ps.hdc);     SelectObject(hMemDC, g_hBmpAllWstDskWallpaper);//选择位图      //ExcludeClipRect(ps.hdc,0,0,200,100);  //排除部分区域. A line     BitBlt(ps.hdc,0,0,300,200,hMemDC,0,0,SRCCOPY);     DeleteDC(hMemDC);     EndPaint(hWnd,&ps); } 

       CBitmap * pOldBitmap = memDC.SelectObject(&bitmap);

CBitmap bmp; //内部存储器中承载不经常图象的位图  

  那风流罗曼蒂克多种的操作完毕后还不是特地实用,因为我们原先关系了,控件的体制也是概念Windows 窗体程序作为的一条门路,为了越来越好的兑现重复缓冲区必得安装控件的Opaque属性,这么些天性指明窗体是不担负在后台绘制本身的,换句话说,要是那么些个性设置了,那么必需为肃清和重绘操作增添相关的代码。具有双重缓冲区版本的SpiderWeb程序通过上述的设置在每一次索要重绘时都展现美好,窗身体表面面用其和好的背景象进行割除,那样就更是收缩了闪烁的产出。

 

解决Windows程序界面闪烁难题的有个别经验

ASSERT_VALID(pDoc);  

  上面定义的OnPaintBackground方法先及时调用基类方法,那能够保证具有底层绘制的代码都可以被推行。下一步,从Paint伊夫ntArgs中获取Graphics对象,再将Graphics对象的剪切区域定义为textRegion对象。通过点名CombineMode.Exclude参数,明显无论在哪儿绘制或怎样绘制Graphics对象都不绘制textRegion区域里面。

case WM_PAINT:     {         hdc = BeginPaint(hWnd, &ps);         RECT rc = {0};         GetClientRect (hWnd, &rc) ;          HDC hMemDC = CreateCompatibleDC(ps.hdc);         SelectObject(hMemDC, g_hBmpAllWstDskWallpaper);          HRGN hrgn = NULL;         if (RECT_WIDTH(g_rcExclud) && RECT_HEIGHT(g_rcExclud))         {             hrgn = CreateRectRgn(g_rcExclud.left, g_rcExclud.top, g_rcExclud.right, g_rcExclud.bottom);             ExtSelectClipRgn(ps.hdc, hrgn, RGN_OR);//恢复上次被"excude"掉的区域,必须的,否则这一部分不会被绘制.             FillRect(ps.hdc,&g_rcExclud,(HBRUSH)GetStockObject(COLOR_WINDOW));//擦除上次绘制的图片区域.         }          g_rcExclud.left = rc.right-300;         g_rcExclud.top = rc.bottom-200;         g_rcExclud.right = rc.right;         g_rcExclud.bottom = rc.bottom;          BitBlt(ps.hdc,g_rcExclud.left,g_rcExclud.top,g_rcExclud.right-g_rcExclud.left,g_rcExclud.bottom-g_rcExclud.top,hMemDC,0,0,SRCCOPY);         ExcludeClipRect(ps.hdc,g_rcExclud.left,g_rcExclud.top, g_rcExclud.right, g_rcExclud.bottom);//排除掉图像所占据的区域         FillRect(ps.hdc,&rc,(HBRUSH)GetStockObject(COLOR_WINDOW));// 用窗口背景色绘制其余区域.          DeleteObject(hrgn);         DeleteDC (hMemDC) ;                      //释放内存设备环境         EndPaint(hWnd, &ps);         return 0;     }     break; case WM_SIZE:     InvalidateRect(hWnd, NULL, FALSE);//最后一个参数为FALSE,表示不用擦除背景.     break; 

(2)禁绝系统擦除你的窗口。
系统在必要重画窗口的时候会帮您用钦定的背景色来擦除窗口。不过,大概须求重画的区域只怕那四个小。只怕,在您重画那些事物里面还要通过大批量的计量才具早先.这时你能够禁止系统擦掉原本的图象。直到你曾经总括好了具备的数目,自个儿把那多个急需擦掉的一些用背景观覆盖掉(如:dc.FillRect(rect,&brush);rect是要求擦除的区域,brush是带背景观的刷子卡塔 尔(阿拉伯语:قطر‎,再画上新的图形。要幸免系统擦除你的窗口,能够重载On伊RusseBkgnd()函数,让其从来回到TRUE就能够了。如
BOOL CmyWin::OnEraseBkgnd(CDC* pDC) 
{
 return TRUE;
 //return CWnd::On伊RusseBkgnd(pDC);//把系统本来的那条语句注释掉。
}

本示例程序通过展开自便存档文件,将其ASCII码码值当做要展现的多少,并经过意气风发图画控件将其数量以图片的样式相继展现出来。本程序要管理的数据量极大,如不采取本文所述方法将会有很明显的闪耀。
先是新建生机勃勃基于CFormView的单文档应用程序WaveShower并在Form上增添后生可畏"picture"控件,设置其ID为 IDC_SCREEN、Type为Rectangle、Color为Black。在"Extended Styles"属性页里选中Modal  Frame检查框。继续增多生机勃勃菜单“展开数据文件”,并生成其响应函数OnOpenData(卡塔尔国。同有的时候候在视类中增加如下成员变量:

该示例程序的独一指标正是身体力行如何仅针对有个别区域张开图片绘制。

本文出自 “零一小筑” 博客,请必需保留此出处

 CDC* m_pMemoryDC = new CDC();
 CBitmap * m_pBitmap = new CBitmap();

**  当大家需求在客户区展现一些图纸时,先把图纸在客商区画上,纵然早就画好但这个时候我们还无法见到,还要经进程序主动地刷新客户区,强制Windows发送一条WM_PAINT音信,那将引发视类OnDraw函数简单地将全部的图样对象重画,那样才成功了图片的 突显职业,但在刷新的同不常间会孳生较显明的闪耀非常是当镜头面积极大、图像成分过多时更是刚毅依旧高达不能寻常干活的地步。因而,大家必要做相应的拍卖。本 文介绍了利用先在内部存储器中绘制图形,然后再把绘好的图样以位图情势从内部存款和储蓄器拷贝到窗口客户的破除刷屏闪烁的风度翩翩种方式。 

  假如您的次序规定要开展绘图操作,使用两种技巧能够增进绘制品质。确认保障争取设置控件属性以至方便的Paint事件管理是编辑强壮程序的启幕。在权衡好利弊后得以动用重复缓冲区本事爆发特别“爱护视力”的结果。最终,在骨子里绘制前开展思量到底怎么客商区域或Region必要被绘制将极其便于。

末段,改良窗口的轻重,观察一下这幅图片,始终在窗口右下角,并且图片真的不再闪烁.  

}

前后相继示例

  在将内存中的位图对象赋给Graphics后通过放置那行代码,我们在画布上所画的每三个线条都选用了反锯齿,使暴涨暴跌的线条显得尤为平整。

 Chapter I: ExcludeClipRect在一个区划区域肃清贰个矩形,引致绘制该剪切区域时,不绘制该矩形.   ExcludeClipRect函数实际情况请仿照效法MSDN,那么些函数用于破除叁个区域的大器晚成局地,常用来绘制图画,举例,在七个窗口的顾客区绘制大器晚成幅图片,如上边代码所示:

      

int m_BufLen; //数据长度
unsigned char* buffer; //数据缓存
int m_dx; //数据偏移量 
int m_DY; //数据显示区的幅度
CPoint* value; //将要显示的数值
int m_DX; //数据显示区的宽度
int m_Y0; //数据显示区参照点位置
CRect rect; //数据显示区矩形

以下是引用片段:
    protected override void   OnPaintBackground(PaintEventArgs e) 
    { 
    base.OnPaintBackground(e); 
    Graphics bgGraphics = e.Graphics; 
    bgGraphics.SetClip(textRegion,   CombineMode.Exclude); 
    bgGraphics.FillRectangle(backgroundBrush,   e.ClipRectangle); 
    bgGraphics.Dispose(); 
    }

Chapter III: 使用ExcludeClipRect完成无闪烁图像 有网民写过有关作品: 那篇文章些的精确性,可是依旧有三个难题,就是Chapter II所波及的ExcludeClipRect不会自由"exclude"掉的区域,那样只要因为窗口大小的转移引致位图地方的转移,而"exclude"掉的区域是不会被背景擦除的. 何况那篇文章还应该有两个地点并未说领悟,那正是减轻图像闪烁的艺术其实是永不擦除窗口背景,而绘制窗口前途色,图像区域用位图绘制,其余区域用窗口背景观绘制,这一定于把豆蔻梢头幅挖了一个洞(这么些局地正是图像,此外一些行使背景观绘制)的画布贴到窗口,这样不发生绘制重叠部分,上边是校勘后的代码:  

*******************************

  下边就要加多的计时器响应函数便是本文的首要,为便利相比较起见,笔者写了三个OnTimer响应函数,前一个是使用常 规的日常方法描点的,运营起来可以很显然地观察镜头的闪光跳动。而后风度翩翩种则是运用本文所述方法运用的内部存款和储蓄器画图的方法,运维后大致画面无闪烁。上面正是两段 比较代码的原码部分:

  结果什么?图像的绘图平滑多了。从内部存款和储蓄器军长蜘蛛网的线条推到前台以体现出来是一心未有闪烁的,不过大家依然多少停顿一下,先将内部存款和储蓄器中的位图修整一下再显示出来,能够加上大器晚成行代码以便使线条看起来越发平整。

#define RECT_WIDTH(rt)      (rt.right-rt.left) #define RECT_HEIGHT(rt)     (rt.bottom-rt.top) RECT g_rcExclud = {0}; BOOL g_bCancelExcludeRect = FALSE; case WM_PAINT: {     hdc = BeginPaint(hWnd, &ps);     RECT rc = {0};     GetClientRect (hWnd, &rc) ;     HDC hMemDC = CreateCompatibleDC(ps.hdc);     SelectObject(hMemDC, g_hBmpAllWstDskWallpaper);//选择位图      // "exclud"掉的区域在右下角.     g_rcExclud.left = rc.right-200;     g_rcExclud.top = rc.bottom-100;     g_rcExclud.right = rc.right;     g_rcExclud.bottom = rc.bottom;      HRGN hrgn = NULL;   // 将上次"exclud"掉的区域填补回来.     if (g_bCancelExcludeRect && RECT_WIDTH(g_rcExclud) && RECT_HEIGHT(g_rcExclud))     {         hrgn = CreateRectRgn(g_rcExclud.left, g_rcExclud.top, g_rcExclud.right, g_rcExclud.bottom);         ExtSelectClipRgn(ps.hdc, hrgn, RGN_OR);         FillRect(ps.hdc,&g_rcExclud,(HBRUSH)GetStockObject(COLOR_WINDOW));//擦除上次绘制的图片区域.     }      (!g_bCancelExcludeRect) //"exclud"掉窗口右下角区域.         ExcludeClipRect(ps.hdc,g_rcExclud.left, g_rcExclud.top, RECT_WIDTH(g_rcExclud), RECT_HEIGHT(g_rcExclud));     BitBlt(ps.hdc,0,0,400,300,hMemDC,0,0,SRCCOPY);//在右下角绘制一个位图.      DeleteDC(hMemDC);     if (hrgn != NULL) DeleteObject(hrgn);     EndPaint(hWnd,&ps); } 

为便于精晓,以上代码未经优化。

小结

以下是引用片段:
    protected override void   OnPaint(PaintEventArgs e) 
    { 
    base.OnPaint(e); 
    Graphics fgGraphics = e.Graphics; 
    fgGraphics.FillRegion(foregroundBrush, textRegion); 
    fgGraphics.Dispose(); 
    }

I: ExcludeClipRect在叁个分割区域消释二个矩形,引致绘制该剪切区域时,不绘制该矩形. ExcludeClipRect函数详细情形请参谋MSDN,那一个函数用于肃清...

貌似的windows 复杂的分界面需求使用多层窗口同一时间要用贴图来标榜,所以不可幸免在窗口移动依旧转移大小的时候现身闪烁。

ellipseRect.InflateRect(i*10,i*10);  

  使用GDI+的DIB(与器材毫不相关的位图)对象来贯彻这种画面以外的内部存储器缓冲,自带双重缓冲区机制的控件则能好的运用该位图对象。DIB是底层Win32的对象用于高效的显示屏绘制。同样,值得注意的是GDI+的率先个版本GDI中仅与硬件增加速度有关以至一些粗略意义能够直接采纳,由于这样的限制,像反锯齿和半透明等显示屏绘制方法施行起来的速度则一定慢。固然双重缓冲区机制消耗了有的内部存款和储蓄器可是它的应用不得不承认的提升了程序的实施品质。

双重运转程序,并转移窗口大小,能够发掘,顾客区矩形区域{0, 0, 200, 100}始终不会被绘制.可以知道这几个函数生龙活虎旦被调用,那么这几个函数解除的矩形区域将永世不会在该DC上制图,那么有未有哪些艺术恢复生机该区域啊? 其实比一点也不细略,将那块被"Exclude"掉的矩形区域再"找回来"就能够了.办法正是程序再次创下造三个分割区域,使其尺寸和职位和从前"Exclude"掉的等同,然后调用ExtSelectClipCR-Vgn,注意倒数参数要利用处胜GN_OSportage,那代表合併五个分叉区域.那样就也正是找回了那个"Exclude"掉的矩形区域.上面是代码:

 pDC->BitBlt(ScrollPoint.x, ScrollPoint.y, rect.right, rect.bottom, m_pMemoryDC, 0, 0, SRCCOPY);

  请相比较上边双重缓冲区绘图事件与前面介绍的简便绘图事件间的差异:

这段代码在窗口客商区绘制一个位图,那没难点.不过小心一下A行,它是注释掉的,然后去掉这一个注释,再度运路程序,能够洞察到,这几个位图尽管依然绘制在了窗口的客户区,可是矩形区域{0, 0, 200, 100}呈现的仍然为窗口的背景观,换句话说,位图缺了这一块.那是因为ExcludeClipRect将{0, 0, 200, 100}矩形从窗口剪切区域消逝掉了,那样GDI是不会绘制那么些矩形区域的. Chaper II: ExcludeClipRect函数不自由废除的矩形区域   将Chapter I代码中的A行改为:

不常须求在窗口上利用部分控件,比方IE,当你的窗口改换大小的时候IE会闪烁,固然你有了WS_CLIPCHILDREN
也没用。原因在于窗口的类风格有CS_HREDRAW 或者 CS_VREDRAW,那五个作风表示窗口在拉长率可能高度变化的时候
重画,不过如此就能唤起IE闪烁

上边是内部存款和储蓄器缓冲作图的步子。  

  最终,OnPaint事件负担标准的绘图出字符串。能够超级轻巧的经过调用Graphics的FillRegion方法来落实。通过点名的前途刷子foregroundBrush和textRegion且仅是该区域被绘制。结果,Windows 窗体程序在运转在此之前的确“考虑”该怎么进行绘图。

BOOL g_bCall = TRUE;//全局变量. if (g_bCall) {     g_bCall = FALSE;     ExcludeClipRect(ps.hdc,0,0,200,100); //排除部分区域,仅调用一次. A line } 

行使内部存款和储蓄器DC解决重画闪烁难点

dcMem.CreateCompatibleDC(pDC); //依据窗口DC创立包容内部存储器DC  

  “智能无效”(智能重绘)就是在暗暗表示工程师应该明了仅回答程序中没用的区域实行重绘,对Regions对象所对应的失效区域开展重绘能够增加绘制质量,使用Regions对象你能够仅清除或绘制控件和窗体的风流洒脱部分区域已收获越来越好的属性。大家今后就初叶来看一下BasicClip示例程序,那些顺序接纳保留在PaintEventArgs对象的ClipRectangle对象,此前大家早就说起,不论何时当程序的高低发生变化时Paint事件都会被激活。BasicClip示例程序用红和蓝二种颜色填充剪切的矩形区域,利用不一致的速度调解窗体的分寸几回以往,你会发掘绘制的矩形区域实际正是窗体的不算区域(包蕴超过原始窗体大小的区域部分和缩少了的区域部分),示例程序的Paint事件代码如下:

 

当上面意况之一发生时,就要求应用程序一定刷新其客商区的大器晚成局地或任何,Windows会向窗口函数发送一条WM_PAINT新闻。其它,当 Windows删除覆盖窗口部分区域的对话框或音讯框时和菜单下拉出来又被放出时窗口客商区被暂且覆盖,系统会计划保存展现区域,可是不自然能不辱职分,恐怕向窗口函数发送一条WM_PAINT音讯,供给应用程序刷新其顾客区。须要表明的是:光标或图符穿过窗口客商区时,也可能覆盖展现内容,但这种气象下,系 统一定能保存并回复被覆盖的区域,所以当时并不会发送WM_PAINT音信来供给应用程序去刷新其显示区。在Windows  应用程序的窗口函数中,对WM_PAINT音信的拍卖正是刷新其客商区,那是黄金年代种长久的程序结构。

  适当的咬合使用区域和智能重绘你能够编写出运营速度快且不会唤起闪烁的绘图代码,並且比单独选拔重复缓冲区绘制还要节外省部存款和储蓄器的花销。

       bitmap.CreateCompatibleBitmap(pDC, clRect.Width(), clRect.Height());

当客商区有所退换,而又要将改换显示出来,就必然要强制Windows发送一条WM_PAINT音信,从而吸引OnDraw函数的重画,那样虽成功了 图形的体现,却也会挑起较猛烈的闪亮,当画面上多少不是点不清时髦不明朗,当顾客区有一些不清个点的时候刷新一次会孳生整幅画面包车型大巴刚毅跳动,极其是对于广大 实时监察和控制软件和矢量电子地图软件,此类软件日常在荧屏上都会动辄几千、几万个要素点,很鲜明单靠发送WM_PAINT 音信引发OnDraw  的重画根本满意不断实际须求。

  智能重绘,在绘制前供给研商一下

 m_pMemoryDC->SelectObject(pOldbmp); 
 m_pBitmap->DeleteObject();
 m_pMemoryDC->DeleteDC();

 

以下是引用片段:
    private void Setup() 
    { 
    GraphicsPath textPath = new GraphicsPath(); 
    textPath.AddString(displayString,   FontFamily.GenericSerif, 
    0, 75, new Point(10, 50), new   StringFormat()); 
    textRegion = new Region(textPath); 
    backgroundBrush = new TextureBrush(new   Bitmap("CoffeeBeanSmall.jpg"), 
    WrapMode.Tile); 
    foregroundBrush = new   SolidBrush(Color.Red); 
    }

<二>

 

以下是引用片段:
    private void SpiderWeb_DblBuff_Paint(object   sender, PaintEventArgs e) 
    { 
    Graphics g = e.Graphics; 
    Pen bluePen = new Pen(Color.Blue); 
    Bitmap localBitmap = new   Bitmap(ClientRectangle.Width,ClientRectangle.Height); 
    Graphics bitmapGraphics =   Graphics.FromImage(localBitmap); 
    LineDrawRoutine(bitmapGraphics, bluePen); 
    //把在内存里处理的bitmap推向前台并显示 
    g.DrawImage(localBitmap, 0, 0); 
    bitmapGraphics.Dispose(); 
    bluePen.Dispose(); 
    localBitmap.Dispose(); 
    g.Dispose(); 
    }

       // TODO: Add your message handler code here and/or call default

接下来在视类中加多函数GetScreenRect()用以获取数据显示区的轻重及任何参数;加多函数CleanScreen()完结解除数据呈现区的机能;增加函数DrawPoint()以便在数码呈现区画点:

  为了更加好的演示Regions的用法,请查看TextCliping示例程序。该程序重载了OnPaintBackground和OnPaint方法,直接重载那些主意比侦听事件更能确定保证代码在其他的绘图操作此前被调用,况兼对于自定义控件的绘图也尤为实用。为了知道起见,示例程序提供了一个Setup方法,该措施定义了全局的Graphics对象。

GetClientRect(rectClient);
rgn1.CreateRectRgnIndirect(rectClient);
rgn2.CreateRectRgnIndirect(m_rectEdit);

大器晚成、普通方法:  

以下是引用片段:
    private void LineDrawRoutine(Graphics g,   Pen p) 
    { 
    float width = ClientRectangle.Width; 
    float height = ClientRectangle.Height; 
    float xDelta = width / LINEFREQ; 
    float yDelta = height / LINEFREQ; 
    for (int i = 0; i < LINEFREQ; i++) 
    { 
    g.DrawLine(p, 0, height - (yDelta * i),   xDelta * i, 0); 
    } 
    }

 
下述代码在OnDraw时绘制:

ptCenter = rect.CenterPoint();  

  概念

       CRedrawDemoDoc* pDoc = GetDocument();

注意:bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());  

  Windows 应用程序是温馨担负绘制的,当三个窗体”不到底”了,也正是说窗体制纠正变了大大小小,只怕局地被别的程序窗体掩盖,恐怕从最小化状态复苏时,程序都会采用供给绘制的信息。Windows把这种”不根本”状态称为”无效的(Invalidated)”状态,我们精通为:须求重绘,当Windows 窗体程序供给重绘窗体时它会从Windows消息队列中赢得绘制的消息。这些音信经过.Net框架封装然后传递到窗体的 PaintBackground 和 Paint 事件中去,在上述事件中优越的书写特意用于绘制的代码就可以。

       rect.right = rect.left + 160;

CBCDoc* pDoc = GetDocument();  

  上述代码分成四个着力的步子来创立示范程序。首先 InitializeComponent 方法包括部分性质的装置和附加窗体 Paint 事件的管理进程。注意,在艺术中央调节件的样式也还要被安装,设置控件的样式也是自定义Windows 窗体及控件行为的风姿洒脱种有效渠道,举例:控件的"ResizeRedraw"属性提醒当窗体的大小变化爆发之后须求对其完全实行重绘,也等于说重绘时连连须要对一切窗体的客商区域张开重绘。窗体的“客商区域”是指除了标题栏和边框的兼具窗体区域。能够开展八个有趣的考试,打消该控件的习性然后再运路程序,我们得以很扎眼的观看为何该属性会被平常的安装,因为窗体调解大小后的无用区域根本不会被重绘。

       int x = 100, y = 100;

for(int i=20;i>0;i--) 

以下是引用片段:
    private void BasicClip_Paint(object sender,   PaintEventArgs e) 
    { 
    Graphics g = e.Graphics; 
    if (currentBrush.Color == Color.Red) 
    currentBrush.Color = Color.Blue; 
    else 
    currentBrush.Color = Color.Red; 
    g.FillRectangle(currentBrush,   e.ClipRectangle); 
    g.Dispose(); 
    }

应用以下API来管理窗口移动,BeginDeferWindowPos, DeferWindowPos,EndDeferWindowPos
先调用 BeginDeferWindowPos 设定须要活动的窗口的个数
应用DeferWindowPos,来运动窗口,这几个API并不真的变成窗口移动
EndDeferWindowPos 贰次性完成具备窗口的深浅和岗位的改换。

 

  重复缓冲区绘图技能

       ASSERT_VALID(pDoc);

dcMem.DeleteDC(); //删除DC

  BasicClip示例程序中的彩色矩形区域就是表示窗体的下方和侧边的不行区域。

缓慢解决格局:

CRect rect,ellipseRect

  不享有双重缓冲区技巧的SpiderWeb示例程序

缓和办法:注册窗口类的时候不要使用那八个作风,若是窗口要求在转移大小的时候重画,那么能够在WM_SIZE的时候
调用RedrawWindow。

 

  轻巧的绘图示比如下:

 //m_pMemoryDC->SelectStockObject(WHITE_BRUSH);//画出暗绛红背景方法生机勃勃
 //m_pMemoryDC->Rectangle(-1,-1,rect.right + 2 , rect.bottom + 2 );
 //m_pMemoryDC->SelectStockObject(NULL_BRUSH);

 

  上边提供的演示程序能够表达双重缓冲区的概念和促成方式,那么些示例所含有的机能已特别完整,且完全可以在事实上使用中运用。在该章节后边还有恐怕会谈起该技巧应该合营控件的有的质量设置技能到达越来越好的魔法。

       RECT clRect;

{  

  好了,大家要求潜心一下BasicX_Paint方法,正如先前所关联的,Paint 事件在程序须求重绘时被激活,程序窗体利用Paint事件来肩负回复须求重绘的类别音讯,BasicX_Paint方法的调用须要三个指标sender 和二个PaintEventArgs类型的变量,Paint伊芙ntArgs类的实例或称为变量 e 封装了八个首要的多寡,第二个就是窗体的 Graphics 对象,该目的表示窗体可绘制的外界也称得上画布用于绘制诸如线、文本甚至图像等,第三个数据正是ClipRectangle,该Rectangle对象表示窗体上无效的的矩形范围,大概说正是窗体必要重绘的区域。记住,当窗体的ResizeRedDraw设置后,调节大小后该ClipRectangle的轻重缓急实际就相当于窗体整个客户区域的尺寸,可能是被别的程序窗体掩没的那某个区划区域。关于部分区划区域的用场我们会在智能重绘章节作更详尽的阐释。

       // TODO: add draw code for native data here

When a memory device context is created, it initially has a 1-by-1 monochrome bitmap selected into
it. If this memory device context is used in CreateCompatibleBitmap, the bitmap that is created is a
monochrome bitmap. To create a color bitmap, use the hDC that was used to create the memory
device context, as shown in the following code:  

  纵观程序的源码你会发觉在程序Paint事件激活后是透过调用LineDrawRoutine方法来贯彻线的绘图的。LineDrawRoutine方法有八个参数,第2个是Graphics对象是用以绘制线条的地点,第三个是绘图工具Pen对象用来画线条。代码十三分轻松,二个循环语句,LINEFREQ常量等,程序从窗体表面包车型客车左下一向划线到其右上。请介意,程序行使浮点数来测算在窗体上的绘图地点,那样做的裨益正是当窗体的分寸爆发变化时地点数据会更纯粹。

}

CRect rect,ellipseRect;  

  结论

郑重声明:本文版权归澳门新莆京手机网站所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。