1
实例 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);
2
Canvas->MoveTo(x1,y1);//移到 x1,y1 位置。
Canvas->LineTo(x2,y2);//从当前位置画直线到 x2,y2.
}
}
实现步骤
实现步骤很简单,用
CB6.0
创建一个应用程序,把它保存为
exp1
。然后设置窗口的背
影颜色为 clNone,设置 FormPaint 事件函数,并加入以上代码就行了。
3
实例 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;
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);//让窗口缺省消息处理函数处理。
}