Windowsclient开发简单介绍(四)

        在上一篇文章里,我简单扼要的给大家介绍了一下GDI的基础知识,包含DCHDCGDI对象等等,总的来说都是些偏理论的知识,属于概念的范畴。

         今天这篇文章里,我就要正式開始有点实际的东西了。我会教大家一些GDI的基本功能代码编写。主要的技巧,当然还有怎样避免主要的坑。哈哈,对的,主要的坑而不是高级的。

         那么我要怎样说起呢。首先我要告诉大家怎样创建DC。怎样使用DC,怎样设置DC的属性(也就是GDI对象),怎样在DC上绘制简单的文字,绘制图形,绘制图片也就是位图。

我还会附带的说说GDI+,说说CImage这个画图超级方便的类(我在我过去的项目中大量的使用了这个类)。还要说说圆角窗体的实现。包含用蒙板色的办法和用层叠窗体的办法。当然这么多的内容在这样一篇文章里肯定是写不完的,所以我将在后面的文章里逐一介绍,有兴趣的朋友能够等我一篇一篇婉婉道来。

         首先来谈谈DC的使用

         获取DC的方式有好几种。一般而言有例如以下几种

         CreateDC,查阅MSDN可知其參数例如以下:

         HDC CreateDC(LPCTSTR lpszDriver, LPCTSTR lpszDevice, LPCTSTR lpszOutput,constDEVMODE* lpInitData)

                这个函数的第一个參数lpszDriver。表示你要创建DC的设备。也就是表示你想进行抽象的设备,一般而言能够是显示器或者打印机,由于用于打印的情况比較少,我们这里仅仅讨论“DISPLAY”这个參数的情况。

                当第一个參数为“DISPLAY”时,lpszDevice决定了你要在哪一个显示设备上进行绘制,假设你要在主显示设备上进行绘制,能够这样调用CreateDC

                CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL)

     这个函数的HDC类型返回值,就代表了这个显示设备,有了这个HDC,我们就能够在屏幕上进行绘制了。

     以下再说第二种获取DC的方式GetDC

     GetDC是基于窗体的,它仅仅有一个HWND类型參数,代表了你想进行绘制的窗体,由于它的使用方法比較简单。我这里不做多说

    

     讲到这里,是不是认为这两个函数还挺简单。可是在使用CreateDCGetDC创建的DC之后,GDI的对象和资源在使用完成后都是须要释放的,这里有个常见的坑,我在网上非常多的技术博客上看到不少作者都犯了这个错误。

     释放DC有两种函数

     DeleteDCReleaseDC

     那么它二者有什么差别呢?

     查阅MSDN对二者的Remark可知

     An application must not delete a DC whose handle was obtained bycalling the GetDC function. Instead, it mustcall the ReleaseDC function to free the DC.

            An applicationcannot use the ReleaseDC functionto release a DC that was created by calling the CreateDC function; instead, it must usethe DeleteDC function. ReleaseDC mustbe called from the same thread that called GetDC.

            换句话说:CreateDCDeleteDC配对使用,而GetDCReleaseDC配对使用,二者不可替换,用错了释放方法。这是刚開始学习的人,甚至非常多有经验的老鸟都会犯的错误。

并且在最后。还须要有一点要注意的,RelaseDC必须在与GetDC同样的线程中进行调用。

      看到这里,大家可能认为真的细节还是不少的,但这些正是区分一个Windows开发老手和菜鸟的标志,所以对于我们这些Windows开发者而言,须要注意得到地方的确非常多,我们必须一丝不苟的抠每个API的參数。含义以及坑。这大概也是一种乐趣吧。

                

原文地址:https://www.cnblogs.com/lcchuguo/p/5223120.html