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");

}


你可能感兴趣的:(mfc)