|
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】
|