我用VC编写一个ocx控件,实现在内存中画图时,遇到了一个问题,有请高人!
在CMyCtrl::OnPaint()中,我要使用void CBkzsCtrl::OnDraw(CDC* , const CRect&, const CRect&)的第一个参数,该如何得到呢?
我定义了两个变量
HBITMAP m_hBitmap=NULL;
HDC m_hMemDC=NULL;
然后又用向导生成并改写了OnCreate和OnPaint函数,
int CMyCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (COleControl::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
CDC dc;
dc.CreateCompatibleDC(NULL);
CBitmap bitmap;
CDC *pDC=GetDC();//问题就发生在这里,这样得到的DC不是OnDraw()中的第一个参数,就是说不是控件的可画区域,要比他大,而我就想得到和OnDraw()中对应的DC,可是又没有找到什么GetClientDC().
bitmap.CreateCompatibleBitmap(pDC,800,600);
ReleaseDC(pDC);
CBitmap *pOldBitmap=(CBitmap *) dc.SelectObject(&bitmap);
dc.PatBlt(0,0,800,600,WHITENESS);
dc.SelectObject(pOldBitmap);
m_hMemDC=dc.Detach();
m_hBitmap=(HBITMAP)bitmap.Detach();
return 0;
}
void CMyCtrl::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CRect invalidRect;
dc.GetClipBox(&invalidRect);
CBitmap *pBmp=CBitmap::FromHandle(m_hBitmap);
CDC *pdc=CDC::FromHandle(m_hMemDC);
CBitmap* pOldBitmap=(CBitmap*)pdc->SelectObject(pBmp);
pdc->PatBlt(invalidRect.left,invalidRect.top,invalidRect.Width(),invalidRect.Height(),WHITENESS);
CRgn rgn;
rgn.CreateRectRgnIndirect(&invalidRect);
pdc->SelectClipRgn(&rgn);
OnDraw(pdc,tempRect,tempRect);
dc.BitBlt(invalidRect.left,invalidRect.top,invalidRect.Width(),invalidRect.Height(),pdc,invalidRect.left,invalidRect.top,SRCCOPY);pdc->SelectObject(pOldBitmap);
// Do not call COleControl::OnPaint() for painting messages
}
然后OnDraw函数如下
void CMyCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid){
CEx01Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CBrush brush(RGB(255,0,0));
CBrush br(RGB(0,255,0));
CBrush *pOldBrush=pDC->SelectObject(&br);
pDC->Rectangle(0,0,700,600);
pDC->MoveTo(0,0);
pDC->LineTo(700,600);
pDC->SelectObject(&brush);
// pDC->Rectangle(&m_position);
pDC->SelectObject(pOldBrush);
pDC->TextOut(0,0,"Hello!");//这句根本看不见
}