现在的位置: 首页 > 综合 > 正文

C++ Builder 界面开发

2013年06月05日 ⁄ 综合 ⁄ 共 11568字 ⁄ 字号 评论关闭

C++ Builder 6.0 界面实例开发
实例1 界面图案演示
实例2 创建标题栏在左边的窗口界面
实例3 创建超级连接界面
实例4 创建不规则窗口界面
实例5 创建可扩展对话框界面
实例6 创建NEO Skin 窗口界面
实例7 创建Windows2000 透明窗口界面
实例8 创建自画弹出式菜单界面
实例9 创建自画主菜单界面
实例10 创建自画窗口背景界面

实例1 界面图案演示

实例目标

本实例作来本书的第一个实例,主要让大家轻松地学习本书,让大家先有一个感觉,编
程其实是一个很美的事情。

实现技术

主要用两函数MoveTo 和LineTo 实现。设置窗口的颜色为clNone 。
代码如下:
void __fastcall TfrmMain::FormPaint(TObject *Sender)
{

double x1,y1,x2,y2;

const int nScale = 100;

Canvas->Pen->Color = clYellow;// 设置FORM 界面的画笔颜色。

for (int i=0; i<720; i++)

{

double dAngle = i*M_PI/360;//M_PI 在math.h 里。

double E = nScale*(1+sin(3*dAngle));

x1 = 320+E*cos(dAngle);

x2 = 320+E*cos(dAngle+M_PI/5);

y1 = 240+E*sin(dAngle);

y2 = 240+E*sin(dAngle+M_PI/5);

Canvas->MoveTo(x1,y1);// 移到x1,y1 位置。
Canvas->LineTo(x2,y2);// 从当前位置画直线到x2,y2.

}

}

实现步骤

实现步骤很简单,用CB6.0 创建一个应用程序,把它保存为exp1 。然后设置窗口的背
影颜色为clNone ,设置FormPaint 事件函数,并加入以上代码就行了。

实例2 创建标题栏在左边的窗口界面

实例目标

实现左边标题,能拖动的窗口。如下图所示:

实现技术

第一步先指明窗口BorderStyle 为bsNone,这样就不能拉伸窗,没有标题和边框。第二
步就是在FormPaint(TObject *Sender) 函数里面画上标题和边框。这个函数响应消息OnPaint,
当出现重画窗口时调用。第三步就是响应WM_NCHITTEST 消息,以便拖动窗口。当返回
这个消息的结果为HTCAPTION 时,WINDOWS 就认为鼠标在标题框内,所以能拖动窗口
移动。

实现步骤

第一步创建程序,在Object Inspector 中设置BorderStyle 为bsNone 。
第二步添加DrawTitle() ,代码如下:
void __fastcall TfrmTitle::DrawTitle(void)
{

RECT rc;
//左边标题栏。
::SetRect(&rc,0,0,nTitleWidth,ClientHeight);
Canvas->Brush->Color = clBlue;
Canvas->FillRect(rc);
//右边边界。
::SetRect(&rc,ClientWidth-2,0,ClientWidth,ClientHeight);
Canvas->Brush->Color = clBlue;
Canvas->FillRect(rc);
//上面边界。
::SetRect(&rc,0,0,ClientWidth,2);
Canvas->Brush->Color = clBlue;
Canvas->FillRect(rc);
//下面边界。
::SetRect(&rc,0,ClientHeight-2,ClientWidth,ClientHeight);
Canvas->Brush->Color = clBlue;

Canvas->FillRect(rc);
//设置ICON 位置。
ImageIcon->Left = 0;
ImageIcon->Top = ClientHeight - ImageIcon->Height;
//输出标题。
char* msg=Caption.c_str();

LOGFONT fontRec;
memset(&fontRec,0,sizeof(LOGFONT));
fontRec.lfHeight = -13;
fontRec.lfWeight = FW_NORMAL;
fontRec.lfEscapement = 900; // 字体旋转90 度。
lstrcpy(fontRec.lfFaceName," 宋体");

HFONT hFont=CreateFontIndirect(&fontRec);// 创建字体。
HFONT hOld=::SelectObject(Canvas->Handle,hFont);// 选中字体。

::SetRect(&rc,0,0,nTitleWidth,ClientHeight);
::SetTextColor(Canvas->Handle,RGB(255,255,255));// 设置字体的颜色。
//输出标题。
::TextOut(Canvas->Handle,3,ClientHeight - ImageIcon->Height,msg,lstrlen(msg));

::SelectObject(Canvas->Handle,hOld);// 恢复。
::DeleteObject(hFont);

}

第三步添加OnNcHitTest(TMessage& tMsg) 函数,处理WM_NCHITTEST 消息。
void TfrmTitle::OnNcHitTest(TMessage& tMsg)
{

TPoint pt;
//取得鼠标位置。
pt.x=LOWORD(tMsg.LParam);
pt.y=HIWORD(tMsg.LParam);
pt =ScreenToClient(pt);// 转换为客户坐标。

RECT rc;
::SetRect(&rc,0,0,nTitleWidth,ClientHeight);

if(PtInRect(&rc,pt))// 是否在自画的标题框内。
tMsg.Result = HTCAPTION;// 返回在标题栏内结果。
else
DefaultHandler(&tMsg);// 让窗口缺省消息处理函数处理。
}

实例3 创建超级连接界面

实例目标

本实例介绍如何创建的热点连接(hotlink),该连接指向一定的Internet 资源。如果用户
单击超级连接,就可以打开连接的文本。该热点连接初始为蓝色,当鼠标移动到热点连接上
时,就会变成绿色,并且鼠标变为小手形状,当点击这些热点连接时,就能可以访问该连接
的Internet 资源。如果热点为粉红色,表示已经访问过,程序的界面如下:

实现技术

主要有几个要点,第一个就是当鼠标移到上面时,要设置字体不同的颜色。第二个就是
要设置鼠标形状。第三个就是当按下时,打开浏览器连接网页。第四个就是当已经连接了就
要改为粉红色。

实现步骤

第一步就创建一个Label 按件,然后设置字体属性为有下划线,并设置字体颜色为蓝色。
第二步就设置鼠标移动的消息响应。第三步就是实现按下连接后开始连接网站。
详细代码如下:

//---------------------------------------------------------------------------
__fastcall TfrmHyperLink::TfrmHyperLink(TComponent* Owner)
: TForm(Owner)

{
m_bHyperLinked = false;// 设置为没有按下连接。
lbHyperLink->Cursor = crHandPoint;// 设置光标为手掌形状。

}
//---------------------------------------------------------------------------
// 鼠标进入响应。
//
void __fastcall TfrmHyperLink::lbHyperLinkMouseEnter(TObject *Sender)
{

if(!m_bHyperLinked)// 如果没有按下设置颜色和手
{
lbHyperLink->Font->Color = clGreen;// 设置字体颜色为绿色。

}
}
//---------------------------------------------------------------------------
// 鼠标离开响应。

//
void __fastcall TfrmHyperLink::lbHyperLinkMouseLeave(TObject *Sender)
{

if(!m_bHyperLinked)// 如果没有按下设置颜色和手
{
lbHyperLink->Font->Color = clBlue;// 设置字体颜色为蓝色
}

}
//---------------------------------------------------------------------------
// 鼠标弹起。
//
void __fastcall TfrmHyperLink::lbHyperLinkMouseUp(TObject *Sender,

TMouseButton Button, TShiftState Shift, int X, int Y)
{

lbHyperLink->Font->Color = clFuchsia;// 设置字体颜色为粉红色
}
//---------------------------------------------------------------------------
// 鼠标按下。
//
void __fastcall TfrmHyperLink::lbHyperLinkMouseDown(TObject *Sender,

TMouseButton Button, TShiftState Shift, int X, int Y)

{
String strUrl = lbHyperLink->Caption; //("
www.yahoo.com");
m_bHyperLinked = true;
ShowMessage(" 你已经按下连接");
//打开网站连接。
ShellExecute(NULL,"open",strUrl.c_str(),NULL,NULL,SW_SHOWNORMAL);

}
//---------------------------------------------------------------------------

实例4 创建不规则窗口界面

实例目标

本例实现的目标是实现如右边界面。这个是一个不规则窗口界面,跟普通那种窗口相比,
具有尝心悦目感觉。

实现技术

在这个例子中关键是区域API 使用。CreatePolygonRgn API 函数是用来创建多边形的
区域。SetWindowRgn API 函数是用来设置窗口的区域。

实现步骤

第一步,先创建一组图像区域要用的数组。
第二步,加载图像,读入区域组,然后根据数组设置图像的区域,然后显示出来。第三步,
就响应鼠标消息。
主要源程序如下:

//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)

: TForm(Owner)
{

m_nMouseOnMe = -1;
}
//---------------------------------------------------------------------------
//

//创建窗口时,创建图像对象。

//
void __fastcall TMainForm::FormCreate(TObject *Sender)
{

pBitmap = new Graphics::TBitmap;// 用来加载背景图像。
text = new Graphics::TBitmap;// 用来加载文字图像。
minimize= new Graphics::TBitmap;// 用来加载最小化图像。
close = new Graphics::TBitmap;// 用来加载关闭图像
help = new Graphics::TBitmap;// 用来加载帮助图像

pBitmap->LoadFromFile("sat_dish.bmp");// 加载背景图像。
text->LoadFromFile("text.bmp");// 加载文字图像
minimize->LoadFromFile("minimize.bmp");// 加载最小化图像。
close->LoadFromFile("close.bmp");// 加载关闭图像
help->LoadFromFile("help.bmp");// 加载帮助图像

pBitmap->Height = 520;// 设置背景显示高度。
pBitmap->Width = 520;// 设置背景显示宽度。

Count = -1;// 区域有多少个点。

oldX = 0;
oldY = 0;

Moving = false;// 是否能移动。
tempRgn = SKIN;// 设置为多边形区域显示方式。

LoadPath("Contour.txt");// 读入多边形数组。

SetRegion(SKIN);// 设置区域。
}
//---------------------------------------------------------------------------

// 显示背景图像。

//
//
/* BOOL BitBlt(

HDC hdcDest, // 指目标DC
int nXDest, // x-coord of destination upper-left corner
int nYDest, // y-coord of destination upper-left corner

int nWidth, // width of destination rectangle
int nHeight, // height of destination rectangle
HDC hdcSrc, // handle to source DC
int nXSrc, // x-coordinate of source upper-left corner
int nYSrc, // y-coordinate of source upper-left corner
DWORD dwRop // raster operation code
);

*/
void __fastcall TMainForm::FormPaint(TObject *Sender)
{

Source = pBitmap->Canvas->Handle;// 取得图像句柄。
Destination = MainForm->Canvas->Handle;// 取得窗口句柄。
BitBlt(Destination,0,0,520,520,Source,0,0,SRCCOPY);// 显示图像在窗口里。

}
//---------------------------------------------------------------------------
// 读入区域多边形数组。
//
//
void __fastcall TMainForm::LoadPath(AnsiString FileName)
{

FILE *fp = NULL;
TPoint Point;
AnsiString Error;
if((fp = fopen(FileName.c_str(),"r"))==NULL)// 打开文件。
{

Error="Error opening file:"+FileName+".";// 出错提示信息。
MessageBox(MainForm->Handle,Error.c_str()," 区域API 界面程序
",MB_TASKMODAL);
Application->Terminate();
}

while( !( feof( fp ) ) )// 读入数据。

{
fscanf(fp,"%d",&Point.x);// 以地十进制读入区域坐标。
fscanf(fp,"%d",&Point.y);
Path[++Count] = Point;// 保存到数组。

}

fclose(fp);//关闭文件。
}
//---------------------------------------------------------------------------
// 调用CreatePolygonRgn API 函数来创建区域。
// 如果Mode==SKIN 就是创建多边形的区域。
// 如果Mode==FORM 就是创建矩形的区域。
//

//---------------------------------------------------------------------------
void __fastcall TMainForm::SetRegion(int Mode)
{

HRGN Rgn = NULL;
if(Mode == SKIN)// 创建多边形的区域
{

Rgn = CreatePolygonRgn(&Path[0],Count,ALTERNATE);

SetWindowRgn(MainForm->Handle,Rgn,true);
}
else if(Mode == FORM)// 创建矩形的区域
{

Rgn = CreateRectRgn(0,0,MainForm->Width,MainForm->Height);

SetWindowRgn(MainForm->Handle,Rgn,true);
}
DeleteObject(Rgn);
MainForm->OnPaint(NULL);

}
//---------------------------------------------------------------------------
//响应窗口鼠标按下事件。
//
void __fastcall TMainForm::FormMouseDown(TObject *Sender,

TMouseButton Button, TShiftState Shift, int X, int Y)

{
if(Button == mbRight)// 如果为右键,就是移动窗口。
{

//记录当前位置。
oldX = X;
oldY = Y;
//设置移动为true.
Moving = true;

//设置鼠标为响四周可以移动图标。

MainForm->Cursor = crSizeAll;
};

if(Button == mbLeft)// 如果为左键,检查是否各种功能。

{
if(Hover(X,Y)==_TEXT)// 区域切换。
{

if(tempRgn==SKIN)

{
SetRegion(FORM);
tempRgn=FORM;

}
else

{
SetRegion(SKIN);
tempRgn=SKIN;

}
}
else if(Hover(X,Y) == CLOSE)// 关闭

Application->Terminate();
else if(Hover(X,Y) == MINIMIZE)// 最小化。
MainForm->FormClick(NULL);
else if(Hover(X,Y) == HELP)// 打开帮助
Help();

};//if(Button==mbLeft)
}
//---------------------------------------------------------------------------
// 当鼠标移动时响应。
//
void __fastcall TMainForm::FormMouseMove(TObject *Sender,

TShiftState Shift, int X, int Y)

{
curentX=X;// 保存当前坐标。
curentY=Y;

if(Moving)// 是移动

{
MainForm->Left += (X-oldX);// 取得按右键时鼠标移动大小。
MainForm->Top += (Y-oldY);

}
else
{

MouseOnMe(X,Y);
};//else

}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormMouseUp(TObject *Sender,

TMouseButton Button, TShiftState Shift, int X, int Y)

{
if(Button==mbRight)// 当右键弹起时,移动结束。
{

Moving = false;

MainForm->Cursor = crDefault;
}
MainForm->OnPaint(NULL);

}

//---------------------------------------------------------------------------
// 判断鼠标是否在按钮上面.
//---------------------------------------------------------------------------
#pragma warn -rvl
int __fastcall TMainForm::Hover(int X,int Y)
{

if((X>170) && (X<350) && (Y>240) && (Y<270)) return _TEXT;
if((X>340) && (X<375) && (Y>105) && (Y<115)) return MINIMIZE;
if((X>305) && (X<350) && (Y>60) && (Y<105)) return CLOSE;
if((X>315) && (X<345) && (Y>365) && (Y<395)) return HELP;

}
//---------------------------------------------------------------------------
//当单击窗体时响应.
//
void __fastcall TMainForm::FormClick(TObject *Sender)
{

if(Hover(curentX,curentY) == MINIMIZE)// 如果是最小化.

Application->Minimize();
}
//---------------------------------------------------------------------------
// 打开帮助.
//---------------------------------------------------------------------------
void __fastcall TMainForm::Help(void)
{

ShowMessage(" 打开帮助文档!");
}
//---------------------------------------------------------------------------
//
//
void __fastcall TMainForm::MouseOnMe(int X, int Y)
{

Destination = MainForm->Canvas->Handle;// 取得窗口句柄。
if(Hover(X,Y) == _TEXT)// 当在Skin/Form 上面
{

Source = text->Canvas->Handle;
BitBlt(Destination,170,240,2*180,2*30,Source,0,0,SRCCOPY);
MainForm->Cursor = crHandPoint;

}
else if(Hover(X,Y) == MINIMIZE)// 当在最小化按钮上面
{

Source=minimize->Canvas->Handle;
BitBlt(Destination,340,105,35,10,Source,0,0,SRCCOPY);
MainForm->Cursor = crHandPoint;

}

else if(Hover(X,Y)==CLOSE)// 当在关闭按钮上面

{
Source=close->Canvas->Handle;
BitBlt(Destination,305,60,45,45,Source,0,0,SRCCOPY);
MainForm->Cursor = crHandPoint;

}
else if(Hover(X,Y)==HELP)// 当在帮助按钮上面。
{

Source=help->Canvas->Handle;
BitBlt(Destination,315,365,30,30,Source,0,0,SRCCOPY);
MainForm->Cursor = crHandPoint;

}
else// 不在任何按钮上面。
{

MainForm->Cursor = crDefault;
MainForm->OnPaint(NULL);
}
}

实例5 创建可扩展对话框界面

实例目标

实现目标就是可以扩展的对话框,跟QQ 的对话一样。对于一个复杂的对话框而言,大
家都想能够简洁明快的解决方法。有时候一些控件被频繁地使用,而另外一些很少使用。这
时,如果提供一种可收缩的解决方案,来扩展或者收缩对话框,使一些常用的控件处于可见
状态,而另外一些处于不可见状态,一旦需要时,就可点击按钮打开这些控件。如下图所标:

实现技术

实现关键技术主要用到
SetWindowPos API 函数,设置了两次显
示窗口的大小不一样。SetWindowPos
API 函数参数说明如下:
BOOL SetWindowPos(

HWND hWnd, // 指向窗口的

句柄

HWND hWndInsertAfter, // 窗

口显示顺序
int X, // 水平方向坐标
int Y, // 垂直方向坐标
int cx, // 宽度
int cy, // 高度
UINT uFlags // 指明那些功能不用

);

实现步骤

第一步建窗口和控件。
第二步在下面的函数添加代码。

//---------------------------------------------------------------------------
__fastcall TfrmExpendDialog::TfrmExpendDialog(TComponent* Owner)
: TForm(Owner)
{

m_bExpend = true;// 初始化为最小对话框。
}
//---------------------------------------------------------------------------
//
//
void __fastcall TfrmExpendDialog::FormShow(TObject *Sender)
{

m_nWidth = frmExpendDialog->Width;// 保存窗口的宽度
m_nHeigh = frmExpendDialog->Height;// 保存窗口的高度
btnExpendClick(this);// 设置为最小的对话框。

}

//---------------------------------------------------------------------------
//
//
void __fastcall TfrmExpendDialog::btnExpendClick(TObject *Sender)
{

m_bExpend = !m_bExpend;// 交替变化。
if( m_bExpend )
{ //扩展对话框。

SetWindowPos( frmExpendDialog->Handle,NULL,
0,0,m_nWidth,m_nHeigh,
SWP_NOMOVE | SWP_NOZORDER);

}
else
{

int nHeigh = btnExpend->Top + btnExpend->Height + 25;//
//缩小对话框。
SetWindowPos( frmExpendDialog->Handle,NULL,

0,0,m_nWidth,nHeigh,
SWP_NOMOVE | SWP_NOZORDER);

}
}
//---------------------------------------------------------------------------
//
//
void __fastcall TfrmExpendDialog::btnCancleClick(TObject *Sender)
{

Close();// 关闭窗口。
}
//---------------------------------------------------------------------------

抱歉!评论已关闭.