⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bitmapbtn.cpp

📁 Wince 下的计算器的源代码,适合PMP下的计算器配套软件.
💻 CPP
📖 第 1 页 / 共 2 页
字号:

	CDC dcBmp;
	dcBmp.CreateCompatibleDC(GetDC());	//Creates a memory device context for the bitmap
	dcBmp.SelectObject(hBmp);			//selects the bitmap in the device context

	const DWORD RDHDR = sizeof(RGNDATAHEADER);
	const DWORD MAXBUF = 40;		// size of one block in RECTs
									// (i.e. MAXBUF*sizeof(RECT) in bytes)
	LPRECT	pRects;								
	DWORD	cBlocks = 0;			// number of allocated blocks

	INT		i, j;					// current position in mask image
	INT		first = 0;				// left position of current scan line
									// where mask was found
	bool	wasfirst = false;		// set when if mask was found in current scan line
	bool	ismask;					// set when current color is mask color

	// allocate memory for region data
	RGNDATAHEADER* pRgnData = (RGNDATAHEADER*)new BYTE[ RDHDR + ++cBlocks * MAXBUF * sizeof(RECT) ];
	memset( pRgnData, 0, RDHDR + cBlocks * MAXBUF * sizeof(RECT) );
 	pRgnData->dwSize	= RDHDR;
	pRgnData->iType		= RDH_RECTANGLES;
	pRgnData->nCount	= 0;
	for ( i = 0; i < bm.bmHeight; i++ )
	for ( j = 0; j < bm.bmWidth; j++ ){
		// get color
		ismask=(dcBmp.GetPixel(j,bm.bmHeight-i-1)!=color);
	 		if (wasfirst && ((ismask && (j==(bm.bmWidth-1)))||(ismask ^ (j<bm.bmWidth)))){
 			pRects = (LPRECT)((LPBYTE)pRgnData + RDHDR);
 			pRects[ pRgnData->nCount++ ] = CRect( first, bm.bmHeight - i - 1, j+(j==(bm.bmWidth-1)), bm.bmHeight - i );
 			if ( pRgnData->nCount >= cBlocks * MAXBUF ){
				LPBYTE pRgnDataNew = new BYTE[ RDHDR + ++cBlocks * MAXBUF * sizeof(RECT) ];
				memcpy( pRgnDataNew, pRgnData, RDHDR + (cBlocks - 1) * MAXBUF * sizeof(RECT) );
				delete pRgnData;
				pRgnData = (RGNDATAHEADER*)pRgnDataNew;
			}
			wasfirst = false;
		} else if ( !wasfirst && ismask ){		// set wasfirst when mask is found
			first = j;
			wasfirst = true;
		}
	}
	dcBmp.DeleteDC();	//release the bitmap
 	HRGN hRgn=CreateRectRgn(0, 0, 0, 0);
	ASSERT( hRgn!=NULL );
	pRects = (LPRECT)((LPBYTE)pRgnData + RDHDR);
	for(i=0;i<(int)pRgnData->nCount;i++)
	{
		HRGN hr=CreateRectRgn(pRects[i].left, pRects[i].top, pRects[i].right, pRects[i].bottom);
		VERIFY(CombineRgn(hRgn, hRgn, hr, RGN_OR)!=ERROR);
		if (hr) DeleteObject(hr);
	}
	ASSERT( hRgn!=NULL );
  

	delete pRgnData;
	return hRgn;
}
/////////////////////////////////////////////////////////////////////////////
//void CBitmapBtn::SetTColor(COLORREF new_color)
//{
// 	COLORREF tmp_color=m_TextColor;
// 	m_TextColor=new_color;
// 	return tmp_color;			//returns the previous color
//  INT A;
//  A=255;
	//m_Color=255;
//}
/////////////////////////////////////////////////////////////////////////////
void CBitmapBtn::SetToolTipText(CString s)
{
 
}
/////////////////////////////////////////////////////////////////////////////
void CBitmapBtn::RelayEvent(UINT message, WPARAM wParam, LPARAM lParam)
{
 
}

 
void CBitmapBtn::OnLButtonDblClk(UINT flags, CPoint point) 
{
    SendMessage(WM_LBUTTONDOWN, flags, MAKELPARAM(point.x, point.y));
}

 
void CBitmapBtn::OnLButtonDown(UINT nFlags, CPoint point)
{
  
	RelayEvent(WM_LBUTTONDOWN,(WPARAM)nFlags,MAKELPARAM(LOWORD(point.x),LOWORD(point.y)));
 
	CButton::OnLButtonDown(nFlags, point);
    m_button_down = true;
}

 void CBitmapBtn::OnLButtonUp(UINT nFlags, CPoint point)
{
	if (m_Style){ 
		POINT p2 = point;
		::ClientToScreen(m_hWnd, &p2);
		HWND mouse_wnd = ::WindowFromPoint(p2);
		if (mouse_wnd == m_hWnd){ // mouse is in button
			if (m_Style==BS_CHECKBOX) SetCheck(m_Checked ? 0 : 1);
			if (m_Style==BS_RADIOBUTTON) SetCheck(1);
		}
	}
 
	RelayEvent(WM_LBUTTONUP,(WPARAM)nFlags,MAKELPARAM(LOWORD(point.x),LOWORD(point.y)));

    
    m_button_down = false;
	CButton::OnLButtonUp(nFlags, point);
}

 
void CBitmapBtn::OnMouseMove(UINT nFlags, CPoint point)
{
 
	RelayEvent(WM_MOUSEMOVE,(WPARAM)nFlags,MAKELPARAM(LOWORD(point.x),LOWORD(point.y)));
 
    if ((m_button_down) && (::GetCapture() == m_hWnd)) {
	    POINT p2 = point;
        ::ClientToScreen(m_hWnd, &p2);
        HWND mouse_wnd = ::WindowFromPoint(p2);

        bool pressed = ((GetState() & BST_PUSHED) == BST_PUSHED);
        bool need_pressed = (mouse_wnd == m_hWnd);
        if (pressed != need_pressed) {
            //TRACE("* %08X Redraw\n", GetTickCount());
            SetState(need_pressed ? TRUE : FALSE);
            Invalidate();
        }
    }  
	

    //Forward this event to superclass
    CButton::OnMouseMove(nFlags, point);
}



LRESULT CBitmapBtn::OnMouseLeave(WPARAM, LPARAM)
{
    ASSERT (m_tracking);
    //TRACE("* Mouse leave\n");
    m_tracking = false;
    Invalidate();
	return 0;
}


void CBitmapBtn::OnKillFocus(CWnd *new_wnd)
{
    if (::GetCapture() == m_hWnd) {
        ::ReleaseCapture();
        ASSERT (!m_tracking);
        m_button_down = false;
    }
    CButton::OnKillFocus(new_wnd);
}


BOOL CBitmapBtn::OnClicked() 
{
    if (::GetCapture() == m_hWnd) {
        ::ReleaseCapture();
        ASSERT (!m_tracking);
    }
    m_button_down = false;
    //Invalidate();
    return FALSE;
}

LRESULT CBitmapBtn::OnRadioInfo(WPARAM wparam, LPARAM)
{
	if (m_Checked){	//only checked buttons need to be unchecked
		m_Checked = false;
		Invalidate();
	}
	return 0;
}
/////////////////////////////////////////////////////////////////////////////
void CBitmapBtn::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	if ((m_Style)&&(nChar==' ')){ //needed stuff for check & radio buttons
		if (m_Style==BS_CHECKBOX) SetCheck(m_Checked ? 0 : 1);
		if (m_Style==BS_RADIOBUTTON) SetCheck(1);
	}
	CButton::OnKeyDown(nChar, nRepCnt, nFlags);
}

LRESULT CBitmapBtn::OnBMSetCheck(WPARAM wparam, LPARAM)
{
	m_Checked=wparam!=0;
	switch (m_Style)
	{
	case BS_RADIOBUTTON:
		if (m_Checked) { //uncheck the other radio buttons (in the same group)
			HWND hthis,hwnd2,hpwnd;
			hpwnd=GetParent()->GetSafeHwnd();	//get button parent handle
			hwnd2=hthis=GetSafeHwnd();			//get this button handle
			if (hthis && hpwnd){				//consistency check
				for( ; ; ){	//scan the buttons within the group
					hwnd2=::GetNextDlgGroupItem(hpwnd,hwnd2,0);
					//until we reach again this button
					if ((hwnd2==hthis)||(hwnd2==NULL)) break;
					//post the uncheck message
					::PostMessage(hwnd2, WM_CXSHADE_RADIO, 0, 0);
				}
			}
		}
		break;
	case BS_PUSHBUTTON:
		m_Checked=false;
		ASSERT(false); // Must be a Check or Radio button to use this function
	}

	Invalidate();
	return 0;
}
/////////////////////////////////////////////////////////////////////////////
LRESULT CBitmapBtn::OnBMGetCheck(WPARAM wparam, LPARAM)
{ return m_Checked; }	//returns the state for check & radio buttons


 void LoadBitMapWH(HDC LocalHDC,long x,long y,long left,long top,long width,long height,HBITMAP hBitmap,HBITMAP hBitmap1,long big)
{
    HBITMAP	   hOldBitmap,hOldBitmap1;
//	HDC		   hScrDC;
	HDC 	hDCSrc; 
    
//	hScrDC=CreateDC(L"DISPLAY",NULL,NULL,NULL);
	hDCSrc=CreateCompatibleDC(LocalHDC);//建一内存DC 

    hOldBitmap=(HBITMAP)SelectObject(hDCSrc,hBitmap);//将位图放进内存DC中
  if(big==1)//用于按钮(缩放,不透明)
	{
		BITMAP		bmp;
		GetObject(hBitmap, sizeof(bmp), &bmp);
		 StretchBlt(LocalHDC,x,y,width,height,hDCSrc,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
	}
	else if(big==0)//用于标签(不缩放)
	{
		BitBlt(LocalHDC,x,y,width,height,hDCSrc,left,top,SRCCOPY);
	}
	else if(big==2) //用于图片(缩放,透明)
	{ 
		BITMAP		bmp;
		GetObject(hBitmap, sizeof(bmp), &bmp);
		HDC 	hDCSrc1; 
		hDCSrc1=CreateCompatibleDC(LocalHDC);//建一内存DC 
		//背景
		hOldBitmap1=(HBITMAP)SelectObject(hDCSrc1,hBitmap1);//将位图放进内存DC中
		BitBlt(LocalHDC,0,0,width,height,hDCSrc1,left,top,SRCCOPY);
		

		TransparentImage(LocalHDC,0,0,width,height,hDCSrc,0,0,bmp.bmWidth,bmp.bmHeight,RGB(255,0,255));
		SelectObject(hDCSrc1,hOldBitmap1);
		DeleteDC(hDCSrc1);
	}
	SelectObject(hDCSrc,hOldBitmap);
	DeleteObject(hOldBitmap);
	DeleteDC(hDCSrc);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -