MFC CWnd仿按钮

CBtn::CBtn()
{
	RegisterWndClass();
}
bool CBtn::RegisterWndClass(void)
{
	WNDCLASS n;
	HINSTANCE hInst=AfxGetInstanceHandle();
	if(GetClassInfo(hInst,"MyBtn",&n)==0)return true;//已经存在
	n.style=CS_DBLCLKS;
	n.cbClsExtra=0;
	n.cbWndExtra=0;

	n.hIcon=NULL;
	n.hCursor=AfxGetApp()->LoadStandardCursor(IDC_ARROW);
	n.hInstance=hInst;

	n.lpszClassName="MyBtn";
	n.lpszMenuName=NULL;
	n.lpfnWndProc=::DefWindowProcA;
	if(AfxRegisterClass(&n))
	{
		AfxThrowResourceException();
		return false;
	}
	return true;
}


void CBtn::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	// TODO: 在此处添加消息处理程序代码
	// 不为绘图消息调用 CWnd::OnPaint()
	DrawBtn(IDR_JPG1,"JPG");
}


void CBtn::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	DrawBtn(IDB_PNG1,"PNG");
	CWnd::OnLButtonDown(nFlags, point);
}


void CBtn::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	DrawBtn(IDR_JPG1,"JPG");
	int id=22222;////给父窗口发送项被单击消息
	GetParent()->SendMessage(WM_COMMAND,MAKEWPARAM(id,0),LPARAM(this->GetSafeHwnd()));
	CWnd::OnLButtonUp(nFlags, point);
}


BOOL CBtn::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	SetCursor(AfxGetApp()->LoadCursorA(IDC_CURSOR1));
	return true;//CWnd::OnSetCursor(pWnd, nHitTest, message);
}

#include<atlimage.h>
bool CBtn::DrawBtn(int id, CString file)
{
	CImage img;
	HRSRC src=::FindResourceA(::AfxGetResourceHandle(),MAKEINTRESOURCE(id),file);
	if(src==NULL)return false;
	HGLOBAL data=::LoadResource(::AfxGetResourceHandle(),src);// 加载资源
	if(data==NULL){::FreeResource(data);return false;}
	LPVOID lp=::LockResource(data);// 锁定内存中的指定资源
	LPSTREAM is;
	DWORD size=::SizeofResource(::AfxGetResourceHandle(),src);
	HGLOBAL hg=::GlobalAlloc(GHND,size);
	LPBYTE by=(LPBYTE)::GlobalLock(hg);
	::memcpy(by,lp,size);
	::GlobalUnlock(hg);// 解除内存中的指定资源
	HRESULT res=::CreateStreamOnHGlobal(hg,true,&is);// 从指定内存创建流对象
	if(res!=S_OK)::GlobalFree(hg);
	else {img.Load(is);::GlobalFree(hg);}
	::FreeResource(data);// 释放资源
	COLORREF ref=RGB(0,0,0);
if(img.GetBPP()==32)//确认该图像包含Alpha通道
{
	for(int i=0;i<img.GetWidth();i++)
		for(int j=0;j<img.GetHeight();j++)
		{
			LPBYTE by=(LPBYTE)img.GetPixelAddress(i,j);
			by[0]=by[0]*by[3]/255;
			by[1]=by[1]*by[3]/255;
			by[2]=by[2]*by[3]/255;
		}
		ref=img.GetPixel(0,0);
}
   CClientDC dc(this);
   dc.SetStretchBltMode(3);//4
   ::SetBrushOrgEx(dc,0,0,NULL);
   CRect rc;GetClientRect(&rc);
   img.SetTransparentColor(ref);
   img.Draw(dc.m_hDC,0,0,rc.Width(),rc.Height());

   CString s="按钮";
   CFont *font=dc.SelectObject(CFont::FromHandle((HFONT)GetStockObject(DEFAULT_GUI_FONT)));
   dc.SetTextColor(RGB(255,0,0));
   dc.SetBkMode(TRANSPARENT);
   dc.DrawText(s,s.GetLength(),rc,DT_SINGLELINE|DT_VCENTER|DT_CENTER);
   return true;
}
void CMyBtnDlg::OnBnClickedButton1()
{
	b.Create(NULL,NULL,WS_VISIBLE|WS_CHILD,CRect(0,0,100,100),this,NULL,NULL);
}

#include<atlimage.h>
void CMyBtnDlg::OnMyBtn(void)
{
	//AfxMessageBox("我的按钮事件");
	CWnd *pwnd=CWnd::GetDesktopWindow();//屏幕
	CWindowDC dc(pwnd);
	CRect rc;
	pwnd->GetWindowRect(&rc);
	int pix=dc.GetDeviceCaps(BITSPIXEL)*dc.GetDeviceCaps(PLANES);
	CImage img;
	img.Create(rc.Width(),rc.Height(),pix);
	CImageDC mdc(img);
	::BitBlt(mdc,0,0,rc.Width(),rc.Height(),dc,0,0,SRCCOPY);
	img.Save("C:\j.jpg");
}


原文地址:https://www.cnblogs.com/keanuyaoo/p/3289971.html