一、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/zh-tw/n/197343.html