Chinaunix首页 | 论坛 | 博客
  • 博客访问: 589851
  • 博文数量: 945
  • 博客积分: 52360
  • 博客等级: 大将
  • 技术积分: 13060
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-07 10:11
文章分类

全部博文(945)

文章存档

2011年(1)

2008年(944)

我的朋友

分类: C/C++

2008-08-07 10:26:21

下载本文示例代码
下载示例源代码

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

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

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

首先,创建一个基于对话框的应用程序。
接下来,在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接下来在CtestDlg类的OnPaint()中添加代码:
void CTestDlg::OnPaint() 

{

	if (IsIconic())

	{

		//省略源码……….

	}

	else

	{

		this->DrawView(); //此句为自添加

		CDialog::OnPaint();

	}

}


好了,现在编译运行即可。
祝各位编程快乐! 下载本文示例代码
阅读(61) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~