MFC笔记:GDI+贴图、双缓冲绘图、向屏幕上输出文字

来源:互联网 发布:卓鸿网络 编辑:程序博客网 时间:2024/06/10 08:39

CImage类是一个非常有用的类,利用它可以非常简单地实现贴图。

1)加载图片

basic_ui.Load("pic\\basic_ui.png");
可以读png实现直接的透明贴图,括号中填写绝对/相对路径即可。


2)透明化

直接读进来的png如果直接贴会花屏,需要进行一步处理:

void TransparentPNG(CImage *png){for(int i = 0; i <png->GetWidth(); i++){for(int j = 0; j <png->GetHeight(); j++){unsigned char* pucColor = reinterpret_cast<unsigned char*>(png->GetPixelAddress(i , j));pucColor[0] = pucColor[0] *pucColor[3] / 255;pucColor[1] = pucColor[1] *pucColor[3] / 255;pucColor[2] = pucColor[2] *pucColor[3] / 255;}}}
本段函数取自于七十一雾央的《C++游戏开发》,好吧不用管这是怎么实现的……总之读进来之后用它处理一下就可以了。

3)贴图

basic_ui.Draw(m_cacheDC, 0,0);green_button.Draw(m_cacheDC, GREEN_BUTTON_COD);
直接调用Draw函数即可。第一个参数是HDC,传DC句柄,第二个参数是目的坐标,可以是xy也可以是CPoint。


4)双缓冲绘图

直接在屏幕DC上绘画,会遭遇闪屏的问题,比如响应每次鼠标移动的时候就刷新画面的时候就会闪,随便做一个动画也会闪,这是因为在绘图的时候系统会用白屏填充,结果我们就会看到闪屏。如果我们用双缓冲绘图,就可以解决这个问题了。我们可以把要画的东西画在一个兼容DC上,然后系统刷新画面的时候,就会用这个DC刷新,这样我们就看不到闪屏了。

此段代码同样来自《MFC游戏教程》

先在头文件里创建需要的东西:

<span style="white-space:pre"></span>CRect m_client;<span style="white-space:pre"></span>CDC m_cacheDC;   //缓冲DC  <span style="white-space:pre"></span>CBitmap m_cacheCBitmap;//缓冲位图 

然后在OnDraw函数里:

//创建缓冲DCGetClientRect(&m_client);m_cacheDC.CreateCompatibleDC(NULL);m_cacheCBitmap.CreateCompatibleBitmap(pDC, m_client.Width(),m_client.Height());m_cacheDC.SelectObject(&m_cacheCBitmap);

先创建兼容DC,然后创建兼容Bitmap,然后选定该Bitmap即可。


之后所有的东西都画在该兼容DC上,最后的时候

pDC->BitBlt(0, 0, m_client.Width(), m_client.Height(), &m_cacheDC,0,0,SRCCOPY);  ValidateRect(m_client);m_cacheCBitmap.DeleteObject();m_cacheDC.DeleteDC();
先贴图,然后扔掉用的DC句柄即可。


4)向屏幕上输出文字

CFont font;font.CreatePointFont(120,"微软雅黑", &m_cacheDC);m_cacheDC.SelectObject(font);

这样就可以创建并选定一个字体,然后TextOut即可。

CString buffer("现在时刻:");CString now_time = pDoc->GetNowTime();buffer = buffer + now_time;m_cacheDC.TextOut(TIME_COD.x, TIME_COD.y, buffer);

这里引用的代码都来自 http://blog.csdn.net/column/details/megogame.html



0 0
原创粉丝点击