一、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
微信扫一扫
支付宝扫一扫