zoukankan      html  css  js  c++  java
  • 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");
    }
    


  • 相关阅读:
    java 浅显的会议预约-没有测试过
    Postgresql 与 Spring的集成
    对象转JSON正则查找替换
    Java 对象与JSONString的互相转换
    excel 中涉及到金额显示0E-8的 可以使用以下语句来把excel导出修改为0
    Java 非正则方式校验数据
    泛型与反射的使用
    正则表达式,匹配 URL 是IP还是域名
    对外接口加密
    自定义SQL查询的使用
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3289971.html
Copyright © 2011-2022 走看看