建立了一个Dialog类型的MFC工程,拖动了一个static控件到上面,然后在控件上绘图,我是想绘制一个类似围棋网格的图形。
开始时,我在主Dialog类的OnPaint函数中加的code,如下所示:
我是采用了内存DC的方式,先创建兼容内存DC并在上面绘图,然后再通过bitblt函数将内存DC刷到当前DC上。当然,创建与绘制的过程应该在其它的函数中执行,OnPaint中只执行bitblt操作。这样会防止每次窗口重绘调用OnPaint时再一次创建兼容DC并绘图,这是没有意义的。这里我就不细说了,code先这样写。
但是,这有一个问题,程序运行之后,static上并不会出现我们想绘制的图形。后来经过多方查阅,我发现是因为主Dialog的OnPaint函数执行完之后,才会执行每个控件的创建显示,所以我们把code加在这个OnPaint中,就被后来的操作给覆盖了,相当于没什么用处。
解决这个问题有三种方法:
第一种,我们不用这种memDC的方式,直接创建一个CPaintDC,然后在上面绘图,就可以正常显示。
第二种,我们在bitblt函数上面强制让程序绘制static控件,加上GetDlgItem(IDC_STATIC)->Invalidate();与GetDlgItem(IDC_STATIC)->UpdateWindow();两句话,之后再执行bitblt,相当于程序先创建显示static对话框,之后我们的memDC把它覆盖了,这样就能正常显示了。
第三种,自己建立一个继承于CStatic的类,将static控件绑定一个此类型的变量,然后我们自己实现自定义类中的OnPaint函数,这样做是比较推荐的,因为自己的控件,自己绘制的原则,不应该将某个控件的绘制加在主Dialog的OnPaint函数中。这样做也不会改变MFC框架定义的执行流程,不像第二种方法那样。
我最后采用了第三种方法,但是我自己定义的类中的OnPaint函数只执行bitblt刷图,memDC与rect等创建显示时用到的变量都是我自定义类的成员变量,我的memDC的创建与绘制操作是在主DiaLog的OnInitDialog中完成的(因为就是绘制一个网格,以后也不会变化,所以我们一开始就把memDC的内容固定死了)。