创建标题栏在左边的窗口界面
实例目标
实现左边标题,能拖动的窗口。如下图所示:
实现技术
第一步先指明窗口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);// 让窗口缺省消息处理函数处理。
}