设为首页 加入收藏

TOP

1.10 开发技巧与难点分析(1)
2013-10-07 00:18:26 来源: 作者: 【 】 浏览:64
Tags:1.10 开发 技巧 难点 分析

1.10  开发技巧与难点分析(1)

如今的应用软件不但只限于满足用户需求,而且还具有漂亮、灵活的程序界面。可以采用绘图的方式来设计程序界面,从而实现这些要求。将界面划分为多个组成部分,每一部分由相应的图片构成,然后将图片绘制在界面的各个组成部分中。为了在对话框调整大小时能够保持界面的风格,需要在对话框大小改变时重新确定对话框各组成部分的大小。这种方式能够使程序界面具有极大的灵活性。

下面来看一下具体的操作步骤:

(1)在主窗口的头文件中添加变量,记录对话框的标题信息、边框高度、宽度、标题栏、标题栏按钮的显示区域等信息。代码如下:

 CBitmap      m_BKGround;        //声明CBitmap类型变量
CString       m_Caption;           //对话框标题
int           m_BorderWidth;       //边框宽度
int           m_BorderHeight;      //边框高度
int           m_FrameWidth ;       //窗体3D宽度
int           m_FrameHeight;       //窗体3D高度
int           m_CaptionHeight;       //标题栏的高度
int           m_TitleDrawHeight;      //标题栏实际的绘制高度
int           m_ButtonWidth;       //按钮位图宽度
int           m_ButtonHeight;       //按钮位图高度
COLORREF   m_CapitonColor;       //标题字体颜色
CFont         m_CaptionFont;       //标题字体
(2)定义一些宏,用于标识绘制窗口的哪一部分。代码如下:
#define FLEFTBAR         1      //左边框
#define FLEFTTITLE        2      //左标题
#define FRIGHTTITLE      4      //右标题
#define FMIDTITLE         8      //中间标题
#define FRIGHTBAR        16       //右边框
#define FBOTTOMBAR     32       //底边框
#define FMINBUTTON      64       //最小化按钮
#define FMAXBUTTON     128      //最大化按钮
#define FCLOSEBUTTON   256      //关闭按钮
#define FALL              511      //所有标识
#define MAXNUM          100
(3)在对话框初始化时初始化对话框的边框高度、宽度等信息,并设置标题栏显示文本及字体。代码如下:
//加载背景位图
m_BKGround.LoadBitmap(IDB_BKGROUND);
m_BorderHeight  = GetSystemMetrics(SM_CYBORDER);      //尺寸
不可变的边框高度
m_BorderWidth   = GetSystemMetrics(SM_CXBORDER);      //尺寸
不可变的边框宽度
m_CaptionHeight = GetSystemMetrics(SM_CYCAPTION);      //窗口
标题的高度
SetWindowText(m_Caption);                             //设置窗体标题
m_CaptionFont.CreateFont(14,10,0,3,600,0,0,0,ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_ROMAN,"宋体");  //创建
窗体标题字体
CBitmap bitmap;
bitmap.LoadBitmap(IDB_MINBT);          //加载位图资源
BITMAPINFO bInfo;
bitmap.GetObject(sizeof(bInfo),&bInfo);
m_ButtonWidth = bInfo.bmiHeader.biWidth;
m_ButtonHeight = bInfo.bmiHeader.biHeight;
bitmap.DeleteObject();             //释放环境
(4)向对话框中添加自定义函数DrawDialog,用于绘制对话框的各个部分。代码如下:
 void CCaptureDlg::DrawDialog(UINT Flags)
{
//获得边框信息
m_FrameHeight  = GetSystemMetrics(SM_CYFIXEDFRAME);
m_BorderHeight  = GetSystemMetrics(SM_CYBORDER);  
m_FrameWidth  = GetSystemMetrics(SM_CXFIXEDFRAME);
m_BorderWidth  = GetSystemMetrics(SM_CXBORDER); 
m_CaptionHeight = GetSystemMetrics(SM_CYCAPTION);   //窗口标题高度
CRect Clientrect;
GetClientRect(Clientrect);         //获得客户区域
CRect WinRC,FactRC;
GetWindowRect(WinRC);
FactRC.CopyRect(CRect(0,0,WinRC.Width(),WinRC.Height()));
CWindowDC WindowDC(this);        //获取窗口设备上下文
CBitmap LeftLine,*OldObj;
BITMAPINFO bitinfo; 
CDC memDC;
memDC.CreateCompatibleDC(&WindowDC);
int leftwidth   = 0;          //左标题的宽度
int rightwidth  = 0;          //右标题的宽度
int leftlinewidth = 0;          //窗体边框和3D宽度
int rLineWidth;
int bLineHeight;
DeleteObject(LeftLine);
LeftLine.LoadBitmap(IDB_RIGHTTITLE);     //加载右标题
LeftLine.GetObject(sizeof(bitinfo),&bitinfo);
rightwidth = bitinfo.bmiHeader.biWidth;
LeftLine.Detach();
int x,y;
//……此处代码省略
CPoint pos(30,1);
m_MinRect.CopyRect(CRect(m_RTitleRc.left+pos.x,
(m_TitleDrawHeight+2*m_BorderHeight
-m_ButtonHeight)/2+pos.y,m_ButtonWidth,m_ButtonHeight));  
//最小化按钮区域
pos.x = 55;  
m_MaxRect.CopyRect(CRect(m_RTitleRc.left+pos.x,
(m_TitleDrawHeight+2*m_BorderHeight
-m_ButtonHeight)/2+pos.y,m_ButtonWidth,m_ButtonHeight));  
//最大化按钮区域
pos.x = 80;
m_CloseRect.CopyRect(CRect(m_RTitleRc.left+pos.x,
(m_TitleDrawHeight+2*m_BorderHeight
-m_ButtonHeight)/2+pos.y,m_ButtonWidth,m_ButtonHeight));  
//关闭按钮区域
//……此处代码省略
LeftLine.DeleteObject();
memDC.DeleteDC();
DrawCaption();
}
(5)在自定义函数DrawDialog中添加代码,用于绘制对话框的左边线。代码如下:
if(Flags & FLEFTBAR)            //绘制左边线
{
DeleteObject(LeftLine);
LeftLine.LoadBitmap(IDB_LEFTBAR);       //加载左边框位图资源
LeftLine.GetObject(sizeof(bitinfo),&bitinfo);
x = bitinfo.bmiHeader.biWidth;         //获取位图宽
y = bitinfo.bmiHeader.biHeight;         //获取位图高
OldObj = memDC.SelectObject(&LeftLine);
//判断位图的宽度与窗体边缘的宽度
leftlinewidth = (x> m_FrameWidth+m_BorderWidth) x:m_FrameWidth+m_BorderWidth;
WindowDC.StretchBlt(0,m_CaptionHeight,leftlinewidth,
FactRC.Height()-m_CaptionHeight,&memDC,0,0,x,y,SRCCOPY);  //绘制左边框
memDC.SelectObject(OldObj);
LeftLine.Detach();
}
(6)在自定义函数DrawDialog中添加代码,用于绘制对话框的左边标题。代码如下:
 if(Flags & FLEFTTITLE)            //绘制左标题
{
DeleteObject(LeftLine);
LeftLine.LoadBitmap(IDB_LEFTTITLE);       //加载左标题位图资源
//获取位图大小
LeftLine.GetObject(sizeof(bitinfo),&bitinfo);
OldObj = memDC.SelectObject(&LeftLine);
leftwidth = x = bitinfo.bmiHeader.biWidth;       //获取位图宽
y = bitinfo.bmiHeader.biHeight;              //获取位图高
m_TitleDrawHeight = (m_CaptionHeight+4 > y) m_CaptionHeight+4 : y;  //
计算标题的高度
m_LTitleRc.CopyRect(CRect(0,0,x,m_TitleDrawHeight));            //左标题区域
WindowDC.StretchBlt(m_LTitleRc.left,m_LTitleRc.top,m_LTitleRc.Width(),
m_LTitleRc.Height(),&memDC,0,0,x,y,SRCCOPY);     //绘制左标题
memDC.SelectObject(OldObj);
LeftLine.Detach();
}
【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇1.10 开发技巧与难点分析(2) 下一篇1.8.1 无人广角自动监控模块概述

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: