让你的软件界面更漂亮.docx
- 文档编号:9988953
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:40
- 大小:329.28KB
让你的软件界面更漂亮.docx
《让你的软件界面更漂亮.docx》由会员分享,可在线阅读,更多相关《让你的软件界面更漂亮.docx(40页珍藏版)》请在冰豆网上搜索。
让你的软件界面更漂亮
让你的软件界面更漂亮
(1)
本文示例源代码或素材下载
我们使用过很多的软件,给我们留下印象很深的是那些界面漂亮且迷人的软件,国外的软件象QuickTime,国产的象金山词霸等,它们的软件界面设计风格都有独特之处。
本人跟据自已的经验和大家探讨一下软件的漂亮界面实现的原理并提供DEMO程序。
本人经验不多,经常从VCKBASE.COM吸取知识,共同学习,如有不足之处,请指正!
也欢迎和我联系。
下面就开始吧!
一、漂亮界面实现的原理
用图象元素自绘窗口标题样栏,边框,系统按钮(最大化、最小化、关闭按钮)还有按窗口中的控件。
图象当然是美工画的,但要你教美工怎么去画,是不是不能理解?
,呆会我会告诉你你如何去教美工画.请先仔细看下图。
明白了吧,被红线包括的部分都是要画的图象。
画得好不好会直接影响你的软件界面。
二、原理说玩了,来说一下实现的基本知识
1、VC软件绘图技术:
CBitmap*pBitmap=newCBitmap;
BITMAPBmpInfo;
CBitmap*pOldBitmap;
CDC*pDisplayMemDC=newCDC;
pDisplayMemDC->CreateCompatibleDC(pDC);
pBitmap->LoadBitmap(IDB_TITLE_LEFT);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pBitmap->GetBitmap(&BmpInfo);
//x,y为绘图位置,必要时此语句要有For(..;..;..)控制
pDC->BitBlt(x,y,BmpInfo.bmWidth,BmpInfo.bmHeight,pDisplayMemDC,0,0,SRCCOPY);
pDisplayMemDC->SelectObject(pOldBitmap);
pBitmap->DeleteObject();
ReleaseDC(pDisplayMemDC);//记得执行以下的语句
deletepDisplayMemDC;
deletepBitmap;
2、坐标的概念:
点、窗口坐标和屏幕坐标及转换,很重要!
如不清楚请先复习相关知识。
下图是我写在一个界面,就是基于上述原理实现的:
下面介绍软件如何实现的:
①、重载对话框的消息函数:
voidOnNcLButtonDown(UINTnHitTest,CPointpoint);
//单击标题栏时是响应
voidOnNcMouseMove(UINTnHitTest,CPointpoint);
//Mous在标题移动时响应
LRESULTDefWindowProc(UINTmessage,WPARAMwParam,LPARAMlParam)
②、添加关键成员函数为:
BOOLDrawTitleBar(CDC*pDC)
③、添加完消息涵数后,在.cpp中实现它们的代码:
voidCTitleBarDlg:
:
OnNcMouseMove(UINTnHitTest,CPointpoint)
{
CDC*pDC=GetWindowDC();
CDC*pDisplayMemDC=newCDC;
pDisplayMemDC->CreateCompatibleDC(pDC);
CBitmap*pBitmap=newCBitmap;
CBitmap*pOldBitmap;
CRectrtWnd,rtButton;
if(pDC)
{
CStringStrTemp="";
GetWindowRect(&rtWnd);
//mouse坐标转化为本窗口坐标重要
point.x=point.x-rtWnd.left;
point.y=point.y-rtWnd.top;
//判断mouse是否移到系统按钮上
if(m_rtButtExit.PtInRect(point))
{
pBitmap->LoadBitmap(IDB_EXIT_FOCUS);
StrTemp=_T("关闭");
}
else
{
if(m_rtButtMin.PtInRect(point))
{
pBitmap->LoadBitmap(IDB_MIN_FOCUS);
StrTemp=_T("最小化窗口");
}
else
{
if(m_rtButtMax.PtInRect(point))
{
pBitmap->LoadBitmap(IDB_MAX_FOCUS);
if(IsZoomed())
{
StrTemp=_T("还原窗口");
}
else
{
StrTemp=_T("最化大窗口");
}
}
else
{
pBitmap->LoadBitmap(IDB_NORMAL);
}
}
}
rtButton=m_rtButtMin;
BITMAPBmpInfo;
pBitmap->GetBitmap(&BmpInfo);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pDC->BitBlt(rtButton.left-6,
rtButton.top-2,
BmpInfo.bmWidth,
BmpInfo.bmHeight,
pDisplayMemDC,
0,
0,
SRCCOPY);
pDisplayMemDC->SelectObject(pOldBitmap);
pBitmap->DeleteObject();
CRectShowTipRec;
ShowTipRec=m_rtButtMin;
if(!
StrTemp.IsEmpty())
{
// ScreenToClient(&ShowTipRec);
// m_ToolTip.AddToolTip(IDD_TITLEBAR_DIALOG,&ShowTipRec,StrTemp);
// m_ToolTip.SetDelayTime(200);
}
}
ReleaseDC(pDisplayMemDC);
ReleaseDC(pDC);
deletepDisplayMemDC;
deletepBitmap;
CDialog:
:
OnNcMouseMove(nHitTest,point);
}
//此为关键函数
voidCTitleBarDlg:
:
DrawTitleBar(CDC*pDC)
{
if(m_hWnd)
{
CBrushBrush(RGB(0,100,255));
CBrush*pOldBrush=pDC->SelectObject(&Brush);
CRectrtWnd,rtTitle,rtButtons;
GetWindowRect(&rtWnd);
//取得标题栏的位置
rtTitle.left=GetSystemMetrics(SM_CXFRAME);
rtTitle.top=GetSystemMetrics(SM_CYFRAME);
rtTitle.right=rtWnd.right-rtWnd.left-GetSystemMetrics(SM_CXFRAME);
rtTitle.bottom=rtTitle.top+GetSystemMetrics(SM_CYSIZE);
//计算最小化按钮的位置,位图大小为15X15
rtButtons.left=rtTitle.right-60;
rtButtons.top=rtTitle.top+2;
rtButtons.right=rtTitle.right-42;
rtButtons.bottom=rtTitle.top+20;
m_rtButtMin=rtButtons;
//计算最大化按钮的位置,位图大小为15X15
m_rtButtMax.left=m_rtButtMin.left+18;
m_rtButtMax.top=m_rtButtMin.top;
m_rtButtMax.right=m_rtButtMin.right+16;
m_rtButtMax.bottom=m_rtButtMin.bottom;
m_rtButtExit.left=m_rtButtMax.left+18;
m_rtButtExit.top= m_rtButtMax.top;
m_rtButtExit.right=m_rtButtMax.right+16;
m_rtButtExit.bottom=m_rtButtMax.bottom;
//准备
CBitmap*pBitmap=newCBitmap;
BITMAPBmpInfo;
CBitmap*pOldBitmap;
CDC*pDisplayMemDC=newCDC;
pDisplayMemDC->CreateCompatibleDC(pDC);
//重画Caption
POINT DrawPonit;
DrawPonit.x= rtTitle.left-4;
DrawPonit.y= rtTitle.top-4;
pBitmap->LoadBitmap(IDB_TITLE_LEFT);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pBitmap->GetBitmap(&BmpInfo);
pDC->BitBlt(rtTitle.left-4,
rtTitle.top-4,
BmpInfo.bmWidth,
BmpInfo.bmHeight,
pDisplayMemDC,
0,
0,
SRCCOPY);
DrawPonit.x=DrawPonit.x+BmpInfo.bmWidth;
pDisplayMemDC->SelectObject(pOldBitmap);
pBitmap->DeleteObject();
pBitmap->LoadBitmap(IDB_TOP);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pBitmap->GetBitmap(&BmpInfo);
while(DrawPonit.x<=m_rtButtMin.left-66)
{
pDC->BitBlt(DrawPonit.x,
DrawPonit.y,
BmpInfo.bmWidth,
BmpInfo.bmHeight,
pDisplayMemDC,
0,
0,
SRCCOPY);
DrawPonit.x=DrawPonit.x+BmpInfo.bmWidth;
}
pDisplayMemDC->SelectObject(pOldBitmap);
pBitmap->DeleteObject();
pBitmap->LoadBitmap(IDB_TITLE_RIGHT);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pBitmap->GetBitmap(&BmpInfo);
pDC->BitBlt(DrawPonit.x,
DrawPonit.y,
BmpInfo.bmWidth,
BmpInfo.bmHeight,
pDisplayMemDC,
0,
0,
SRCCOPY);
pDisplayMemDC->SelectObject(pOldBitmap);
pBitmap->DeleteObject();
//重画最小化button
rtButtons=m_rtButtMin;
pBitmap->LoadBitmap(IDB_NORMAL);
pBitmap->GetBitmap(&BmpInfo);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pDC->BitBlt(rtButtons.left-6,
rtButtons.top-2,
BmpInfo.bmWidth,
BmpInfo.bmHeight,
pDisplayMemDC,
0,
0,
SRCCOPY);
pDisplayMemDC->SelectObject(pOldBitmap);
pBitmap->DeleteObject();
intnOldMode=pDC->SetBkMode(TRANSPARENT);
COLORREFclOldText=pDC->GetTextColor();
CFonttitleFont;
titleFont.CreateFont(12,//nHeight
8,//nWidth
0,//nEscapement文本行逆时针旋转角度
0,//nOrientation字体角度
FW_BOLD,//nWeight字体粗细程度
FALSE,//bItalic
FALSE,//bUnderline
0,//cStrikeOut删除线
ANSI_CHARSET,//nCharSet
OUT_DEFAULT_PRECIS,//nOutPrecision
CLIP_DEFAULT_PRECIS,//nClipPrecision
DEFAULT_QUALITY,//nQuality
DEFAULT_PITCH|FF_SWISS,//nPitchAndFamily
_T("隶书"));//lpszFacpDC->SelectStockObject(SYSTEM_FIXED_FONT);
CFont*OldFont;
OldFont=pDC->SelectObject(&titleFont);
CStringm_StrTitle;
GetWindowText(m_StrTitle);
pDC->SetTextColor(RGB(80,255,25));
if(m_ShowTitle)
{
pDC->TextOut(65,10,m_StrTitle);
}
else
{
m_StrTitle=m_StrTitle.Left(6);
m_StrTitle+="...";
pDC->TextOut(30,10,m_StrTitle);
}
pDC->SetBkMode(nOldMode);
pDC->SetTextColor(clOldText);
pDC->SelectObject(OldFont);
//pDC->TextOut(60,60,m_StrTitle);
//重画左边框
pBitmap->LoadBitmap(IDB_LEFTDOWN);
pBitmap->GetBitmap(&BmpInfo);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
inti;
for(i=20;i<=rtWnd.bottom;i=i+BmpInfo.bmHeight-3)
{
pDC->BitBlt(0,rtButtons.top+i,
BmpInfo.bmWidth,
BmpInfo.bmHeight,
pDisplayMemDC,
0,
0,
SRCCOPY);
}
pDisplayMemDC->SelectObject(pOldBitmap);
pBitmap->DeleteObject();
//重画右边框
pBitmap->LoadBitmap(IDB_RIGHTDOWN);
pBitmap->GetBitmap(&BmpInfo);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
GetClientRect(&rtWnd);
for(i=25;i<=rtWnd.bottom+27;i=i+BmpInfo.bmHeight-3)
{
pDC->BitBlt(rtWnd.right,i,
BmpInfo.bmWidth,
BmpInfo.bmHeight,
pDisplayMemDC,
0,
0,
SRCCOPY);
}
pDisplayMemDC->SelectObject(pOldBitmap);
pBitmap->DeleteObject();
//重画底边框
pBitmap->LoadBitmap(IDB_DOWN);
pBitmap->GetBitmap(&BmpInfo);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
GetClientRect(&rtWnd);
for(i=9;i<=rtWnd.right;i=i+2)
{
GetClientRect(&rtWnd);
pDC->BitBlt(i,rtWnd.bottom+26,
BmpInfo.bmWidth,
BmpInfo.bmHeight,
pDisplayMemDC,
0,
0,
SRCCOPY);
}
pDisplayMemDC->SelectObject(pOldBitmap);
pBitmap->DeleteObject();
ReleaseDC(pDisplayMemDC);
deletepDisplayMemDC;
deletepBitmap;
}
}
voidCTitleBarDlg:
:
OnNcLButtonDown(UINTnHitTest,CPointpoint)
{
CRectrtWnd;
GetWindowRect(&rtWnd);
//mouse坐标转化为本窗口坐标重要
point.x=point.x-rtWnd.left;
point.y=point.y-rtWnd.top;
//检测各按钮是否按到
if(m_rtIcon.PtInRect(point))
AfxMessageBox("界面软件设计者:
朱一松EMail:
Song_0962@");
else
{
if(m_rtButtHelp.PtInRect(point))
{
SendMessage(WM_HELP);
}
else
{
if(m_rtButtExit.PtInRect(point))
{
SendMessage(WM_CLOSE);
}
else
{
if(m_rtButtMin.PtInRect(point))
{
m_ShowTitle=FALSE;
SendMessage(WM_SYSCOMMAND,
SC_MINIMIZE,
MAKELPARAM(point.x,point.y));
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件 界面 漂亮