详解OnDraw函数

一、OnDrawcdc

OnDraw函数是CWnd类及其派生类中的虚函数。其含义是绘制该对象的客户区。当窗口需要重新绘制时,系统会通知窗口,调用该函数。

OnDrawcdc指的是用于绘图的设备上下文,包括画笔、画刷等绘图参数。在OnDraw函数中,需要首先创建一个CDC对象,然后通过该对象进行绘制,以实现良好的图像效果。

void CMyView::OnDraw(CDC* pDC)
{
   // 绘制图像
   CDC mMemDC;
   mMemDC.CreateCompatibleDC(pDC);
   CBitmap mBitmap;
   mBitmap.CreateCompatibleBitmap(pDC, m_imageWidth, m_imageHeight);
   mMemDC.SelectObject(&mBitmap);
   // 在mMemDC中进行绘制
   pDC->BitBlt(0, 0, width, height, &mMemDC, 0, 0, SRCCOPY);
}

二、OnDrawItem

OnDrawItem是CListBox类的虚函数,其功能是重绘列表项。这个函数用于绘制一个完整的列表项,包括背景、文本和图标等,它可以自定义绘制样式,实现特殊的显示效果。

使用该函数需要先获取itemData,进而再将该自定义数据解析为需要展示的内容,如图片、文本等。在确定绘图操作之后,则可以按照自己的需求进行绘制。如果需要绘制自定义的控件,可以使用MFC提供的各种绘制函数进行实现。

void CMyListBox::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
   int index = lpDrawItemStruct->itemID;
   if (index >= 0)
   {
      CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
      CRect rect = lpDrawItemStruct->rcItem;
      UINT itemState = lpDrawItemStruct->itemState;
      
      // 在CMyListBox类中实现关于该项的其他信息获取和解析

      if (itemState & ODS_SELECTED)
      {
         // 绘制选中时背景色
         pDC->FillSolidRect(rect, RGB(0, 0, 255));
         // 绘制选中后文本颜色
         pDC->SetTextColor(RGB(255, 255, 255));
         pDC->SetBkColor(RGB(0, 0, 255));
      }
      else
      {
         // 绘制未选中时背景色和文本颜色
         pDC->FillSolidRect(rect, RGB(255, 255, 255));
         pDC->SetTextColor(RGB(0, 0, 0));
         pDC->SetBkColor(RGB(255, 255, 255));
      }

      // 绘制文本
      pDC->DrawText(m_itemData[index].m_text, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

      // 在CMyListBox类中实现其他绘制操作
   }
}

三、ondraw什么时候调用

ondraw函数会在需要重新绘制窗口时调用。下列情况会引起窗口的重新绘制:

  • 窗口大小改变
  • 窗口位置改变
  • 窗口被覆盖后再次出现时
  • 应用程序被激活时

如何使窗口恰当重新绘制以保证应用程序运行的正常?同时,在绘图过程中,要注意循环调用OnDraw所导致的性能问题,避免在OnDraw函数中重复进行大量的绘图操作,对于复杂的绘图操作应考虑使用缓存等技术进行优化。

// 在初始化窗口时添加以下代码以确保窗口正确绘制
BOOL CMyWnd::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
   BOOL bRet = CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
   if (!bRet)
   {
      return bRet;
   }

   // 窗口创建完成后手动调用OnDraw函数
   RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
   
   return bRet;
}

四、OnDrawGizmos

OnDrawGizmos是Unity3D中MonoBehaviour类的虚函数,用于在编辑器模式下绘制场景辅助信息。该函数会在编辑器界面下进行渲染,用于绘制各种辅助信息,方便开发者进行编辑器内操作。

使用该函数需要使用Unity3D提供的Gizmos API进行绘制,同时,注意该函数不仅会在编辑器内调用,在游戏运行时也会调用。因此,在绘制过程中需要注意对性能的影响,避免出现性能问题。

void OnDrawGizmos()
{
   // 绘制辅助图形
   Gizmos.color = Color.red;
   Gizmos.DrawLine(transform.position, Vector3.forward);
   Gizmos.color = Color.green;
   Gizmos.DrawCube(transform.position, Vector3.one);
}

五、OnDraw OnPaint

OnDraw和OnPaint都是用于重绘窗口的函数,但它们的调用时机和功能不同。OnDraw函数在视图类中被调用,用于处理MFC框架生成的WM_PAINT消息。而OnPaint函数则是在CEdit、CButton、CListCtrl等基本控件中被调用,用于为控件重绘背景和文本。

因为OnDraw是在视图类中被调用的,所以它充分利用了视口内容的信息。而OnPaint是在基本控件中被调用,所以它专注于绘制控件的外观和状态。

void CMyView::OnDraw(CDC* pDC)
{
   // 绘制视图内容
}

void CMyWnd::OnPaint()
{
   CPaintDC dc(this); // 用于绘制的设备上下文
   CDC mMemDC;
   mMemDC.CreateCompatibleDC(&dc);
   CBitmap mBitmap;
   mBitmap.CreateCompatibleBitmap(&dc, m_imageWidth, m_imageHeight);
   mMemDC.SelectObject(&mBitmap);
   // 在mMemDC中进行绘制
   dc.BitBlt(0, 0, width, height, &mMemDC, 0, 0, SRCCOPY);
}

六、OnDrawDescription

OnDrawDescription是在VSCode插件开发中,继承自云效的vsc-treeview-coderegion-extension中的回调函数,用于绘制代码文件中代码区域的描述。例如代码中的函数、变量、类等。

使用该函数需要通过实现NodeDescriptionProvider接口,来让插件遍历整个代码文件,并且根据代码文件中不同节点的类型,对不同的类型进行进行描述,以方便用户在浏览代码文件的时候,知道代码中各个部分的作用和意义。

export class CSharpRegionDescriptionProvider implements NodeDescriptionProvider {
    ...
    provideNodeDescriptions(node: TreeNode): TreeNodeDescription[] {
        switch (node.nodeType) {
            case "class":
                return [new TreeNodeDescription(`class ${node.name}`)];
            case "function":
                return [new TreeNodeDescription(`function ${node.name}`)];
            case "variable":
                return [new TreeNodeDescription(`${node.name}`)];
            case "enum":
                return [new TreeNodeDescription(`enum ${node.name}`)];
            ...
        }
    }
    ...
}

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/197343.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-03 13:29
下一篇 2024-12-03 13:29

相关推荐

  • Python中引入上一级目录中函数

    Python中经常需要调用其他文件夹中的模块或函数,其中一个常见的操作是引入上一级目录中的函数。在此,我们将从多个角度详细解释如何在Python中引入上一级目录的函数。 一、加入环…

    编程 2025-04-29
  • Python中capitalize函数的使用

    在Python的字符串操作中,capitalize函数常常被用到,这个函数可以使字符串中的第一个单词首字母大写,其余字母小写。在本文中,我们将从以下几个方面对capitalize函…

    编程 2025-04-29
  • Python中set函数的作用

    Python中set函数是一个有用的数据类型,可以被用于许多编程场景中。在这篇文章中,我们将学习Python中set函数的多个方面,从而深入了解这个函数在Python中的用途。 一…

    编程 2025-04-29
  • 单片机打印函数

    单片机打印是指通过串口或并口将一些数据打印到终端设备上。在单片机应用中,打印非常重要。正确的打印数据可以让我们知道单片机运行的状态,方便我们进行调试;错误的打印数据可以帮助我们快速…

    编程 2025-04-29
  • 三角函数用英语怎么说

    三角函数,即三角比函数,是指在一个锐角三角形中某一角的对边、邻边之比。在数学中,三角函数包括正弦、余弦、正切等,它们在数学、物理、工程和计算机等领域都得到了广泛的应用。 一、正弦函…

    编程 2025-04-29
  • Python3定义函数参数类型

    Python是一门动态类型语言,不需要在定义变量时显示的指定变量类型,但是Python3中提供了函数参数类型的声明功能,在函数定义时明确定义参数类型。在函数的形参后面加上冒号(:)…

    编程 2025-04-29
  • Python实现计算阶乘的函数

    本文将介绍如何使用Python定义函数fact(n),计算n的阶乘。 一、什么是阶乘 阶乘指从1乘到指定数之间所有整数的乘积。如:5! = 5 * 4 * 3 * 2 * 1 = …

    编程 2025-04-29
  • Python定义函数判断奇偶数

    本文将从多个方面详细阐述Python定义函数判断奇偶数的方法,并提供完整的代码示例。 一、初步了解Python函数 在介绍Python如何定义函数判断奇偶数之前,我们先来了解一下P…

    编程 2025-04-29
  • Python函数名称相同参数不同:多态

    Python是一门面向对象的编程语言,它强烈支持多态性 一、什么是多态多态是面向对象三大特性中的一种,它指的是:相同的函数名称可以有不同的实现方式。也就是说,不同的对象调用同名方法…

    编程 2025-04-29
  • 分段函数Python

    本文将从以下几个方面详细阐述Python中的分段函数,包括函数基本定义、调用示例、图像绘制、函数优化和应用实例。 一、函数基本定义 分段函数又称为条件函数,指一条直线段或曲线段,由…

    编程 2025-04-29

发表回复

登录后才能评论