15,979
社区成员
发帖
与我相关
我的任务
分享
OnEraseBkgnd(CDC* pDC)
{
CDC MemoryDC;
HINSTANCE hInstResource = NULL;
hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(IDB_BITMAP_LED_C),RT_BITMAP);
m_hBitmap = (HBITMAP)::LoadImage(hInstResource,MAKEINTRESOURCE(IDB_BITMAP_LED_C),IMAGE_BITMAP,0,0,0);
MemoryDC.CreateCompatibleDC(pDC);
MemoryDC.SelectObject(m_hBitmap);
pDC->StretchBlt(0,0,LED_C_WIDTH,LED_C_HEIGHT,&MemoryDC,0,m_nScrollCur,LED_C_WIDTH,LED_C_HEIGHT,SRCCOPY);
return TRUE;
}
OnPaint()
{
CPaintDC dc(this);
CDC MemoryDC;
HINSTANCE hInstResource = NULL;
hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(IDB_BITMAP_LED_C),RT_BITMAP);
m_hBitmap = (HBITMAP)::LoadImage(hInstResource,MAKEINTRESOURCE(IDB_BITMAP_LED_C),IMAGE_BITMAP,0,0,0);
MemoryDC.CreateCompatibleDC(&dc);
MemoryDC.SelectObject(m_hBitmap);
dc.StretchBlt(0,0,LED_C_WIDTH,LED_C_HEIGHT,&MemoryDC,0,m_nScrollCur,LED_C_WIDTH,LED_C_HEIGHT,SRCCOPY);
}
void CPngButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if(m_pImage == NULL) return;
//
int iButtonIndex = 0;
if(lpDrawItemStruct->itemState & ODS_SELECTED)
{// select blue
iButtonIndex=2;
}
else if (lpDrawItemStruct->itemState & ODS_FOCUS)
{// focus green
iButtonIndex=1;
}
else if (lpDrawItemStruct->itemState & ODS_DISABLED)
{// disable yellow
iButtonIndex=3;
}
else
{// normal red
iButtonIndex=0;
}
//
if((m_hover) && (iButtonIndex!=2))
{// hover // white
iButtonIndex=4;
}
CDC* pDC = CDC::FromHandle(lpDrawItemStruct -> hDC);
CRect rect = lpDrawItemStruct->rcItem;
// gdi
// m_brPattern from dlg.
// see "void SetPatBrush(CBrush *pbr){m_brPattern=pbr;}"
CRect rc;
GetClientRect(rc);
MapWindowPoints(GetParent(),rc);
//
int off=GetParent()->GetScrollPos(SB_VERT);
pDC->SetBrushOrg(-rc.left,-rc.top-off);// minus !
rc.OffsetRect(-rc.left,-rc.top);
pDC->FillRect(&rc,m_brPattern);
// draw png
Graphics g(pDC->m_hDC);
g.DrawImage(m_pImage,Rect(0,0,m_nWidth,m_nSliceHeight),m_nWidth*iButtonIndex,
0,m_nWidth, m_nSliceHeight,UnitPixel);
}
//
void AbstractPaint::OnPaint(CDC &dc)
{
UINT id=GetDlgCtrlID(m_pWnd->m_hWnd);
if(!m_bInited)
{// only ownce !
#if 0 // Use WS_EX_TRANSPARENT ; bug when scroll
// Because,during the button comes to be visible a bit by a bit(By SB_THUMBTRACK),
// the Bk of the Button, needs to be changed, till the buton is full visible .
// However variable m_bInited limits this happens.Also that is why "SendMessage(WM_VSCROLL,MAKELONG(SB_LINEDOWN,0),0);
// in Timer(make button3 full visible, can work around the problem.
m_pWnd->GetClientRect(&m_canvasRect);
/* 初始化缓存 */
m_canvasDC.CreateCompatibleDC(&dc);
m_canvasBitmap.CreateCompatibleBitmap(&dc, m_canvasRect.Width(), m_canvasRect.Height());
m_canvasDC.SelectObject(&m_canvasBitmap);
m_canvasDC.BitBlt(0, 0, m_canvasRect.Width(),m_canvasRect.Height(),
&dc,m_canvasRect.left,m_canvasRect.top, SRCCOPY);
#else // not need WS_EX_TRANSPARENT
CRect ClientRC,WindowRC;
CDC MemDC;
CBitmap Bmp;
Bmp.LoadBitmap(IDB_BITMAP_CHILD);//子对话框背景图
MemDC.CreateCompatibleDC(&dc);
MemDC.SelectObject(Bmp);
m_pWnd->GetClientRect(ClientRC);//按钮相对位置
GetWindowRect(m_pWnd->m_hWnd,WindowRC);
m_pWnd->GetParent()->ScreenToClient(WindowRC);
m_canvasDC.CreateCompatibleDC(&MemDC); //子对话框大小的背景图
m_canvasBitmap.CreateCompatibleBitmap(&MemDC, ClientRC.Width(), ClientRC.Height());
m_canvasDC.SelectObject(&m_canvasBitmap);
// think of scroll bar !
int off=m_pWnd->GetParent()->GetScrollPos(SB_VERT);
m_canvasDC.BitBlt(0,0,ClientRC.Width(), ClientRC.Height(),
&MemDC, WindowRC.left, WindowRC.top+off, SRCCOPY);
Bmp.DeleteObject();
#endif
if(id==1002)
{
#if 0
OpenClipboard(0);
EmptyClipboard();
SetClipboardData(CF_BITMAP,m_canvasBitmap);
CloseClipboard();
afxDump << id << "\n";
#endif
}
m_pgraph = new Graphics(m_canvasDC.m_hDC);
m_pgraph->SetSmoothingMode(SmoothingModeAntiAlias);
m_pgraph->SetInterpolationMode(InterpolationModeHighQualityBicubic);
/* 初始化擦除板 */
m_erraseDC.CreateCompatibleDC(&m_canvasDC);
m_erraseBitmap.CreateCompatibleBitmap(&m_canvasDC,
m_canvasRect.Width(), m_canvasRect.Height());
m_erraseDC.SelectObject(&m_erraseBitmap);
//
OnInitDc(m_canvasDC, m_pgraph);
m_erraseDC.BitBlt(0, 0,
m_canvasRect.Width(),
m_canvasRect.Height(),
&m_canvasDC,
m_canvasRect.left,
m_canvasRect.top, SRCCOPY);
m_bInited = TRUE;
}
Repaint(dc);
}
void CScrollDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
#define STEP 40
int nDelta = 0;
switch (nSBCode)
{
case SB_LINEUP:
if(m_nScrollPos>0) nDelta=-STEP;
else nDelta=0;
break;
case SB_LINEDOWN:
if(m_nScrollPos<200) nDelta=STEP;
else nDelta=0;
break;
case SB_THUMBTRACK:
case SB_THUMBPOSITION:
nDelta = (int)nPos - m_nScrollPos;
break;
}
if (nDelta != 0)
{
m_nScrollPos += nDelta;
ScrollWindow(0,-nDelta);
SetScrollPos(SB_VERT,m_nScrollPos,TRUE);
}
CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}
void CScrollBitmapDlg::OnVScroll(UINT nSBCode,UINT nPos,CScrollBar *pScrollBar)
{// TODO: Add your message handler code here and/or call default
// for focus not jumpping
GetDlgItem(IDOK)->SetFocus();
// scrolling
switch (nSBCode)
{
case SB_LINEUP:
case SB_PAGEUP:
if(m_Sourcey >=10) m_Sourcey -= 10;
else m_Sourcey = 0;
break;
case SB_LINEDOWN:
case SB_PAGEDOWN:
if((m_Sourcey+m_rcPicture.Height()+10)<m_bmInfo.bmHeight)
m_Sourcey += 10;
else
m_Sourcey = m_bmInfo.bmHeight -m_rcPicture.Height();
break;
case SB_TOP:
m_Sourcey = 0;
break;
case SB_BOTTOM:
m_Sourcey = INT_MAX;
break;
case SB_THUMBTRACK:
m_Sourcey = nPos;
break;
default:
// afxDump << nSBCode << "=SB_ENDSCROLL\n";
break;
}
m_vBar.SetScrollPos(m_Sourcey);
InvalidateRect(&m_rcPicture,FALSE);
// CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}