赞
踩
Windows使用与设备无关的图形设备环境(DC:Device Context)进行显示
标记一个需要重绘的无效区域,并不意味着调用该函数后就立刻进行重绘
Windows不允许程序员直接访问硬件,它对屏幕的操作是通过环境设备(DC)来完成的。屏幕上每一个窗口都对应一个DC。
可以把DC想象成一个视频缓冲区,对这这个缓冲区的操作,会表现在这个缓冲区对应的屏幕窗口上。
在窗口的DC之外,可以建立自己的DC(不对应窗口),这个方法就是CreateCompatibleDC。这个DC就是一个内存缓冲区,通过这个DC你可以把和它兼容的窗口DC保存到这个DC中,就是说你可以通过它在不同的DC之间拷贝数据。
例如:你先在这个DC中建立好数据,然后在拷贝到窗口的DC就是完成了这个窗口的刷新。
hDeskTop = GetDesktopWindow();
hDeskTopDC = GetDC(hDeskTop);//桌面窗口DC
hMemDC = CreateCompatibleDC(hDeskTopDC);//这建立的就是与桌面窗口兼容的DC
CreateCompatibleDc函数只适用于支持光栅操作的设备,应用程序可以通过调用GetDeviceCaps
函数来确定一个设备是否支持这些操作。
当不再需要内存设备上下文环境时,可调用DeleteDc
函数删除它。
用双缓冲的话还要再定义一个位图对象吧,然后用CreateCompatibleBitmap建立一个与屏幕显示兼容的位图,再用SelectObject将位图选入到内存显示设备中。
https://blog.csdn.net/shellching/article/details/18405185
CPaintDC dc(this); // device context for painting QRect ClientRect; ::GetClientRect(this, &ClientRect); // 获取窗口客户区 HDC memDC; // 定义一个位图对象 memDC = ::CreateCompatibleDC(&dc); // 建立与屏幕显示兼容的内存显示设备 // 建立与屏幕显示兼容的内存显示设备 HBITMAP btScreen; btScreen = ::CreateCompatibleBitmap(&dc, ClientRect.Width(), ClientRect.Height()); // 将位图选入到内存显示设备中(只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上) HBITMAP* pOld_bmp = ::SelectObject(&memDC, &btScreen); //CBrush brush(RGB(255,255,255)); COLORREF cr1 = RGB(159,159,207); COLORREF cr2 = RGB(240,242,249); FillGradientRect(&memDC, &ClientRect, 0, cr1, cr2); // 外框颜色渐变
// MFC
//表示设置起点为(x1,y1),单纯的设置一个起点,并不画线
pDC->MoveTo(x1,y1);
//由设置的起点到(x2,y2)
pDc->LineTo(x2,y2);
// win
::MoveToEx(pDC, iPos, 6, NULL); // 设置起点
::LineTo(pDC, iPos,23); // 终点
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。