CDialog重写
我把边框全部都贴图了, 上面左右二个角(系统本身已经圆角了), 但底下二个边角, 用什么处理?我用以下二种方法都行不通:
1、使用SetWindowRgn, 会导致我的窗口不能拉大拉小了.
2、我把下面二个角的颜色过虐掉就会是黑色的区域.请教各位高手,还有什么好的处理方法,把下面二个角给处理掉?
我把边框全部都贴图了, 上面左右二个角(系统本身已经圆角了), 但底下二个边角, 用什么处理?我用以下二种方法都行不通:
1、使用SetWindowRgn, 会导致我的窗口不能拉大拉小了.
2、我把下面二个角的颜色过虐掉就会是黑色的区域.请教各位高手,还有什么好的处理方法,把下面二个角给处理掉?
解决方案 »
- combobox的dropdown窗口的问题
- 字符串处理请教,100分.
- connect中调用onaccept是怎么回事?
- 求和问题,在求空记录的和时出现问题
- 咨询:char* FCS和char *FCS有什么区别?
- 如何得到RichEditView的派生类的编辑区并新增一行文本,新增文字的字体和背景颜色可设置。
- 200分!求一段能进入系统0级的代码!
- 在学习MFC开发,以前是用DELPHI的,但学了几周了,还是没有入门,自己也不认识搞VC的朋友
- 小弟想要修改系统时间,没想到报了一大堆错,各位好心的哥哥姐姐帮我看看吧!
- 一个有关LISTVIEW的小问题,高手来啊!!!!!!!!!!
- 如何将VC编写的DLL工程移植到UNIX环境下去?
- 关于wmplayer控件和MCI的问题,请大家帮忙,谢谢。
2.设定了RGN以后 自己手动设定窗口调整大小的热区即可。
3.没有找到具体的例子 但是楼主可以参考http://www.vckbase.com/document/viewdoc/?id=317
代码中的OnNcMouseMove中的处理过程。
如有必要,可响应WM_NCHITTEST消息,判断鼠标在左下角时返回HTBOTTOMLEFT,右下角时返回HTBOTTOMRIGHT。
拉大拉小的时候,只有图片在动, 窗口就不会变大变小了.你指的第2点是怎么回事?你说的第3点,我这程序中都有.
设定一个成员变量 CRect WinRn; 来标明你窗口的大小
通过WinRn 创建一个圆角矩形区域 CRgn rndRgn; 在OnPaint中用SetWindowRgn设定窗口为rndRgn形状。在WinRn中 通过计算 确定窗体标题栏位置 各个顶点的响应拉伸的热区 也就是正常情况下 鼠标到了那个位置会变形 标示可以拉伸窗口的地方。通过对鼠标事件的处理来 重新设定 WinRn的大小 不就实现了不规则窗体拉伸么
去下载那个Dialog源码,然后把里面CTitleBarDlg下添加下面的代码:
void CTitleBarDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy); CRect winRT;
AfxGetMainWnd()->GetWindowRect(&winRT); CDC* pDC = GetWindowDC();
CRgn hRgn1;
pDC->BeginPath();
pDC->RoundRect( 0,0,winRT.Width(),winRT.Height(),50,50); //将窗体设定为圆角矩形 50是圆角矩形 圆角的半径(可以是椭圆的长轴和短轴 数值不一定相同)
pDC->CloseFigure();
pDC->EndPath();
hRgn1.CreateFromPath(pDC);
SetWindowRgn((HRGN)hRgn1.m_hObject,TRUE);
}UINT CTitleBarDlg::OnNcHitTest(CPoint point)
{
CRect lT; //重新设定四个顶点对应的热区
CRect lB;
CRect rT;
CRect rB; CRect rtWnd;
AfxGetMainWnd()->GetWindowRect(&rtWnd); lT.left = rtWnd.left; //重新设定四个顶点对应的热区 热区具体设定成什么样子 要根据楼主的情况自己设定
lT.top = rtWnd.top;
lT.bottom = rtWnd.top+50;
lT.right = rtWnd.left+50; lB.left = rtWnd.left;
lB.top = rtWnd.bottom - 50;
lB.bottom = rtWnd.bottom;
lB.right = rtWnd.left+50; rT.left = rtWnd.right - 50;
rT.top = rtWnd.top;
rT.bottom = rtWnd.top+50;
rT.right = rtWnd.right;
rB.left = rtWnd.right - 50;
rB.top = rtWnd.bottom - 50;
rB.bottom = rtWnd.bottom;
rB.right = rtWnd.right; if( lT.PtInRect( point ) )
{
return HTTOPLEFT;
}
if( lB.PtInRect( point ) )
{
return HTBOTTOMLEFT;
}
if( rT.PtInRect( point ) )
{
return HTTOPRIGHT;
}
if( rB.PtInRect( point ) )
{
return HTBOTTOMRIGHT;
}
return CDialog::OnNcHitTest(point);
}不多解释了 一看就知道是怎么回事了, 能实现你说的效果。
我前面说的 以及满天星说的 都是对的 唯一一点不同的是 不是OnPaint 而是OnSize里面。我们都没有现成的程序 回答问题总不能面面俱到
没办法 去试验了一下 是可以的。 效果:上面这个效果就是拖动了右下的热区后得到的。
我缺的就是OnSize里面的这一段圆角的.其他的我都不需要, 我已经搞定了,谢谢.!
以前都是用贴图实现的,现在可以用SetWindowRgn api了
学习了。。