入门问题:大家看看下面这段代码为何输出的两个文本的颜色不一样????

时间:2021-08-19 23:05:31
void CTestmfcView::OnDraw(CDC* pDC)
{
CTestmfcDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

HDC dc=::CreateCompatibleDC(pDC->m_hDC);
HBITMAP bmp=::CreateCompatibleBitmap(dc,100,100);
HBITMAP oldbmp=(HBITMAP)::SelectObject(dc,bmp);

HBRUSH hBrush = (HBRUSH)GetStockObject(WHITE_BRUSH);
RECT rect={0,0,100,100};
::FillRect(dc,&rect,hBrush);
DeleteObject(hBrush);

POINT point;
HPEN pen,oldpen;
pen=::CreatePen(PS_SOLID,2,RGB(0,255,0));
oldpen=(HPEN)::SelectObject(dc,pen);
::MoveToEx(dc,10,10,&point);
::LineTo(dc,40,40);
LPTSTR k=_T("skcskjdf");
::SetTextColor(dc,RGB(0,255,0));
::TextOut(dc,10,10,k,::_tcslen(k));        //内存dc中输出
::BitBlt(pDC->m_hDC,0,0,100,100,dc,0,0,SRCCOPY);
::SelectObject(dc,oldpen);
::SelectObject(dc,oldbmp);
::DeleteObject(pen);
::DeleteDC(dc);
::SetTextColor(pDC->m_hDC,RGB(0,255,0));
::TextOut(pDC->m_hDC,150,150,k,::_tcslen(k));//正常dc中输出
// TODO: add draw code for native data here
}

11 个解决方案

#1


會不會是你刪除 dc 的原因 呢?? 

猜的。

#2


不是,大家可以把这段代码直接放到有MFC向导生成的MDI,然后覆盖OnDraw即可调试,请大家帮忙调试一下

#3



HDC dc=::CreateCompatibleDC(pDC->m_hDC);

HBITMAP bmp=::CreateCompatibleBitmap(pDC->m_hDC,500,500);
                                              ^^^^^^^^^^

#4


::SetTextColor(dc,RGB(0,255,0));
::TextOut(dc,10,10,k,::_tcslen(k));        //内存dc中输出
SetTextColor放这里就行了
::BitBlt(pDC->m_hDC,0,0,100,100,dc,0,0,SRCCOPY);
::SelectObject(dc,oldpen);

#5


同意Wargod2002的做法!
关键在于,要先写内存在读出,才能取得好的结果,
代码中事先附值,但是并未写入内存!

#6


只需将代码循序调一下就可以了
。。。
::SetTextColor(pDC->m_hDC,RGB(0,255,0));
::TextOut(pDC->m_hDC,150,150,k,::_tcslen(k));//正常dc中输出

::SetTextColor(dc,RGB(0,255,0));
::TextOut(dc,10,10,k,::_tcslen(k));        //内存dc中输出
。。。

#7


我已經試過了,你是創建位圖時出的錯。

#8


都还是不行,大家再想想

#9


rokia(rokia) 的可以
能否说明一下为何用dc就只有黑色,能否有其他方法来解决这个颜色问题呢?

#10


可能是因為你創建的位圖是基於一個尚未初始好的dc吧。

這個不是用其它方法的問題,而是因為你不小心創建失誤啊。

#11


rokia(rokia) 说的没错
HDC dc=::CreateCompatibleDC(pDC->m_hDC);
HBITMAP bmp=::CreateCompatibleBitmap(dc,100,100);
你的内存dc建好后,缺省的位图是1×1的单色位图,然后你又把自己的位图创建成和它一样,当然会有问题了。你照rokia(rokia)的方法把CreateCompatibleBitmap(dc,100,100);改成CreateCompatibleBitmap(pDC->m_hDC,100,100);应该就可以了。

#1


會不會是你刪除 dc 的原因 呢?? 

猜的。

#2


不是,大家可以把这段代码直接放到有MFC向导生成的MDI,然后覆盖OnDraw即可调试,请大家帮忙调试一下

#3



HDC dc=::CreateCompatibleDC(pDC->m_hDC);

HBITMAP bmp=::CreateCompatibleBitmap(pDC->m_hDC,500,500);
                                              ^^^^^^^^^^

#4


::SetTextColor(dc,RGB(0,255,0));
::TextOut(dc,10,10,k,::_tcslen(k));        //内存dc中输出
SetTextColor放这里就行了
::BitBlt(pDC->m_hDC,0,0,100,100,dc,0,0,SRCCOPY);
::SelectObject(dc,oldpen);

#5


同意Wargod2002的做法!
关键在于,要先写内存在读出,才能取得好的结果,
代码中事先附值,但是并未写入内存!

#6


只需将代码循序调一下就可以了
。。。
::SetTextColor(pDC->m_hDC,RGB(0,255,0));
::TextOut(pDC->m_hDC,150,150,k,::_tcslen(k));//正常dc中输出

::SetTextColor(dc,RGB(0,255,0));
::TextOut(dc,10,10,k,::_tcslen(k));        //内存dc中输出
。。。

#7


我已經試過了,你是創建位圖時出的錯。

#8


都还是不行,大家再想想

#9


rokia(rokia) 的可以
能否说明一下为何用dc就只有黑色,能否有其他方法来解决这个颜色问题呢?

#10


可能是因為你創建的位圖是基於一個尚未初始好的dc吧。

這個不是用其它方法的問題,而是因為你不小心創建失誤啊。

#11


rokia(rokia) 说的没错
HDC dc=::CreateCompatibleDC(pDC->m_hDC);
HBITMAP bmp=::CreateCompatibleBitmap(dc,100,100);
你的内存dc建好后,缺省的位图是1×1的单色位图,然后你又把自己的位图创建成和它一样,当然会有问题了。你照rokia(rokia)的方法把CreateCompatibleBitmap(dc,100,100);改成CreateCompatibleBitmap(pDC->m_hDC,100,100);应该就可以了。