CDC *m_pDC; // 僅聲明,未初始化!
COLORREF ColorValue = RGB(255,255,255);
CRect rect(50,50,200,200);
CBrush newBrush;
newBrush.CreateSolidBrush(ColorValue);
CBrush *oldBrush = m_pDC->SelectObject(&newBrush); // 此處崩潰/返回 NULL
m_pDC->Rectangle(rect);
m_pDC->SelectObject(oldBrush);
CDC *m_pDC; 只是一個野指針,未指向任何有效的設備上下文對象。調用 m_pDC->SelectObject 即為未定義行為(通常崩潰或返回 NULL)。
void CMyView::OnDraw(CDC* pDC) {
// pDC 由框架傳入,有效
CBrush brush(RGB(255,0,0));
CBrush* pOld = pDC->SelectObject(&brush);
pDC->Rectangle(10,10,100,100);
pDC->SelectObject(pOld);
}
// 在 WM_PAINT 或 OnPaint 中
CPaintDC dc(this); // 構造函數自動 BeginPaint
CBrush brush(RGB(0,255,0));
CBrush* pOld = dc.SelectObject(&brush);
dc.Ellipse(20,20,120,120);
dc.SelectObject(pOld); // 析構函數自動 EndPaint
CDC memDC;
memDC.CreateCompatibleDC(pDC); // pDC 為目標 DC
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC, width, height);
CBitmap* pOldBmp = memDC.SelectObject(&bmp);
// 在 memDC 上繪圖...
memDC.SelectObject(pOldBmp);
pDC->BitBlt(0,0,width,height,&memDC,0,0,SRCCOPY);
CGdiObject* pOld = pDC->SelectObject(&newObj);pDC->SelectObject(pOld);GetStockObject 返回的物件無需/不可選出。CDC *m_pDC; 未初始化是導致 SelectObject 失敗的直接原因。MFC 繪圖必須在有效的 CDC 對象上進行,來源通常是框架傳遞的 OnDraw(CDC*) 參數、CPaintDC、CClientDC 或兼容 DC。牢記 GDI 物件選入選出配對,避免資源洩漏與繪圖異常。