📄 demoview.cpp
字号:
// 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 + -