一、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