MFC_9.25_闪屏及右端固定
全局变量
CDC* pDC;
CRect rect;
CDC MemDC; //首先定义一个显示设备对象
CBitmap MemBitmap;//定义一个位图对象
BITMAP bm;
int m_Wheel=100;
int px,py,pxf,pxy = 0;
int ScreenHeight,ScreenWidth;
int WNumber = 50;
int WNS = 30; //下张图和上张图开始的位置;
OnMouseWheel()
BOOL CKlineMiddleView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
// TODO: 在此添加消息处理程序代码和/或调用默认
m_Wheel -= zDelta* 0.01;
if(m_Wheel >= 150) m_Wheel= 150; //方块数量多
else if(m_Wheel <=65) m_Wheel=65; //数量少
else
{
WNumber = 50 + m_Wheel - 100 ;
this -> KlineDraw ();
}
return CView::OnMouseWheel(nFlags, zDelta, pt);
}
KlineDraw()
void CKlineMiddleView::KlineDraw()
{
pDC = GetWindowDC();
pDC->GetClipBox(&rect);
GetClientRect(&rect);
pDC->FillSolidRect(rect, RGB(0,0,0)); //设背景为黑色
ScreenHeight = rect.Height();
ScreenWidth = rect.Width();
CClientDoc* pDoc = (CClientDoc*)GetDocument(); //载入数据的结构体
//建立一个与屏幕显示兼容的位图
MemBitmap.DeleteObject();
MemDC.DeleteDC(); //清除上一次位图
MemDC.CreateCompatibleDC(NULL);
MemBitmap.CreateCompatibleBitmap(pDC,ScreenWidth,ScreenHeight);
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
MemDC.FillSolidRect(0,0,ScreenWidth,ScreenHeight,RGB(0,0,0));
WNS = 100 - WNumber;
if( WNS < 0)
WNS = 0 ;
float KWidth = (float)(ScreenWidth - 30)/WNumber;
int CLine = ScreenHeight * 3/4; //隐形基准轴
for(int i = WNS ; i < 100 ; i++)
{
int maxOC = max(pDoc->m_DataKLine[i].KOpenPrice,pDoc->m_DataKLine[i].KClosePrice);
int minOC = min(pDoc->m_DataKLine[i].KOpenPrice,pDoc->m_DataKLine[i].KClosePrice);
int mainHigh = maxOC - minOC;
int lineHigh = pDoc->m_DataKLine[i].KHighestPrice - pDoc->m_DataKLine[i].KLowestPrice;
int xleftTop = KWidth*(i-WNS);
int yleftTop = CLine - maxOC * ScreenHeight/1000;
int xWidth = KWidth * 0.9;
int yHeight = mainHigh * ScreenHeight/1000;
if(pDoc->m_DataKLine[i].KOpenPrice > pDoc->m_DataKLine[i].KClosePrice)
{
MemDC.FillSolidRect(xleftTop,yleftTop,xWidth,yHeight,RGB(39,176,216));
CPen PenBlue(PS_SOLID,1,RGB(39,176,216));
CPen *oldPenx = MemDC.SelectObject(&PenBlue);
MemDC.MoveTo( xleftTop + xWidth/2 , CLine - pDoc->m_DataKLine[i].KHighestPrice*ScreenHeight/1000);
MemDC.LineTo( xleftTop + xWidth/2 , CLine - pDoc->m_DataKLine[i].KLowestPrice*ScreenHeight/1000);
}
else if(pDoc->m_DataKLine[i].KOpenPrice < pDoc->m_DataKLine[i].KClosePrice)
{
CBrush br;
CPen pen;
pen.CreatePen(PS_SOLID,1,RGB(255,74,102));
br.CreateStockObject(NULL_BRUSH);
MemDC.SelectObject(&pen);
MemDC.SelectObject(&br);
MemDC.Rectangle(xleftTop,yleftTop,xleftTop+xWidth,yleftTop+yHeight);
CPen PenRed(PS_SOLID,1,RGB(255,74,102));
CPen *oldPenx = MemDC.SelectObject(&PenRed);
MemDC.MoveTo( xleftTop + xWidth/2 , CLine - pDoc->m_DataKLine[i].KHighestPrice*ScreenHeight/1000);
MemDC.LineTo( xleftTop + xWidth/2 , yleftTop);
MemDC.MoveTo( xleftTop + xWidth/2 , yleftTop+yHeight);
MemDC.LineTo( xleftTop + xWidth/2 , CLine - pDoc->m_DataKLine[i].KLowestPrice*ScreenHeight/1000);
}
else
{
int yleftTop = CLine - pDoc->m_DataKLine[i].KOpenPrice*ScreenHeight/1000;
int yHeight = 1;
MemDC.FillSolidRect(xleftTop,yleftTop,xWidth,yHeight,RGB(255,255,255));
CPen PenWhite(PS_SOLID,1,RGB(255,255,255));
CPen *oldPenx = MemDC.SelectObject(&PenWhite);
MemDC.MoveTo( xleftTop + xWidth/2 , CLine - pDoc->m_DataKLine[i].KHighestPrice*ScreenHeight/1000);
MemDC.LineTo( xleftTop + xWidth/2 , CLine - pDoc->m_DataKLine[i].KLowestPrice*ScreenHeight/1000);
}
}
pDC->BitBlt(0,0,ScreenWidth,ScreenHeight,&MemDC,0,0,SRCCOPY);
pDC->BitBlt(0,0,ScreenWidth,ScreenHeight,&MemDC,0,0,SRCCOPY);
pDC->BitBlt(0,0,ScreenWidth,ScreenHeight,&MemDC,0,0,SRCCOPY);
pDC->BitBlt(0,0,ScreenWidth,ScreenHeight,&MemDC,0,0,SRCCOPY);
pDC->BitBlt(0,0,ScreenWidth,ScreenHeight,&MemDC,0,0,SRCCOPY);
//画五遍比画一遍闪屏问题可以缓解点
}