www.gusucode.com > 一个VC++ GUI测试程序-源码程序 > 一个VC++ GUI测试程序-源码程序/code/Test1Dlg.cpp

    //Download by http://www.NewXing.com
// Test1Dlg.cpp : implementation file
//

#include "stdafx.h"
#include "GUITest.h"
#include "Test1Dlg.h"
#include "DlgBaseClass.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#include <Atlbase.h>
#include <afxpriv2.h>

/////////////////////////////////////////////////////////////////////////////
// CTest1Dlg dialog


CTest1Dlg::CTest1Dlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTest1Dlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTest1Dlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}


void CTest1Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTest1Dlg)
	DDX_Control(pDX, IDC_BUTTON4, m_btn3);
	DDX_Control(pDX, IDC_BUTTON3, m_btn2);
	DDX_Control(pDX, IDC_BUTTON1, m_btn1);
	DDX_Control(pDX, IDC_SCROLL_STATIC, m_ScrollLabel);
	DDX_Control(pDX, IDC_ANI, m_AniBtn);
	DDX_Control(pDX, IDC_LIST1, m_list);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CTest1Dlg, CDialog)
	//{{AFX_MSG_MAP(CTest1Dlg)
	ON_WM_CTLCOLOR()
	ON_WM_ERASEBKGND()
	ON_WM_SETCURSOR()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTest1Dlg message handlers

BOOL CTest1Dlg::OnInitDialog() 
{
	CDialog::OnInitDialog();

	m_Back.LoadBitmap(IDB_BACK);
	m_Font1.CreatePointFont(120,"Arial");

	m_AniBtn.SetFlat();
	m_AniBtn.setImageList(CDlgBaseClass::m_pImageList, -1);
	m_AniBtn.start();

	if(m_list.m_hWnd)
	{
		m_list.InsertColumn(0, "QQ", LVCFMT_LEFT, 100);
		m_list.InsertColumn(1, "昵称", LVCFMT_LEFT, 100);

		m_list.InsertItem(0,"alkdsfj;las",0);
		m_list.SetItemText(0,1,"alkdsfj;las");
		
		m_list.InsertItem(1,"alkdsfj;las",0);
		m_list.SetItemText(1,1,"alkdsfj;las");
		
		m_list.InsertItem(2,"alkdsfj;las",0);
		m_list.SetItemText(2,1,"alkdsfj;las");
		
		m_list.InsertItem(3,"alkdsfj;las",0);
		m_list.SetItemText(3,1,"alkdsfj;las");
		
		m_list.InsertItem(4,"alkdsfj;las",0);
		m_list.SetItemText(4,1,"alkdsfj;las");

		m_list.InsertItem(5,"alkdsfj;las",0);
		m_list.SetItemText(5,1,"alkdsfj;las");
	}	


	//设置Title
	m_ScrollLabel.Initialize();
	m_ScrollLabel.SetWindowText("这是个滚动文本框.");
	m_ScrollLabel.SetTextColor(CONTROL_TEXTCOLOR);
	m_ScrollLabel.SetBkColor(CONTROL_BKCOLOR);
	m_ScrollLabel.SetTextVAlign(CScrollLabel::SL_TA_VCENTER);
	m_ScrollLabel.SetScrollStyle(CScrollLabel::SL_HSCROLLLEFT);	
	
	m_btn1.SetDefaultFace();
	m_btn1.SetDefaultButton();
	m_btn2.SetDefaultFace();
	m_btn2.SetDefaultButton();
	m_btn3.SetDefaultFace();
	m_btn3.SetDefaultButton();

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}


HBRUSH CTest1Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	//设置透明背景模式
	pDC->SetBkMode(TRANSPARENT);
	if(nCtlColor == CTLCOLOR_STATIC)
	{
		pDC->SelectObject(&m_Font1);
		pDC->SetTextColor(RGB(255, 0, 0));
	}
	//设置背景刷子为空
	return (HBRUSH)::GetStockObject(HOLLOW_BRUSH);
}

BOOL CTest1Dlg::OnEraseBkgnd(CDC* pDC) 
{
	CDC dc;
	dc.CreateCompatibleDC(pDC);
	dc.SelectObject(&m_Back);

	//获取BITMAP对象
	BITMAP hb;
	m_Back.GetBitmap(&hb);

	//获取窗口大小
	CRect rt;
	GetClientRect(&rt);
	//显示位图
	pDC->BitBlt(0, 0, rt.Width(), rt.Height(),&dc, 0, 0, SRCCOPY);
//	pDC->StretchBlt(0, 0, rt.Width(), rt.Height(),&dc, 0, 0, hb.bmWidth, hb.bmHeight, SRCCOPY);

	return TRUE;
}

BOOL CTest1Dlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
	if(pWnd->GetDlgCtrlID()==IDOK)
	{
			SetCursor(AfxGetApp()->LoadCursor(IDI_ERROR)); 
			SetWindowText("I'm Here!");
			return TRUE;
	}
	else
	{
		SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
		SetWindowText("Other");
		return TRUE;
	}
	return CDialog::OnSetCursor(pWnd, nHitTest, message);
}

/////////////////////////////////////////////////////////////////////
BOOL bIsGIFRunning = FALSE;

typedef struct gifImage{
	WORD lWidth;
	WORD lHeight;
	WORD width;
	WORD height;
	struct flag{
		BYTE d:3;
		BYTE c:1;
		BYTE b:3;
        BYTE a:1;
	}Flag;
}GifImage,*PGifImage;
#include <math.h>

static UINT GifThread(LPVOID gifDC)
{
	CDC* pdc = (CDC*)gifDC;
	HINSTANCE handle = ::AfxGetResourceHandle();
	HRSRC hrsrc = ::FindResource(handle,MAKEINTRESOURCE(IDR_IMAGE1),"IMAGE");
    DWORD word = ::SizeofResource(handle,hrsrc);
    BYTE* lpBy = (BYTE*)LoadResource(handle,hrsrc);
	BYTE* pByte[20];
	DWORD nu[20];
	int num = 0;
	DWORD firstLocation = 0;
	for(DWORD j=0;j<word;j++)
	{
		if(lpBy[j]==0x2c)
		{
			if(lpBy[j-1]==0x00)
			{
				
				if(num==0)
				{
                    firstLocation = j;
				}
                PGifImage nowImage = (PGifImage)&lpBy[j+1];
				if(nowImage->Flag.a==0)
				{
					DWORD number = 1+sizeof(GifImage);
					while(lpBy[j+number]!=0)
					{
					    number = number+(DWORD)lpBy[j+number]+1;
					}
					number++;
					pByte[num] = new BYTE[number];
					for(DWORD n=0;n<number;n++)
					{
						*(BYTE*)(pByte[num]+n) = lpBy[j+n];
					}
					nu[num] = number;
					j = j+number-1;
					num++;
				}
				else
				{
					int number = 1+sizeof(GifImage)+1+3*(int)floor(pow(2,nowImage->Flag.d));
					while(lpBy[j+number]!=0)
					{
					    number = number+lpBy[j+number];
					}
					pByte[num] = new BYTE[number];
					for(int n=0;n<number;n++)
					{
						*(BYTE*)(pByte[num]+n) = lpBy[j+n];
					}
					nu[num] = number;
					j = j+number-1;
					num++;
				}
			}
		}
	}
	while(bIsGIFRunning)
	{
		for(int m=0;bIsGIFRunning && m<num;m++)
		{
			CBrush brush(RGB(255,255,255));
			pdc->FillRect(CRect(0,0,200,200),&brush);
			DWORD DDD;
			VirtualProtect(lpBy,word,PAGE_READWRITE,&DDD);
            for(DWORD n=0;n<nu[m];n++)
			{
				lpBy[firstLocation+n] = *(BYTE*)(pByte[m]+n);
			}
			VirtualProtect(lpBy,word,DDD,NULL);



	        CMemFile file(lpBy,word);
            CArchive ar(&file,CArchive::load|CArchive::bNoFlushOnDelete);
            CArchiveStream arcstream(&ar);
            CComQIPtr<IPicture> m_picture;
			HRESULT hr = OleLoadPicture((LPSTREAM)&arcstream,0,false,IID_IPicture,(void**)&m_picture);
			long a,b;
			m_picture->get_Width(&a);
			m_picture->get_Height(&b);
			CSize sz(a,b);
			pdc->HIMETRICtoDP(&sz);
			CRect rect;
			m_picture->Render(*pdc,0,0,sz.cx,sz.cy,0,b,a,-b,&rect);
			Sleep(400);
		}
	}
	return 1;
}

void CTest1Dlg::OnOK() 
{
	if(!bIsGIFRunning)
	{
		CDC* pdc = GetDC();
		m_gifDC = new CDC;
		m_gifDC->Attach(pdc->GetSafeHdc());
		AfxBeginThread(GifThread,(LPVOID)m_gifDC);
		bIsGIFRunning = TRUE;
	}
}

void CTest1Dlg::OnCancel() 
{
	if(bIsGIFRunning)
	{
		bIsGIFRunning=FALSE;
		Sleep(1000);
	}
	CDialog::OnCancel();
}