65.9K
CodeProject 正在变化。 阅读更多。
Home

设备上下文实用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.59/5 (22投票s)

2001年1月25日

viewsIcon

198002

downloadIcon

4906

一个封装了一些有用的、与 GUI 相关的静态函数的类

引言

我的数百个应用程序 <grin> 或多或少都使用了 GUI 函数。我非常喜欢编写任何能产生视觉效果的东西。这一定是因为我们在技术性的同时,也可以发挥创造力。在我看来,MFC 非常棒,因为它提供了一个框架,让你不必再为“底层”架构编写代码,从而可以自由地编写所需的代码来高效地扩展已有的功能。

在整理这些代码时,我学到了一些东西。注意“整理”这个词!虽然有些东西确实是我写的,但很多都是改编的(有时改编比自己写还难!)。我推荐大家访问 http://www.cwinapp.com。这是一个很棒的网站,只有一个问题……去看看就知道了!我非常感谢创建那个网站的各位。

类结构

我已尽我所能使这些 GUI 函数尽可能简单易用。我希望能通过一次调用就完成我需要的任务。但这并非总是可行或高效。例如,有时像整个屏幕截图这样的大图像,应该先保存起来重复使用,以牺牲一些准确性为代价,而不是每次发生变化都重新获取图像。

我毫不怀疑很多人会质疑我的方法/技术/熟练程度等等。虽然我们天生是具有挑战性和竞争性的生物,但请记住:

我写这个首先是为了自己,而且正如任何有用的发现之后应该做的那样,我想分享它。其中还有很多缺失的地方,我打赌我们可以制作一个非常酷的 GUI 函数库。如果你发现了一个 bug,或者有关于另一个很酷的 GUI 函数的想法/代码,请告诉我!

函数及其参数

有几个函数没有文档,因为它们要么非常不言自明,要么是为类中更复杂的 DC 实用工具提供的非常简单的辅助函数。

大多数函数都有以下两个共同的参数,我不会重复说明它们的用法,除非我忘了已经告诉过你们,或者我真的需要这样做。;)

void CDCUtils::SomeFunction( CDC* pDC, CRect area, ..Other params.. )

指向 CDC 类的指针是进行绘图的上下文。在我的示例应用程序中,我一直提供一个“内存 DC”,其中无处不在的 CMemDC 是最好的(由 Kieth Rule 编写)。

void CDCUtils::SomeFunction( CDC* pDC, CRect area, ..Other params.. )

提供的 CRect 是您希望执行工作的目标区域。

该类目前的状况

class CDCUtils 
    {
    public:

    // Helper Functions and variables:
    static CBitmap  m_bmpDesktop;
    static double   DegreeToRadian( ... );
    static CDC* GetDCFromBmp( ... );
    static CDC* GetDCFromBmp( ... );
    static CDC* CreateBitmappedDC( ... );

    //   "Worker Functions"
    static void GetDesktopImage( ... );
    static void PaintRect( ... );
    static void DrawText( ... );
    static void PaintHatch( ... );
    static void Draw3DRect( ... );
    static void LinearGradient( ... );
    static void RadialGradient( ... );
    static void DrawElectricity( ... );
    static void MakeGlass( ... );
    static void PaintBitmap( ... );
    static void PaintDesktop( ... );
    static void DrawLine( ... );
    static void DrawSineWave( ... );
    static void TileBitmap( ... );
    static void BlitBitmap( ... );

    // Other
    CDCUtils();
    virtual ~CDCUtils();
    };    

PaintHatch()

static void CDCUtils::PaintHatch(CDC* pDC, CRect area, 
        COLORREF crFG, COLORREF crBG)

COLORREF crFG

网格(或影线)的颜色。

COLORREF crBG

背景颜色。


TileBitmap()

static void TileBitmap( CDC *pDC, CRect rect, UINT uResourceID );

UINT uResourceID

您 VC 项目中的 BMP 资源,其中包含要平铺的位图。


DrawText()

static void DrawText(
        CDC* pDC, 
        CPoint Location,    
        CString strText, 
        CString strFontName, 
        int nFontWidth, 
        int nFontHeight, 
        COLORREF crFontColour, 
        long FontWeight=FW_BOLD);

CString strText

将要显示的文本。

CString strFontName

您想使用的字体名称。例如“Arial”。(我希望这不会太难……)

int nFontWidth

我不想浪费时间打超过四个词来描述这个函数对于其传播功能的任何沉着运用可能有效地产生什么。

int nFontHeight

同上。

COLORREF crFontColour

我通常使用 RGB() 函数提供 RGB 信息。

long FontWeight

指定 FW_BOLDFW_NORMAL 等。


Draw3DRect()

static void Draw3DRect(    CDC* pDC, 
            CRect& area, 
            bool bDeflate=false, 
            COLORREF crFill=-1, 
            COLORREF crHilite=-1, 
            COLORREF crLoLite=-1);

bool bDeflate

对我来说,这是一个简单但有用的参数,提供 true 将导致 Crect 参数被 CSize(1,1) 缩小。这在您调用的下一个函数使用相同的目标矩形区域,但需要缩小以防止擦除先前绘制的边框时非常有用。

COLORREF crFill

用于对指定矩形进行纯色填充的 RGB 值。默认值表示不需要填充。

COLORREF crHilite

用于矩形“高光”部分的 RGB 值。默认使用 ::GetSysColor(COLOR_BTNHILIGHT)

COLORREF crLoLite

用于矩形“Lowlight”(暗部)的 RGB 值。默认使用 ::GetSysColor(COLOR_BTNSHADOW)


LinearGradient()

static void LinearGradient( CDC *pDC, 
            CRect &rect, 
            COLORREF clrFrom, 
            COLORREF clrTo, 
            BOOL bHorizontal = TRUE);

COLORREF crFrom

用于“起始”颜色的 RGB 值。

COLORREF crTo

用于“结束”颜色的 RGB 值。

BOOL bHorizontal

默认为 TRUE。指定您希望水平还是垂直展开渐变(示例使用 TRUE)。


DrawElectricity()

static void DrawElectricity( CDC *pDC, CRect rect );

我从 CodeProject 最近的一篇文章中“借鉴”了这个功能:CCreditsCtrl - 一个高级的“关于”对话框 - 作者 Marc Richarme。他为这个功能的简陋道歉,但我不会,我觉得它很酷。演示的可执行文件更好地展示了这一点,因为时间会使结果随机化,让它更……有闪电的感觉 ;)


RadialGradient()

static void RadialGradient( CDC *pDC, 
            CRect &rect, 
            COLORREF clrFrom, 
            COLORREF clrTo );

COLORREF crFrom

用于“起始”颜色的 RGB 值。

COLORREF crTo

用于“结束”颜色的 RGB 值。


DrawSineWave()

static void DrawSineWave(   CDC *pDC, 
            CRect rect, 
            double dwCycles, 
            COLORREF crPen = 0x000 );

double dwCycles

决定在提供的 rect 中绘制多少个完整的周期。

COLORREF crPen

用于绘制波形的 RGB 值。默认为黑色。


PaintDesktop()

static void PaintDesktop( CDC *pDC, 
            CWnd* pWnd, 
            CRect SourceRect, 
            CRect DestRect);

CWND* pWnd

调用窗口将提供进行绘制的 CWnd 指针(通常在 OnDraw() 函数中是'this')。

CRect SourceRect

指定您想“绘制”桌面图像的哪个部分。

CRect DestRect

指定您想在提供的 CDC* 上的哪个位置绘制桌面图像。


BlitBitmap()

static void BlitBitmap(   CDC *pDC,
            CRect rect, 
            UINT uResourceID, 
            COLORREF crMask=RGB(0,0,0), 
            double dDegreesRotation=0 );

UINT uResourceID

位于您应用程序中的位图的资源 ID。

COLORREF crMask

用于确定什么应该被设置为透明的 RGB 值。

double dDegreesRotation

允许旋转位图。超过 360 的值将被“环绕”处理。


PaintBitmap()

static void PaintBitmap(  CDC *pDC,
            CWnd* pWnd, 
            CRect rect, 
            UINT uBmpID, 
            bool bStretchToFit  = true, 
            bool bOverlay   = false );

CWND* pWnd

调用窗口将提供进行绘制的 CWnd 指针(通常在 OnDraw() 函数中是'this')。

UINT uBmpID

位于您应用程序中的位图的资源 ID。

bool bStretchToFit

决定参数所暗示的功能(无意冒犯;)。

bool bOverlay

告诉函数在执行位图传输操作时使用 SRCAND 而不是 SRCCPY


MakeGlass()

static void MakeGlass(    CDC *pDC, 
            CWnd* pWnd, 
            CRect rect, 
            UINT uBmpID );

此函数收集了 CDCUtils 类中另外两个 static 函数共有的参数,并根据需要将它们传递给这些类。该效果通过首先绘制先前制作的桌面快照的相关部分,然后使用 SRCAND 标志“覆盖”一个位图来实现。


GetDesktopImage()

static void GetDesktopImage( CBitmap* pBitmap = NULL );

CBitmap* pBitmap

指向一个将包含桌面图像的 CBitmap 的指针。如果未指定,函数假定您正在为以后使用拍摄快照,并将图像存储到其成员变量 m_bmpDesktop 中。

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.