⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fg_win32drawinterface.cpp

📁 《道法自然》书的源码FishGUI,一个跨平台的界面库
💻 CPP
字号:
/*--------------------------------------------------------------------------

	FG_Win32DrawInterface.cpp - Win32的绘图接口类的实现文件

	本程序是FishGUI软件的一部分

	版权所有 (C) 2003,2004 王咏武
	http://www.contextfree.net/wangyw/

----------------------------------------------------------------------------

	作者对 FishGUI 软件及其所有源代码授权如下:

	允许任何个人、组织、机构、企业无偿获得、修改、使用、重新发布 FishGUI 软
	件及其源代码,或按照有偿或者无偿的方式发行基于 FishGUI 源代码的全部或部
	分内容开发的软件产品,——但行使以上权利时,须遵守以下约定:

	1、重新发布 FishGUI 软件及其源代码时,不得隐去软件及其源代码中原有的版
	   权信息和开发者标识。

	2、发行基于 FishGUI 源代码的全部或部分内容开发的软件产品时,必须在产品
	   的显著位置标明以下字样:

	   【本产品的一部分功能是基于王咏武在 FishGUI 软件中的工作完成的】

	3、在正式出版物中引用 FishGUI 的文档、源代码或注释内容的,应注明软件的
	   原作者为王咏武。

--------------------------------------------------------------------------*/
/*! \addtogroup OSAdaptor
 *  @{ 
 */

/*! \file
 *  \brief Win32的绘图接口类的实现文件
 */

/*! @} */

#include "stdio.h"
#include "windows.h"
#include "FG_Win32DrawInterface.h"

#if defined(WIN32) && defined(_DEBUG)
    /* Trace memory allocation in windows debug version */
    #include <crtdbg.h>
    static char THIS_FILE[] = __FILE__;
    #define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif  /* _DEBUG */
    
//##ModelId=3F71AB2E0279
FG_Win32DrawInterface::~FG_Win32DrawInterface()
{
    // 删除绘图资源
    DeleteDC(m_hMemDC);
    DeleteObject(m_hBitmap);
    DeleteObject(m_hFont);
}
    
//##ModelId=3F4EDED00326
void FG_Win32DrawInterface::BeginDraw(const FG_Rect & rect)
{
    if (! m_iDrawCount)
    {
        if (! m_hMemDC)
        {
            // 创建绘图缓冲区
            m_hMemDC = CreateCompatibleDC(m_hDC);
            m_hBitmap = CreateCompatibleBitmap(m_hDC, SCREEN_WIDTH, SCREEN_HEIGHT);
            SelectObject(m_hMemDC, m_hBitmap);
    
            m_hFont = CreateFont(15, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, 
                                 OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, 
                                 DEFAULT_QUALITY, DEFAULT_PITCH, "宋体");
            SelectObject(m_hMemDC, m_hFont);
        }

        // 初始无效区
        m_Invalid = rect;
    }
    else
    {
        // 组合无效区
        m_Invalid |= rect;
    }
    m_iDrawCount ++;
}

//##ModelId=3F4EDED003A8
void FG_Win32DrawInterface::EndDraw()
{
    m_iDrawCount --;
    if (! m_iDrawCount)
    {
        // 把缓冲区内容刷新到屏幕上
        BitBlt(m_hDC, m_Invalid.wLeft, m_Invalid.wTop, m_Invalid.Width(), m_Invalid.Height(), m_hMemDC, 
            m_Invalid.wLeft, m_Invalid.wTop, SRCCOPY);
    }
}

//##ModelId=3F4EDED003E4
void FG_Win32DrawInterface::FillRect(const FG_Rect & rect, const COLORVAL ForeColor, const COLORVAL background)
{
    if (m_hMemDC)
    {
        // 创建绘图所用资源
        HPEN hPen = CreatePen(PS_SOLID, 1, ForeColor);
        HBRUSH hBrush = CreateSolidBrush(background);

        HPEN hPenOld = (HPEN)SelectObject(m_hMemDC, hPen);
        HBRUSH hBrushOld = (HBRUSH)SelectObject(m_hMemDC, hBrush);

        Rectangle(m_hMemDC, rect.wLeft, rect.wTop, rect.wRight + 1, rect.wBottom + 1);

        // 删除绘图资源
        SelectObject(m_hMemDC, hPenOld);
        DeleteObject(hPen);
        SelectObject(m_hMemDC, hBrushOld);
        DeleteObject(hBrush);
    }
}

//##ModelId=3F4EDED10133
void FG_Win32DrawInterface::Line(const short x1, const short y1, const short x2, const short y2, const COLORVAL color)
{
    if (m_hMemDC)
    {
        // 创建绘图所用资源
        HPEN hPen = CreatePen(PS_SOLID, 1, color);

        HPEN hPenOld = (HPEN)SelectObject(m_hMemDC, hPen);

        MoveToEx(m_hMemDC, x1, y1, NULL);
        LineTo(m_hMemDC, x2, y2);
        // Win32的画线函数不画最后一点,和FishGUI的定义不同
		// 这里需要加画最后一点
        SetPixel(m_hMemDC, x2, y2, color);

        // 删除绘图资源
        SelectObject(m_hMemDC, hPenOld);
        DeleteObject(hPen);
    }
}

//##ModelId=3F4EDED1031E
void FG_Win32DrawInterface::DrawText(const char * Text, const short x, const short y, const COLORVAL color)
{
    if (m_hMemDC)
    {
        SetTextColor(m_hMemDC, color);
        SetBkMode(m_hMemDC, TRANSPARENT);
        TextOut(m_hMemDC, x, y, Text, strlen(Text));
    }
}

//##ModelId=3F4EDED200DA
WORD FG_Win32DrawInterface::GetTextWidth(const char * Text)
{
    if (m_hMemDC)
    {
        SIZE size;
        GetTextExtentPoint(m_hMemDC, Text, strlen(Text), & size);
        return (WORD)size.cx;
    }
    else
        return 0;
}

//##ModelId=3F4EDED20184
WORD FG_Win32DrawInterface::GetTextHeight(const char * Text)
{
    if (m_hMemDC)
    {
        SIZE size;
        GetTextExtentPoint(m_hMemDC, Text, strlen(Text), & size);
        return (WORD)size.cy;
    }
    else
        return 0;
}

//##ModelId=3F4EDED20239
void FG_Win32DrawInterface::DrawBitmap(const char * pBmpName, const short x1, const short y1)
{
    if (m_hMemDC)
    {
        HBITMAP hBitmap1 = (HBITMAP)LoadImage(NULL, pBmpName, IMAGE_BITMAP, 0, 0,
                                    LR_DEFAULTSIZE | LR_LOADFROMFILE);
        if (hBitmap1)
        {
            BITMAP info;
            GetObject(hBitmap1, sizeof(BITMAP), & info);

            HDC hMemDC1 = CreateCompatibleDC(m_hDC);
            SelectObject(hMemDC1, hBitmap1);
            BitBlt(m_hMemDC, x1, y1, x1 + info.bmWidth - 1, y1 + info.bmHeight - 1, hMemDC1, 0, 0, SRCCOPY);
            DeleteDC(hMemDC1);
            DeleteObject(hBitmap1);
        }
    }
}

//##ModelId=3F6193B201F2
void FG_Win32DrawInterface::DrawPolyLine(const short n, const FG_Point * vert, const COLORVAL color)
{
    if (m_hMemDC)
    {
        // 创建绘图所用资源
        HPEN hPen = CreatePen(PS_SOLID, 1, color);

        HPEN hPenOld = (HPEN)SelectObject(m_hMemDC, hPen);

        POINT * lppt = new POINT[n];
        for (short i = 0; i < n; i ++)
        {
            lppt[i].x = vert[i].x;
            lppt[i].y = vert[i].y;
        }

        Polyline(m_hMemDC, lppt, n);
        SetPixel(m_hMemDC, lppt[n - 1].x, lppt[n - 1].y, color);

        delete [] lppt;

        // 删除绘图资源
        SelectObject(m_hMemDC, hPenOld);
        DeleteObject(hPen);
    }
}

//##ModelId=3F6EAC820075
void FG_Win32DrawInterface::DrawDotRect(const FG_Rect & rect, const COLORVAL color)
{
    if (m_hMemDC)
    {
        // 创建绘图所用资源
        HPEN hPen = CreatePen(PS_DOT, 1, color);

        HPEN hPenOld = (HPEN)SelectObject(m_hMemDC, hPen);
        HBRUSH hBrushOld = (HBRUSH)SelectObject(m_hMemDC, GetStockObject(NULL_BRUSH));

        Rectangle(m_hMemDC, rect.wLeft, rect.wTop, rect.wRight + 1, rect.wBottom + 1);

        // 删除绘图资源
        SelectObject(m_hMemDC, hPenOld);
        DeleteObject(hPen);
        SelectObject(m_hMemDC, hBrushOld);
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -