VC个性化窗口界面设计
2007-06-13 16:19
405 查看
本文最新链接地址:http://lifepeak.net/it-jishu/vc-gexing-jiemian.html
在VC下有时需要制作个性化的窗口界面,用界面库又比较繁琐,而且有些界面库还必须收费才能使用,这里我提供一个简单且有效的制作个性化界面的方法。
由AppWizard向导生成一个基于对话框的应用程序框架,把对话框模板的Border属性改为none,也就是没有边框和标题栏。从CDialog派生一个类,命名为CCustomDlg。首先我们要建立不规则窗口的界面,要用到以下函数,
int SetWindowRgn( HRGN hRgn, BOOL bRedraw );
这个函数用来设置应用程序窗口的窗口区域,在本文的例子中我们使用CreateRoundRectRgn创建一个圆角矩形区域,然后再调用SetWindowRgn设置窗口区域。CreateRoundRectRgn的原型如下:
BOOL CreateRoundRectRgn( int x1, int y1, int x2, int y2, int x3, int y3 );
具体代码如下:
BOOL CCustomDlgDlg::OnInitDialog()
{
CDialog::OnInitDialog();
......
//set valid region
CRgn rgn;
CRect rectFrame;
GetClientRect(&rectFrame);
rgn.CreateRoundRectRgn(rectFrame.left,rectFrame.top,
rectFrame.right+1,rectFrame.bottom+1,30,30);
SetWindowRgn(rgn,TRUE);
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
因为对话框已经设置了none border属性,所以GetClientRect(&rectFrame)得到的就为对话框模板整个窗口大小,然后再创建圆角矩形,注意创建圆角矩形的时候要注意第三,第四个参数都要加1(后面会讲原因)。
接下来,映射WM_ERASEBKGND消息来改变背景,需手工加入ON_WM_ERASEBKGND(),同时不要忘了在头文件中加入
afx_msg BOOL OnEraseBkgnd(CDC *pDC);
编辑处理函数:
BOOL CCustomDlgDlg::OnEraseBkgnd(CDC *pDC)
{
CRect rect;
GetClientRect(&rect);
CBrush *pOldBrush = pDC->SelectObject(&m_brBrush);
pDC->RoundRect(&rect, CPoint(30,30));
pDC->SelectObject(pOldBrush);
return TRUE;
}
pDC->RoundRect(&rect, CPoint(30, 30));
默认是用黑笔画矩形,到这里应该知道上面的第三,第四个参数为什么要加1了,因为默认黑笔的宽度就为1个像素单位,RoundRect实际画出的矩形的长度和宽度都多1,大家可能会想,为什么不用rectFrame.left减1,和rectFrame.top减1这种方法呢?它也会使长度和宽度都多1啊,问题在于rectFrame.left, rectFrame.top都为0,减1就都为-1, 用CreateRoundRectRgn创建区域时值又会变为0,这样长度和宽度还是没有增加。
再接下来,加入一CBrush类型的成员变量m_brBrush,在构造函数中加入
m_brBrush.CreateSolidBrush(RGB(239,243,255));
用ClassWizard映射WM_CTLCOLOR消息,并编辑代码。作用是改变对话框中控件的颜色以使对话框背景相符,不过不能用此法改变按钮的颜色,按钮用自绘来改变颜色,这方面内容本文就不介绍了,网上有很多此类文章。
HBRUSH CCustomDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (CTLCOLOR_STATIC==nCtlColor || CTLCOLOR_DLG==nCtlColor)
{
pDC->SetBkMode(TRANSPARENT);
return m_brBrush;
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
接着,映射WM_NCHITTEST消息,需手工加入,ON_WM_NCHITTEST(),同时不要忘了在头文件加入
afx_msg UINT OnNcHitTest(CPoint point);
编辑处理函数:
UINT CCustomDlgDlg::OnNcHitTest(CPoint point)
{
UINT nHitTest = CDialog::OnNcHitTest (point);
if (nHitTest == HTCLIENT)
nHitTest = HTCAPTION;
return nHitTest;
}
这样之后就可以用鼠标拖动对话框了。
相信通过本文的讲解之后,大家可以做出自己需要的个性化界面了。有问题可以联系我哦,Email: world7th@163.com, QQ:85093103
在VC下有时需要制作个性化的窗口界面,用界面库又比较繁琐,而且有些界面库还必须收费才能使用,这里我提供一个简单且有效的制作个性化界面的方法。
由AppWizard向导生成一个基于对话框的应用程序框架,把对话框模板的Border属性改为none,也就是没有边框和标题栏。从CDialog派生一个类,命名为CCustomDlg。首先我们要建立不规则窗口的界面,要用到以下函数,
int SetWindowRgn( HRGN hRgn, BOOL bRedraw );
这个函数用来设置应用程序窗口的窗口区域,在本文的例子中我们使用CreateRoundRectRgn创建一个圆角矩形区域,然后再调用SetWindowRgn设置窗口区域。CreateRoundRectRgn的原型如下:
BOOL CreateRoundRectRgn( int x1, int y1, int x2, int y2, int x3, int y3 );
具体代码如下:
BOOL CCustomDlgDlg::OnInitDialog()
{
CDialog::OnInitDialog();
......
//set valid region
CRgn rgn;
CRect rectFrame;
GetClientRect(&rectFrame);
rgn.CreateRoundRectRgn(rectFrame.left,rectFrame.top,
rectFrame.right+1,rectFrame.bottom+1,30,30);
SetWindowRgn(rgn,TRUE);
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
因为对话框已经设置了none border属性,所以GetClientRect(&rectFrame)得到的就为对话框模板整个窗口大小,然后再创建圆角矩形,注意创建圆角矩形的时候要注意第三,第四个参数都要加1(后面会讲原因)。
接下来,映射WM_ERASEBKGND消息来改变背景,需手工加入ON_WM_ERASEBKGND(),同时不要忘了在头文件中加入
afx_msg BOOL OnEraseBkgnd(CDC *pDC);
编辑处理函数:
BOOL CCustomDlgDlg::OnEraseBkgnd(CDC *pDC)
{
CRect rect;
GetClientRect(&rect);
CBrush *pOldBrush = pDC->SelectObject(&m_brBrush);
pDC->RoundRect(&rect, CPoint(30,30));
pDC->SelectObject(pOldBrush);
return TRUE;
}
pDC->RoundRect(&rect, CPoint(30, 30));
默认是用黑笔画矩形,到这里应该知道上面的第三,第四个参数为什么要加1了,因为默认黑笔的宽度就为1个像素单位,RoundRect实际画出的矩形的长度和宽度都多1,大家可能会想,为什么不用rectFrame.left减1,和rectFrame.top减1这种方法呢?它也会使长度和宽度都多1啊,问题在于rectFrame.left, rectFrame.top都为0,减1就都为-1, 用CreateRoundRectRgn创建区域时值又会变为0,这样长度和宽度还是没有增加。
再接下来,加入一CBrush类型的成员变量m_brBrush,在构造函数中加入
m_brBrush.CreateSolidBrush(RGB(239,243,255));
用ClassWizard映射WM_CTLCOLOR消息,并编辑代码。作用是改变对话框中控件的颜色以使对话框背景相符,不过不能用此法改变按钮的颜色,按钮用自绘来改变颜色,这方面内容本文就不介绍了,网上有很多此类文章。
HBRUSH CCustomDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (CTLCOLOR_STATIC==nCtlColor || CTLCOLOR_DLG==nCtlColor)
{
pDC->SetBkMode(TRANSPARENT);
return m_brBrush;
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
接着,映射WM_NCHITTEST消息,需手工加入,ON_WM_NCHITTEST(),同时不要忘了在头文件加入
afx_msg UINT OnNcHitTest(CPoint point);
编辑处理函数:
UINT CCustomDlgDlg::OnNcHitTest(CPoint point)
{
UINT nHitTest = CDialog::OnNcHitTest (point);
if (nHitTest == HTCLIENT)
nHitTest = HTCAPTION;
return nHitTest;
}
这样之后就可以用鼠标拖动对话框了。
相信通过本文的讲解之后,大家可以做出自己需要的个性化界面了。有问题可以联系我哦,Email: world7th@163.com, QQ:85093103
相关文章推荐
- VC个性化窗口界面设计
- VC个性化窗口界面设计
- VC 界面窗口,静态分割后如何锁定分隔条或限制分隔条的移动范围
- VC界面窗口:从资源里面加载皮肤
- 解决VS2005在Winform窗体设计界面中数据源窗口灰化不显示数据源的问题
- VC++界面编程之--阴影窗口的实现详解
- VC远控(一)界面设计及套接字连接测试
- Android手机UI设计---”知乎“界面外观模仿篇(二)---在Fragment里使用自定义listview以及popupwindow弹出窗口
- DHTML设计VC界面《三》- Toolbar工具栏
- VC界面设计(破解版skin++皮肤库使用)
- 设计登陆窗口界面,当输入账号密码正确时,界面如图一所示,当输入账号密码有误时,界面如图二所示。
- 设计登陆窗口界面,当输入账号密码正确时,界面如图一所示,当输入账号密码有误时,界面如图二所示。
- 搜应用网是中国最丰富的手机资源下载站,为你提供精彩的手机图片.手机应用软件.手机游戏,定制服务手机用户的个性化需求,是广大手机用户.手机开发者.手机软件界面设计人员的广阔乐园.
- VC界面设计(破解版skin++皮肤库使用)
- [开发日记]图片抽奖软件的原型设想及界面设计-打算用PowerPoint结合Vc++完美实现 (进展一)
- VC++开发垃圾文件清理软件之三:程序的界面设计与实现----对话框界面
- 轻松实现类VC界面(窗口停靠)
- PB界面设计--使用继承创建窗口
- 基于Qt的多窗口编程A--界面的设计
- vc循序渐进实现仿QQ界面(一):圆角矩形与双缓冲贴图窗口