0
CCC++++++ BBBuuuiiillldddeeerrr 666...000 界界界 面面面 实实实 例例例 开开开 发发发
2002-11-25 深 圳
蔡军 生
caimouse1976@sina.com
界 面 图 案 演 示
创 建 标 题 栏 在左边 的 窗 口 界 面
创 建 超 级 连 接界 面
创 建 不 规 则 窗口界 面
创 建 可 扩 展 对话框 界 面
创 建 NEO Skin 窗 口 界 面
创 建 Windows2000 透 明 窗 口 界 面
实 例 1
实 例 2
实 例 3
实 例 4
实 例 5
实 例 6
实 例 7
实 例 8
实 例 9
创 建 自 画 弹 出式菜 单 界 面
创 建 自 画 主 菜单界 面
实 例 10
创建 自 画 窗 口 背 景 界 面
1
实 例 1
界 面 图 案 演 示
主要 用两函 数
clNone。
本实例 作 来本书 的 第一个 实 例,主 要 让大家 轻松地 学习本 书,让大家 先有一 个感觉, 编
MoveTo 和 LineTo 实现。 设 置窗口 的颜色 为
实例目 标
程其实 是 一个很 美 的事情 。
实现技 术
代码如 下 :
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
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);
在 math.h 里 。
2
移 到 x1,y1 位置 。
从当 前位置 画 直线 到
x2,y2.
exp1。然后设置窗 口的 背
CB6.0 创建 一 个应用 程 序,把 它保存 为
clNone, 设 置 FormPaint 事 件 函数, 并 加入以 上代码 就 行了 。
实现步 骤 很简单 , 用
Canvas->MoveTo(x1,y1);//
Canvas->LineTo(x2,y2);//
}
}
实现步 骤
影颜色 为
3
实 例 2
创 建 标 题 栏 在 左 边 的窗口 界 面
实例目 标
实现 左边标 题 , 能
拖 动 的窗 口 。如 下
图所 示 :
FormPaint(TObject *Sender)函数里面画上 标 题和 边
指 明 窗 口 BorderStyle 为 bsNone, 这 样 就 不 能 拉 伸 窗 , 没 有标题 和 边
实现技 术
框 。 第 二
第一步 先
框 。这 个函 数 响 应 消 息 OnPaint,
步就 是 在
当 出 现 重 画 窗 口 时 调 用 。 第 三 步就 是 响 应 WM_NCHITTEST 消 息 , 以 便 拖 动 窗口 。 当 返 回
这 个 消 息 的 结 果 为 HTCAPTION 时 , WINDOWS 就 认 为 鼠 标在标 题
框 内 , 所 以 能 拖 动 窗 口
移 动 。
实现步 骤
第一步 创 建程序 , 在
第 二 步 添 加 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;
Object Inspector 中 设 置 BorderStyle 为 bsNone。
4
。
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);//
}
返 回 在标 题 栏内 结 果 。
框 内 。
让 窗 口 缺 省消息 处 理
函 数 处 理 。
5
实 例 3
创建 超 级 连 接 界 面
本实 例 介 绍 如 何 创 建 的 热 点连接 (
实例目 标
单 击 超级连 接
时 , 就 会变成 绿
的 Internet 资 源 。 如 果热 点 为 粉 红 色 , 表 示 已 经 访 问 过 , 程序的 界 面如下 :
hotlink), 该连接 指 向
的 文 本 。 该热 点 连接初 始
且 鼠 标 变 为 小手形 状
, 当 点击 这些热点连接 时
, 就 可 以 打开连 接
色, 并
一 定 的 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;//
}
}
//---------------------------------------------------------------------------
// 鼠 标 离 开 响 应 。
设 置 字 体 颜 色 为 绿 色 。
手
6
手
设 置 字 体 颜 色 为 蓝 色
//
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);
}
//---------------------------------------------------------------------------
下 连 接 ");
7
实 例 4
创 建 不 规 则 窗 口界 面
实例目 标
本例实 现 的
目 标 是 实现 如 右 边界 面 。 这 个 是一 个 不 规 则 窗口界面 ,
跟普 通 那 种 窗 口 相 比 ,
具 有 尝 心 悦 目 感 觉 。
实现技 术
区 域 。 SetWindowRgn API 函数 是 用来设 置窗口 的
实现步 骤
第 二 步, 加 载 图 像 , 读 入 区 域 组 ,然 后 根 据 数 组 设 置 图 像 的 区 域 , 然 后 显 示 出 来。 第 三 步 ,
就 响 应 鼠 标 消 息 。
主 要 源 程 序如下 :
在 这 个 例 子 中 关 键 是 区 域 API 使 用 。 CreatePolygonRgn API 函数 是 用来创 建
组 图 像区 域 要用的 数
第一 步,先 创 建 一
多 边 形 的
区 域 。
组 。
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)