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

📄 custombutton.cpp

📁 Wifi扫描器和自定义MFC控件 Wifi scanner + custom MFC controls 在WINCE环境下工作。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			pDC->MoveTo(pRect->left+2, pRect->bottom-2);
			pDC->LineTo(pRect->right-2, pRect->bottom-2);
			pDC->MoveTo(pRect->right-2, pRect->bottom-3);
			pDC->LineTo(pRect->right-2, pRect->top+1);
			//
			pDC->SelectObject(pOldPen);
		}//if not pressed
	}//if hgradient
	else
	{
		//draw pressed non-gradient button
		if(m_bPressed == true)
		{
			CPen penLighter(PS_SOLID, 0, OffsetColor(m_crBkgPressed, -0.3));
			CPen penLight(PS_SOLID, 0, OffsetColor(m_crBkgPressed, -0.2));
			CPen penDark(PS_SOLID, 0, OffsetColor(m_crBkgPressed, 0.2));
			CPen penDarker(PS_SOLID, 0, OffsetColor(m_crBkgPressed, 0.3));
			//top-left border
			//darker line
			CPen* pOldPen = pDC->SelectObject(&penDarker);

			pDC->MoveTo(pRect->left, pRect->bottom-1);
			pDC->LineTo(pRect->left, pRect->top);
			pDC->LineTo(pRect->right, pRect->top);
			//dark
			pDC->SelectObject(penDark);
			pDC->MoveTo(pRect->left+1, pRect->bottom-1);
			pDC->LineTo(pRect->left+1, pRect->top+1);
			pDC->LineTo(pRect->right, pRect->top+1);
			//bottom-right border
			//lighter line
			pDC->SelectObject(penLighter);
			pDC->MoveTo(pRect->left, pRect->bottom-1);
			pDC->LineTo(pRect->right-1, pRect->bottom-1);
			pDC->LineTo(pRect->right-1, pRect->top-1);			
			//light line
			pDC->SelectObject(penLight);
			pDC->MoveTo(pRect->left+1, pRect->bottom-2);
			pDC->LineTo(pRect->right-2, pRect->bottom-2);
			pDC->LineTo(pRect->right-2, pRect->top);
			//
			pDC->SelectObject(pOldPen);
		}
		else
		//draw not pressed button
		{
			CPen penLighter(PS_SOLID, 0, OffsetColor(m_crBkgIdle, -0.3));
			CPen penLight(PS_SOLID, 0, OffsetColor(m_crBkgIdle, -0.2));
			CPen penDark(PS_SOLID, 0, OffsetColor(m_crBkgIdle, 0.2));
			CPen penDarker(PS_SOLID, 0, OffsetColor(m_crBkgIdle, 0.3));
			//top-left border
			//lighter line
			CPen* pOldPen = pDC->SelectObject(&penLighter);
			pDC->MoveTo(pRect->left, pRect->bottom-1);
			pDC->LineTo(pRect->left, pRect->top);
			pDC->LineTo(pRect->right, pRect->top);
			//light
			pDC->SelectObject(penLight);
			pDC->MoveTo(pRect->left+1, pRect->bottom-1);
			pDC->LineTo(pRect->left+1, pRect->top+1);
			pDC->LineTo(pRect->right, pRect->top+1);
			//bottom-right border
			//darker line
			pDC->SelectObject(penDarker);
			pDC->MoveTo(pRect->left, pRect->bottom-1);
			pDC->LineTo(pRect->right-1, pRect->bottom-1);
			pDC->LineTo(pRect->right-1, pRect->top-1);			
			//dark line
			pDC->SelectObject(penDark);
			pDC->MoveTo(pRect->left+1, pRect->bottom-2);
			pDC->LineTo(pRect->right-2, pRect->bottom-2);
			pDC->LineTo(pRect->right-2, pRect->top);
			//
			pDC->SelectObject(pOldPen);
		}//if not pressed
	}//if not gradient
}

//////////////////////////////////////////////////////////////////////////
//initialization
/*
LRESULT CCustomButton::OnSetControlData(WPARAM wParam, LPARAM lParam)
{
CustomControlData *pccdControlData;
LONG lStyle;
DWProp dwp;
StrProp strp;
CRect rc;
DWORD dwTemp;

	if(lParam == NULL)
	{
		return 0;
	}
	GetClientRect(&rc);
	pccdControlData=(CustomControlData *)lParam;

	//store type
	m_ctType=pccdControlData->ctType;
	m_cfFlags=pccdControlData->cfFlags;

	//init font, if specified
	dwTemp=pccdControlData->dwFontID;
	if(dwTemp != 0)
	{
		m_hCustomFont=g_SkinManager.GetFontHandle(dwTemp);
	}

	if(pccdControlData->ctType == CustomControlData::ctCustomGroup)
	{
		m_bIsGroup=true;
		//groupbox specific params
		if(TRUE == pccdControlData->dpmDWProps.Lookup(cdpFrameColor, dwp))
		{
			m_crFrame=dwp.dwValue;
		}
	}
	else
	{
		m_bIsGroup=false;
	}

	//is flat button?
	lStyle=GetWindowLong(GetSafeHwnd(), GWL_STYLE);
	if(lStyle & BS_FLAT)
	{
		m_bFlat=true;
	}
	else
	{
		m_bFlat=false;
	}

	//gradient colors?
	if(m_cfFlags & bfHGradient)
	{
		m_bHGradient=true;
	}

	//init captions
	if(TRUE == pccdControlData->spmStrProps.Lookup(cspCaption, strp))
	{
		m_strCaption=m_strActiveCaption=strp.strValue;
		if(TRUE == pccdControlData->spmStrProps.Lookup(cspActiveCaption, strp))
		{
			m_strActiveCaption=strp.strValue;
		}	
	}
	
	//init text colors
	if(TRUE == pccdControlData->dpmDWProps.Lookup(cdpBkgIdleColor, dwp))
	{
		m_crBkgIdle=dwp.dwValue;
	}

	if(TRUE == pccdControlData->dpmDWProps.Lookup(cdpBkgActiveColor, dwp))
	{
		m_crBkgPressed=dwp.dwValue;
	}

	if(TRUE == pccdControlData->dpmDWProps.Lookup(cdpTxtIdleColor, dwp))
	{
		m_crTxtIdle=dwp.dwValue;
	}

	if(TRUE == pccdControlData->dpmDWProps.Lookup(cdpTxtActiveColor, dwp))
	{
		m_crTxtPressed=dwp.dwValue;
	}

	//init gradient colors
	if(m_bHGradient == true)
	{
		if(TRUE == pccdControlData->dpmDWProps.Lookup(cdpHGradientStart, dwp))
		{
			m_crHGStart=dwp.dwValue;
		}
		if(TRUE == pccdControlData->dpmDWProps.Lookup(cdpHGradientEnd, dwp))
		{
			m_crHGEnd=dwp.dwValue;
		}
	}

	//icon dimensions, if specified
	if(lStyle & BS_ICON)
	{
		if(TRUE == pccdControlData->dpmDWProps.Lookup(cdpImgW, dwp))
		{
			m_dwBmpW=dwp.dwValue;
		}
		if(TRUE == pccdControlData->dpmDWProps.Lookup(cdpImgH, dwp))
		{
			m_dwBmpH=dwp.dwValue;
		}
	}
	
	//load bitmaps/icons from file or resource	
	//if has BS_ICON style, load icon from resource
	if(lStyle & BS_ICON)
	{
		if(TRUE == pccdControlData->dpmDWProps.Lookup(cdpBkgResource, dwp))
		{
			m_hBmpInactive=g_SkinManager.LoadIconResource(dwp.dwValue, m_dwBmpW, m_dwBmpH);
			//load same resource for "active"
			m_hBmpActive=g_SkinManager.LoadIconResource(dwp.dwValue, m_dwBmpW, m_dwBmpH);
			if(TRUE == pccdControlData->dpmDWProps.Lookup(cdpBkgActiveResource, dwp))
			{
				//free previously loaded "active"
				g_SkinManager.FreeResource(m_hBmpActive);
				//and reload
				m_hBmpActive=g_SkinManager.LoadIconResource(dwp.dwValue, m_dwBmpW, m_dwBmpH);
			}
		}
	}//icon
	else
	//if has BS_BITMAP style, load bitmap from resource, or if resource zero, load from file
	if(lStyle & BS_BITMAP)
	{
		//is the bitmap a resource?
		if(TRUE == pccdControlData->dpmDWProps.Lookup(cdpBkgResource, dwp))
		{
			//load from resource
			m_hBmpInactive=g_SkinManager.LoadBMPResource(dwp.dwValue);
			//load same for "active"
			m_hBmpActive=g_SkinManager.LoadBMPResource(dwp.dwValue);
			if(TRUE == pccdControlData->dpmDWProps.Lookup(cdpBkgActiveResource, dwp))
			{
				//free previously loaded "active"
				g_SkinManager.FreeResource(m_hBmpActive);
				//and reload
				m_hBmpActive=g_SkinManager.LoadBMPResource(dwp.dwValue);
			}
		}
		else
		{
			//no, its a file!
			//load from file
			if(TRUE == pccdControlData->spmStrProps.Lookup(cspBkgFile, strp))
			{
				m_hBmpInactive=g_SkinManager.LoadBitmapFile(g_SkinManager.GetSkinPath() + strp.strValue);
				//load same for "active"
				m_hBmpActive=g_SkinManager.LoadBitmapFile(g_SkinManager.GetSkinPath() + strp.strValue);
				if(TRUE == pccdControlData->spmStrProps.Lookup(cspBkgActiveFile, strp))
				{
					//free previously loaded "active"
					g_SkinManager.FreeResource(m_hBmpActive);
					//and reload
					m_hBmpActive=g_SkinManager.LoadBitmapFile(g_SkinManager.GetSkinPath() + strp.strValue);
				}
			}
		}
		//get BMP dimensions
		g_SkinManager.GetBitmapDimensions(m_hBmpActive, &m_dwBmpW, &m_dwBmpH);
	}//bitmap

	//at this stage we do have a HWND and a DC
	CDC *pDC;

	pDC=GetDC();
	if(pDC != NULL)
	{
		m_DrawDC.CreateCompatibleDC(pDC);
		m_DrawBitmap.CreateCompatibleBitmap(pDC, rc.Width(), rc.Height());
		m_hOldDCBmp=m_DrawDC.SelectObject(m_DrawBitmap.GetSafeHandle());
		ReleaseDC(pDC);
	}
#ifdef _DEBUG
	else
	{
		OutputDebugString(_T("Custom_button failed to get DC."));
	}
#endif
	return 0;
}
*/

//////////////////////////////////////////////////////////////////////////
//Get DrawText flags parameter from button BS_XXX styles
DWORD CCustomButton::GetDTFlag(DWORD dwStyle)
{
DWORD dtStyle;

	dtStyle=0;

	if(!(dwStyle & BS_MULTILINE))
	{
		dtStyle |= DT_SINGLELINE;
	}
	else
	{
		dtStyle |= DT_WORDBREAK;
	}

	switch(dwStyle & BS_CENTER)
	{
		case BS_LEFT:
		{
			/* DT_LEFT is 0 */
			break;
		}
		case BS_RIGHT:
		{
			dtStyle |= DT_RIGHT;
			break;
		}
		case BS_CENTER:
		{
			dtStyle |= DT_CENTER;
			break;
		}
		default:
		dtStyle |= DT_CENTER;
	}

	switch(dwStyle & BS_VCENTER)
	{
		case BS_TOP:
		{
			/* DT_TOP is 0 */
			break;
		}
		case BS_BOTTOM:
		{
			dtStyle |= DT_BOTTOM;
			break;
		}
		/*
		case BS_VCENTER:
			//fall through:
		default:
			dtStyle |= DT_VCENTER;
		*/
	}
	return dtStyle;
}

//////////////////////////////////////////////////////////////////////////
//modify a color (lighten or darken)
//if dOffs is positive, it will darken the color, if negative, will lighten it
COLORREF CCustomButton::OffsetColor(COLORREF crColorIn, double dOffs)
{
COLORREF crColor;
BYTE bR, bG, bB, bR2, bG2, bB2;

	crColor=crColorIn;

	if(dOffs > 0.0 && dOffs <= 1.0)
	{
		bR = GetRValue(crColor);
		bG = GetGValue(crColor);
		bB = GetBValue(crColor);

		//red would underflow?
		if( bR < (BYTE)(dOffs * bR) )
		{
			bR2=0;
		}
		else
		{
			bR2 = (BYTE)(bR-(dOffs * bR));
		}

		//green would underflow?
		if( bG < (BYTE)(dOffs * bG) )
		{
			bG2=0;
		}
		else
		{
			bG2 = (BYTE)(bG-(dOffs * bG));
		}

		//blue would underflow?
		if( bB < (BYTE)(dOffs * bB) )
		{
			bB2=0;
		}
		else
		{
			bB2 = (BYTE)(bB-(dOffs * bB));
		}
		crColor = RGB(bR2, bG2, bB2);
	}
	else
		if(dOffs < 0.0 && dOffs >= -1.0)
		{
			bR = GetRValue(crColor);
			bG = GetGValue(crColor);
			bB = GetBValue(crColor);

			//red would overflow?
			if( (WORD)((1 - dOffs) * bR) < 0xff )
			{
				//no
				bR2 = (BYTE)(bR+(-dOffs * bR));
			}
			else
			{
				bR2=0xff;
			}
			//green would overflow?
			if( (WORD)((1 - dOffs) * bG) < 0xff )
			{
				//no
				bG2 = (BYTE)(bG+(-dOffs * bG));
			}
			else
			{
				bG2=0xff;
			}
			//blue would overflow?
			if( (WORD)((1 - dOffs) * bB) < 0xff )
			{
				//no
				bB2 = (BYTE)(bB+(-dOffs * bB));
			}
			else
			{
				bB2=0xff;
			}
			crColor = RGB(bR2, bG2, bB2);
		}
		return crColor;
}

//////////////////////////////////////////////////////////////////////////
void CCustomButton::DisplayTransparentBMP(CDC *pDestDC, HBITMAP hBmp, DWORD dwW, DWORD dwH, int nX, int nY)
{
CDC dcMem;
HBITMAP hBmpOld;

	if(TRUE == dcMem.CreateCompatibleDC(pDestDC))
	{
		hBmpOld=(HBITMAP)dcMem.SelectObject(hBmp);
		if(hBmpOld != NULL)
		{
			::TransparentBlt(pDestDC->GetSafeHdc(), nX, nY, dwW, dwH, dcMem.GetSafeHdc(), 0, 0, dwW, dwH, (UINT)RGB(0, 0, 0) );
			dcMem.SelectObject(hBmpOld);
		}
	}//compatible DC ok
}

//////////////////////////////////////////////////////////////////////////
void CCustomButton::SetCaption(CString strCaption, CString strActiveCaption)
{
	m_strCaption=strCaption;
	if(strActiveCaption != _T(""))
	{
		m_strActiveCaption=strActiveCaption;
	}
	else
	{
		m_strActiveCaption=m_strCaption;
	}
	if(m_bPressed == true)
	{
		SetWindowText(m_strActiveCaption);
	}
	else
	{
		SetWindowText(m_strCaption);
	}
	Invalidate();
}

//////////////////////////////////////////////////////////////////////////
void CCustomButton::SetFlags(DWORD dwFlags)
{
	m_cfFlags=dwFlags;
	if(m_cfFlags & bfHGradient)
	{
		m_bHGradient=true;
	}
	else
	{
		m_bHGradient=false;
	}
	Invalidate();
}

//////////////////////////////////////////////////////////////////////////
void CCustomButton::SetBitmaps(HBITMAP hBmpInactive, HBITMAP hBmpActive /* = NULL */)
{
BITMAP bmpData;

	//old present and new specified
	if(m_hBmpInactive != NULL && hBmpInactive != NULL)
	{
		//dump old
		DeleteObject(m_hBmpInactive);
		m_hBmpInactive=NULL;
		m_dwBmpH=m_dwBmpW=0;
	}

	if(hBmpInactive != NULL)
	{
		m_hBmpInactive=hBmpInactive;
		//get dimensions
		if(::GetObject(hBmpInactive, sizeof(bmpData), &bmpData) != 0)
		{
			m_dwBmpW=(DWORD)bmpData.bmWidth;
			m_dwBmpH=(DWORD)bmpData.bmHeight;
		}		
	}

	//old present and new specified
	if(m_hBmpActive != NULL && hBmpActive != NULL)
	{
		//dump old
		DeleteObject(m_hBmpActive);
		m_hBmpActive=NULL;
	}

	//if specified, use other bitmap for active state
	if(hBmpActive != NULL)
	{
		m_hBmpActive=hBmpActive;
	}
	else
	{
		//otherwise use inactive bitmap for active state	
		m_hBmpActive=m_hBmpInactive;
	}
	Invalidate();
}

//////////////////////////////////////////////////////////////////////////
void CCustomButton::SetBkgIdleColor(COLORREF crBkgIdle)
{
	m_crBkgIdle=crBkgIdle;
	Invalidate();
}

//////////////////////////////////////////////////////////////////////////
void CCustomButton::SetBkgActiveColor(COLORREF crBkgActive)
{
	m_crBkgPressed=crBkgActive;
	Invalidate();
}

//////////////////////////////////////////////////////////////////////////
void CCustomButton::SetFrgIdleColor(COLORREF crFrgIdle)
{
	m_crTxtIdle=crFrgIdle;
	Invalidate();
}

//////////////////////////////////////////////////////////////////////////
void CCustomButton::SetFrgActiveColor(COLORREF crFrgActive)
{
	m_crTxtPressed=crFrgActive;
	Invalidate();
}

//////////////////////////////////////////////////////////////////////////
void CCustomButton::SetGradientColors(COLORREF crStart, COLORREF crEnd)
{
	m_crHGStart=crStart;
	m_crHGEnd=crEnd;
	Invalidate();
}

//////////////////////////////////////////////////////////////////////////
void CCustomButton::SetFrameColor(COLORREF crFrame)
{
	m_crFrame=crFrame;
	Invalidate();
}

//////////////////////////////////////////////////////////////////////////
void CCustomButton::SetFont(HFONT hFont)
{
	//purge old font
	if(m_hCustomFont != NULL)
	{
		DeleteObject(m_hCustomFont);
	}
	m_hCustomFont=hFont;
}

⌨️ 快捷键说明

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