⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demoview.cpp

📁 电脑编程技巧和源码。很不错的。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// DemoView.cpp : implementation of the CDemoView class
//

#include "stdafx.h"
#include "Demo.h"

#include "DemoDoc.h"
#include "DemoView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDemoView

IMPLEMENT_DYNCREATE(CDemoView, CView)

BEGIN_MESSAGE_MAP(CDemoView, CView)
	//{{AFX_MSG_MAP(CDemoView)
	ON_COMMAND(IDM_DRAWGRAY, OnDrawgray)
	ON_COMMAND(IDM_3DDRAWGRAY, On3ddrawgray)
	ON_COMMAND(IDM_FADEGRAYINOUT, OnFadegrayinout)
	ON_COMMAND(IDM_FADEINOROUT, OnFadeinorout)
	ON_COMMAND(IDM_SEIMTRANDRAW, OnSeimtrandraw)
	ON_COMMAND(IDM_TRANDRAW, OnTrandraw)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDemoView construction/destruction

CDemoView::CDemoView()
{
	// TODO: add construction code here

}

CDemoView::~CDemoView()
{
}

BOOL CDemoView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CDemoView drawing

void CDemoView::OnDraw(CDC* pDC)
{
	CDemoDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CDemoView printing

BOOL CDemoView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CDemoView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CDemoView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CDemoView diagnostics

#ifdef _DEBUG
void CDemoView::AssertValid() const
{
	CView::AssertValid();
}

void CDemoView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CDemoDoc* CDemoView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDemoDoc)));
	return (CDemoDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CDemoView message handlers

void CDemoView::OnDrawgray() 
{
	// TODO: Add your command handler code here
	CString filename;
	CFileDialog fdlg(TRUE,NULL,NULL,OFN_OVERWRITEPROMPT,"BMP(*.bmp)|*.bmp||",NULL);
    if(fdlg.DoModal()==IDOK)
	{
		filename=fdlg.GetPathName();
		HGLOBAL hDIB;
		CPalette pPal;
		CDC *pDC=GetDC();
		CRect rect;
		GetClientRect(&rect);
		pDC->FillRect(rect,NULL);
		LoadBMP(filename,&hDIB,&pPal);
		DrawDIB(pDC,hDIB,&pPal,0,0);
		Sleep(2000);
		pDC->FillRect(rect,NULL);
		DrawGray2D(pDC,hDIB);
	}
}

void CDemoView::On3ddrawgray() 
{
	// TODO: Add your command handler code here
	CString filename;
	CFileDialog fdlg(TRUE,NULL,NULL,OFN_OVERWRITEPROMPT,"BMP(*.bmp)|*.bmp||",NULL);
    if(fdlg.DoModal()==IDOK)
	{
		filename=fdlg.GetPathName();
		CDC *pDC=GetDC();
		CRect rect;
		GetClientRect(&rect);
		pDC->FillRect(rect,NULL);
		HGLOBAL hDIB;
		CPalette pPal;
		LoadBMP(filename,&hDIB,&pPal);
		BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;	
		int nWidth = bmInfo.bmiHeader.biWidth;
		int nHeight = bmInfo.bmiHeader.biHeight;

		HBITMAP hdib=(HBITMAP)::LoadImage( AfxGetInstanceHandle(), 
			filename, IMAGE_BITMAP, 0,0, LR_LOADFROMFILE);
		DrawDIB(pDC,hDIB,&pPal,0,0);
		Sleep(2000);
		pDC->FillRect(rect,NULL);
		DrawGray3D(pDC,0,0,nWidth,nHeight,hdib,0,0);
	}
}

void CDemoView::OnFadegrayinout() 
{
	// TODO: Add your command handler code here
	CString filename;
	CFileDialog fdlg(TRUE,NULL,NULL,OFN_OVERWRITEPROMPT,"BMP(*.bmp)|*.bmp||",NULL);
    if(fdlg.DoModal()==IDOK)
	{
		filename=fdlg.GetPathName();
		HGLOBAL hDIB;
		CPalette pPal;
		CDC *pDC=GetDC();
		CRect rect;
		GetClientRect(&rect);
		pDC->FillRect(rect,NULL);
		LoadBMP(filename,&hDIB,&pPal);
		DrawDIB(pDC,hDIB,&pPal,0,0);
		Sleep(2000);
		pDC->FillRect(rect,NULL);
		FadeInColorORFadeOutGray(pDC,hDIB,0,0,80,100,1);
		Sleep(2000);
		pDC->FillRect(rect,NULL);
		FadeInColorORFadeOutGray(pDC,hDIB,0,0,80,100,0);
	}
}

void CDemoView::OnFadeinorout() 
{
	// TODO: Add your command handler code here
	COLORREF m_bkcolor;
	CString filename;
	CColorDialog cdlg;
	if(cdlg.DoModal()==IDOK)
		 m_bkcolor=cdlg.GetColor();
	else 
		return;
	CFileDialog fdlg(TRUE,NULL,NULL,OFN_OVERWRITEPROMPT,"BMP(*.bmp)|*.bmp||",NULL);
    if(fdlg.DoModal()==IDOK)
	{
		filename=fdlg.GetPathName();
		HGLOBAL hDIB;
		CPalette pPal;
		CDC *pDC=GetDC();
		CRect rect;
		GetClientRect(&rect);
		pDC->FillRect(rect,NULL);
		LoadBMP(filename,&hDIB,&pPal);
		DrawDIB(pDC,hDIB,&pPal,0,0);
		Sleep(2000);
		pDC->FillRect(rect,NULL);
		FadeInORFadeOut(pDC,hDIB,m_bkcolor,0,0,80,100,1);
		Sleep(2000);
		pDC->FillRect(rect,NULL);
		FadeInORFadeOut(pDC,hDIB,m_bkcolor,0,0,80,100,0);
	}
}

void CDemoView::OnSeimtrandraw() 
{
	// TODO: Add your command handler code here
	CDC *pDC=GetDC();
	
	CRect rect;
	GetClientRect(&rect);
	CBrush hb1;
	hb1.CreateSolidBrush(RGB(0,0,0));
	pDC->FillRect(rect,&hb1);

	CPen pen1,pen2,pen3,pen4;
	pen1.CreatePen(PS_SOLID,1,RGB(0,255,0));
	CPen *open=pDC->SelectObject(&pen1);
	pDC->MoveTo(0,100);
	pDC->LineTo(800,100);
	pen2.CreatePen(PS_SOLID,1,RGB(255,0,0));
	pDC->SelectObject(&pen2);
	pDC->MoveTo(0,110);
	pDC->LineTo(800,110);
	pen3.CreatePen(PS_SOLID,1,RGB(0,0,255));
	pDC->SelectObject(&pen3);
	pDC->MoveTo(0,120);
	pDC->LineTo(800,120);
	pen4.CreatePen(PS_SOLID,1,RGB(255,0,255));
	pDC->SelectObject(&pen4);
	pDC->MoveTo(0,130);
	pDC->LineTo(800,130);

	CString filename;
	CFileDialog fdlg(TRUE,NULL,NULL,OFN_OVERWRITEPROMPT,"BMP(*.bmp)|*.bmp||",NULL);
    if(fdlg.DoModal()==IDOK)
	{
		filename=fdlg.GetPathName();
		HGLOBAL hDIB;
		CPalette pPal;
		LoadBMP(filename,&hDIB,&pPal);
		//DrawDIB(pDC,hDIB,&pPal,450,50);
	    DrawSemiTransparentBitmap(pDC,0,80,hDIB,&pPal);
	}
}

void CDemoView::OnTrandraw() 
{
	// TODO: Add your command handler code here
	CDC *pDC=GetDC();
	
	CRect rect;
	GetClientRect(&rect);
	CBrush hb1;
	hb1.CreateSolidBrush(RGB(0,0,0));
	pDC->FillRect(rect,&hb1);

	CPen pen1,pen2,pen3,pen4;
	pen1.CreatePen(PS_SOLID,1,RGB(0,255,0));
	CPen *open=pDC->SelectObject(&pen1);
	pDC->MoveTo(0,100);
	pDC->LineTo(800,100);
	pen2.CreatePen(PS_SOLID,1,RGB(255,0,0));
	pDC->SelectObject(&pen2);
	pDC->MoveTo(0,110);
	pDC->LineTo(800,110);
	pen3.CreatePen(PS_SOLID,1,RGB(0,0,255));
	pDC->SelectObject(&pen3);
	pDC->MoveTo(0,120);
	pDC->LineTo(800,120);
	pen4.CreatePen(PS_SOLID,1,RGB(0,0,255));
	pDC->SelectObject(&pen4);
	pDC->MoveTo(0,130);
	pDC->LineTo(800,130);

	COLORREF m_bkcolor;
	CString filename;
	CColorDialog cdlg;
	cdlg.m_cc.rgbResult=RGB(192,192,192);
	if(cdlg.DoModal()==IDOK)
		 m_bkcolor=cdlg.GetColor();
	else 
		return;
	CFileDialog fdlg(TRUE,NULL,NULL,OFN_OVERWRITEPROMPT,"BMP(*.bmp)|*.bmp||",NULL);
    if(fdlg.DoModal()==IDOK)
	{
		filename=fdlg.GetPathName();
		HGLOBAL hDIB;
		CPalette pPal;
		LoadBMP(filename,&hDIB,&pPal);
		//DrawDIB(pDC,hDIB,&pPal,450,50);
	    DrawTransparentBitmap(pDC,0,80,hDIB,m_bkcolor,&pPal);
	}
}

//////////////////////////////////////////////////
void CDemoView::DrawGray2D( CDC *pDC, HANDLE hDIB )
{
	CPalette pal;
	CPalette *OldPal;

	BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
	//计算位图颜色数
	int nColors = bmInfo.bmiHeader.biClrUsed ? bmInfo.bmiHeader.biClrUsed : 
				1 << bmInfo.bmiHeader.biBitCount;
	
	if( pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE && nColors <= 256 )
	{     //如果系统支持调色板且位图小于256色。
		// 分配内存给调色板
		UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors);
		LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];
            //初始化系统调色板版本号
		pLP->palVersion = 0x300;
            //调色版颜色数
		pLP->palNumEntries = nColors;
		//设置灰度调色板
		for( int i=0; i < nColors; i++)
		{
			int nGray = (bmInfo.bmiColors[i].rgbRed*299+ bmInfo.bmiColors[i].rgbGreen*587+ bmInfo.bmiColors[i].rgbBlue*114)/1000; 
                  //修改系统调色板
			pLP->palPalEntry[i].peRed = nGray;
			pLP->palPalEntry[i].peGreen = nGray;
			pLP->palPalEntry[i].peBlue = nGray;
			pLP->palPalEntry[i].peFlags = 0;
		}
		pal.CreatePalette( pLP );
		delete[] pLP;
		// 选择调色板
		OldPal = pDC->SelectPalette(&pal, FALSE);
		pDC->RealizePalette();
	}
	else if((pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE) == 0 && nColors <= 256 )
	{
		//系统不支持调色板,但位图颜色小于256色
		for( int i=0; i < nColors; i++)
		{
			int nGray = (bmInfo.bmiColors[i].rgbRed*299+ bmInfo.bmiColors[i].rgbGreen*587+ bmInfo.bmiColors[i].rgbBlue*114)/1000; 
                  //修改位图调色板
			bmInfo.bmiColors[i].rgbRed = nGray;
			bmInfo.bmiColors[i].rgbGreen = nGray;
			bmInfo.bmiColors[i].rgbBlue = nGray;
		}
	}

	int nWidth = bmInfo.bmiHeader.biWidth;
	int nHeight = bmInfo.bmiHeader.biHeight;
	LPVOID lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);
       // 绘制位图
	::SetDIBitsToDevice(pDC->m_hDC,0,0,nWidth,nHeight,0,0,0,nHeight,lpDIBBits,(LPBITMAPINFO)hDIB,DIB_RGB_COLORS);	
	if( pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE)
       	pDC->SelectPalette(OldPal, FALSE);
}

void CDemoView::DrawGray3D (CDC *pDC, int nXDest, int nYDest, int nWidth, int nHeight, HBITMAP hDIB, int nXSrc, int nYSrc)
{
    if(nWidth <= 0 || nHeight <= 0)
	  return;

    CDC memDC ;
    memDC.CreateCompatibleDC(pDC);
    CDC BWDC ;
    BWDC.CreateCompatibleDC(pDC);
	//生成黑白位图与黑白调色板
	//定义黑白位图信息头
	struct {
	       	BITMAPINFOHEADER bmiHeader; 
			RGBQUAD       bmiColors[2]; 
		} BWBITMAPINFO = {
	     		{	sizeof(BITMAPINFOHEADER),	
				nWidth, 		
				nHeight,		
				1,			
				1,				
				BI_RGB, 			
				0,					
				0,					
				0,					
				0,					
				0						
        		},				
	       	{//定义黑白颜色
		             { 0x00, 0x00, 0x00, 0x00 }, { 0xFF, 0xFF, 0xFF, 0x00 }
		       } 
		};
	VOID *pbitsBW;
	HBITMAP hDIBBW = CreateDIBSection(BWDC.m_hDC,
			(LPBITMAPINFO)&BWBITMAPINFO, DIB_RGB_COLORS, &pbitsBW, NULL, 0);
						
	if (hDIBBW)
	{
		SelectObject(BWDC.m_hDC, hDIBBW);
		SelectObject(memDC.m_hDC, hDIB);
		//将彩色位图拷贝到黑白位图中.
		BWDC.BitBlt(0, 0, nWidth, nHeight, &memDC, nXSrc, nYSrc, SRCCOPY);
		//绘制衬底
		FillRect(pDC->m_hDC,CRect(nXDest, nYDest, nXDest + nWidth, nYDest +nHeight), GetSysColorBrush(COLOR_3DFACE));
              //使用COLOR_3DHILIGHT画刷,0xB88888光栅显示黑白位图到视.
		CBrush hb1,hb2;
		CBrush *oldBrush ;
		hb1.CreateSolidBrush(GetSysColor(COLOR_3DHILIGHT));
		oldBrush=pDC->SelectObject(&hb1);
		pDC->BitBlt( nXDest + 1, nYDest + 1, nWidth, nHeight, &BWDC, 0, 0,0xB88888 );
		hb2.CreateSolidBrush(GetSysColor(COLOR_3DSHADOW));
		pDC->SelectObject(&hb2);
		//使用COLOR_3DSHADOW画刷,0xB88888光栅显示黑白位图到视,形成3D位图.
		pDC->BitBlt( nXDest, nYDest, nWidth, nHeight, &BWDC, 0, 0,0xB88888);
		pDC->SelectObject(oldBrush);
	}
}

HPALETTE CDemoView::Create236Palette(HANDLE hDIB)
{
	HPALETTE hPal = NULL;
	if (!hDIB)
		return NULL;
	
	BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
	int nColors = bmInfo.bmiHeader.biClrUsed ? bmInfo.bmiHeader.biClrUsed : 
					1 << bmInfo.bmiHeader.biBitCount;

	if( nColors > 256 ) 
		return NULL;
	
	UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors);
	LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];

	pLP->palVersion = 0x300;//调色板版本号
	if (nColors > 236)
	{
		typedef struct _tagBESTCOLORS
		{
			DWORD dwColorCnt;//使用次数
			BOOL  bDontUse;//是否能用标志
		} BESTCOLORS;
		
		BESTCOLORS bc[256];
		BYTE dwLeastUsed[20];
		LPSTR lpBits;		
		int   nWidth, nHeight, nBytesPerLine, cx, cy;   
		::ZeroMemory( bc, 256*sizeof(BESTCOLORS));
		
		lpBits = (LPSTR)(bmInfo.bmiColors + nColors);
		nWidth = bmInfo.bmiHeader.biWidth;
		nHeight = bmInfo.bmiHeader.biHeight;
             //每行的字节数
		nBytesPerLine = ((((bmInfo.bmiHeader.biWidth * 
					bmInfo.bmiHeader.biBitCount) + 31) & ~31) / 8);
              //统计每种颜色所用的次数
		for (cy = 0; cy < nHeight; cy++)
			for (cx = 0; cx < nWidth; cx++)
				bc[*(LPBYTE)(lpBits+cy*nBytesPerLine+cx)].dwColorCnt++;
		//不用的颜色数	
		int nReject = nColors - 236;
              //预定义不用的颜色
		for (cx=0; cx < nReject; cx++)
		{
			bc[cx].bDontUse = TRUE;
			dwLeastUsed[cx] = cx;
		}
              //将使用次数最少的颜色设为不用
		for (cx=0; cx < nColors; cx++)
		{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -