My FAQ,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > WINDOWS窗口视图
自绘对话框
作者:未知 时间:2005-07-20 14:13 出处:VC知识库 责编:MyFAQ
              摘要:自绘对话框

自绘对话框
作者:Alon

下载示例源代码

闲来无事,写了一个简单的对话框界面,希望给需要的朋友有所帮助。
界面如下:

界面很单调,我只是想说明一下如何实现界面的自绘。如果有需要,也可以绘制更复杂漂亮的界面。

程序的实现也不复杂,接下来就跟着我一步一步做。

首先,创建一个基于对话框的应用程序。
接下来,在CTestDlg类中添加两个成员函数:

// In CTestDlg.h
public:
	void DrawView();
HBITMAP CreateGradientBMP(HDC hDC,COLORREF cl1,COLORREF cl2,int nWidth,int nHeight,int nDir,int nNumColors);
函数的具体内容如下:
// In CtestDlg.cpp
void CTestDlg::DrawView()
{
		CPaintDC dc(this);
 
		CRect rect;
		CString strText="TEST. HEllo WoRLD! 你好,VCKBASE!"; //文本内容
		GetClientRect(rect);
		rect.right=27; //自绘区域宽度

		COLORREF	m_clrSideBarStart; //自绘区域起始处颜色
		COLORREF	m_clrSideBarEnd;  //自绘区域结束处颜色
		
		m_clrSideBarStart=RGB(205,205,205); //灰色
		m_clrSideBarEnd=RGB(100,0,0); //褐色

		//创建图及绘制区域
		HBITMAP	bmpBar = CreateGradientBMP(
			dc.m_hDC, m_clrSideBarStart, m_clrSideBarEnd,
			rect.Width(), rect.Height(),
			0, 256);
		if (bmpBar)
		{
			CDC memDC;
			memDC.CreateCompatibleDC(&dc);
			HBITMAP hOldBmp = (HBITMAP)::SelectObject(memDC.m_hDC, bmpBar);
			dc.BitBlt(rect.left, rect.top,
				rect.Width(), rect.Height(),
				&memDC, 0, 0, SRCCOPY);
			::SelectObject(memDC, hOldBmp);
			::DeleteObject(bmpBar);
		}
		//绘制文本
		CFont	vertFont;
		//字体
		vertFont.CreateFont(16, 0, 900, 900, FW_BOLD,
			0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
			CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
			DEFAULT_PITCH, "Arial");
		CFont *pOldFont = dc.SelectObject(&vertFont);
		COLORREF oldColor = dc.GetTextColor();
		dc.SetTextColor(RGB(255, 255, 255));  //文本颜色
		dc.SetBkMode(TRANSPARENT);
		dc.TextOut(rect.left+2, rect.bottom-4, strText); //文本起始位置
		dc.SetTextColor(oldColor);	
		dc.SelectObject(pOldFont);
		vertFont.DeleteObject();
}
//创建图
HBITMAP CTestDlg::CreateGradientBMP(HDC hDC, COLORREF cl1, COLORREF cl2, int nWidth, int nHeight, int nDir, int nNumColors)
{
	if(nNumColors > 256)
		nNumColors = 256;

	COLORREF PalVal[256];
	memset(PalVal, 0, sizeof(COLORREF)*256);

	int nIndex;
	BYTE peRed=0,peGreen=0,peBlue=0;

	int r1=GetRValue(cl1);
	int r2=GetRValue(cl2);
	int g1=GetGValue(cl1);
	int g2=GetGValue(cl2);
	int b1=GetBValue(cl1);
	int b2=GetBValue(cl2);

    for (nIndex = 0; nIndex < nNumColors; nIndex++)
    {
        peRed = (BYTE) (r1 + MulDiv((r2-r1),nIndex,nNumColors-1));
        peGreen = (BYTE) (g1 + MulDiv((g2-g1),nIndex,nNumColors-1));
        peBlue = (BYTE) (b1 + MulDiv((b2-b1),nIndex,nNumColors-1));

		PalVal[nIndex]=(peRed << 16) | (peGreen << 8) | (peBlue);
	}

	int x,y,w,h;
	w=nWidth;
	h=nHeight;
	
	LPDWORD			pGradBits;
	BITMAPINFO		GradBitInfo;

	pGradBits=(DWORD*) malloc(w*h*sizeof(DWORD));
	memset(&GradBitInfo,0,sizeof(BITMAPINFO));

	GradBitInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
	GradBitInfo.bmiHeader.biWidth=w;
	GradBitInfo.bmiHeader.biHeight=h;
	GradBitInfo.bmiHeader.biPlanes=1;
	GradBitInfo.bmiHeader.biBitCount=32;
	GradBitInfo.bmiHeader.biCompression=BI_RGB;
	
	if(nDir==0) 
	{
		for(y=0;y<h;y++) 
		{
			for(x=0;x<w;x++) 
			{
				*(pGradBits+(y*w)+x)=PalVal[MulDiv(nNumColors,y,h)];
			}
		}
	}
	else if(nDir==1) 
	{
		for(y=0;y<h;y++)
		{
			int l,r;
			l=MulDiv((nNumColors/2),y,h);
			r=l+(nNumColors/2)-1;
			for(x=0;x<w;x++)
			{
				*(pGradBits+(y*w)+x)=PalVal[l+MulDiv((r-l),x,w)];
			}
		}
	}
	else if(nDir==2)
	{
		for(x=0;x<w;x++)
		{
			for(y=0;y<h;y++)
			{
				*(pGradBits+(y*w)+x)=PalVal[MulDiv(nNumColors,x,w)];
			}
		}
	}
	else if(nDir==3)
	{
		for(y=0;y<h;y++)
		{
			int l,r;
			r=MulDiv((nNumColors/2),y,h);
			l=r+(nNumColors/2)-1;
			for(x=0;x<w;x++)
			{
				*(pGradBits+(y*w)+x)=PalVal[l+MulDiv((r-l),x,w)];
			}
		}
	}

	HBITMAP hBmp = CreateDIBitmap(hDC,&GradBitInfo.bmiHeader,CBM_INIT,
						pGradBits,&GradBitInfo,DIB_RGB_COLORS);

	free(pGradBits);

	return hBmp;
}
接下来在CtestDlg类的OnPaint()中添加代码:
void CTestDlg::OnPaint() 
{
	if (IsIconic())
	{
		//省略源码……….
	}
	else
	{
		this->DrawView(); //此句为自添加
		CDialog::OnPaint();
	}
}

好了,现在编译运行即可。
祝各位编程快乐!
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 myfaq.com.cn All rights reserved. www.myfaq.com.cn 版权所有