📄 bitmapbtn.cpp
字号:
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 + -