当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 自绘对话框

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 自绘对话框


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 54 ::
收藏到网摘: n/a

自绘对话框
作者:Alon

下载示例源代码

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

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

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

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

// In CTestDlg.hpublic:	void DrawView();HBITMAP CreateGradientBMP(HDC hDC,COLORREF cl1,COLORREF cl2,int nWidth,int nHeight,int nDir,int nNumColors);
函数的具体内容如下:
// In CtestDlg.cppvoid 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,&Grad