请问如何在VC++ 6.0中实现不规则窗口?谢谢!

Per 2000-06-05 02:06:00
...全文
306 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
SeaBirds 2001-05-25
  • 打赏
  • 举报
回复
看到各位高手们说了这么多,难道没有哪位愿意把此类操作做成一个类吗?提供一个CPP和一个H文件,最好把动态加载相应图片及自动处理rgn、透明的功能加在里面,那不是方便多啦????

不知哪位有这样的东东,发一个给我吧,谢谢
Per 2000-06-07
  • 打赏
  • 举报
回复
谢谢大家的指教!
seaskyfox 2000-06-06
  • 打赏
  • 举报
回复
借助CWnd类的SetWindowRgn函数可以创建不规则形状窗口。
函数原型int SetWindowRgn( HRGN hRgn, // 窗口区域句柄
BOOL bRedraw ); // 是否重画窗口
CRgn类封装了关于区域的数据和操作。通过(HRGN)强制操作可以从CRgn类中取得其HRGN值。CRgn提供了CreateRectRgn、CreateEllipticRgn和CreatePolygonRgn成员函数,
分别用以创建矩形、(椭)圆形和多边形区域。

创建非矩形窗口的方法
在窗口类中定义区域类成员数据(如CRgn m_rgnWnd);
在窗口的OnCreate函数或对话框的OnInitDialog函数中调用CRgn类的CreateRectRgn、CreateEllipticRgn或CreatePolygonRgn函数创建所需的区域,并调用SetWindowRgn函数。
zhaohang 2000-06-06
  • 打赏
  • 举报
回复
可以使用新的SDK函数SetWindowRgn。该函数将绘画和鼠标消息限定在窗口的一
个指定的区域,实际上使窗口成为指定的不规则形状。
使用AppWizard创建一个基于对的应用程序并使用资源编辑器从主对话资源中删
除所在的缺省控件、标题以及边界。
给对话类增加一个CRgn数据成员,以后要使用该数据成员建立窗口区域。
Class CRoundDlg : public CDialog
{

private :
Crgn m_rgn : // window region

} ;
修改OnInitDialog函数建立一个椭圆区域并调用SetWindowRgn将该区域分配给
窗口:
BOOL CRoundDlg : : OnInitDialog ( )
{
CDialog : : OnInitDialog ( ) ;

//Get size of dialog .
CRect rcDialog ;
GetClientRect (rcDialog );

// Create region and assign to window .
m_rgn . CreateEllipticRgn (0 , 0 , rcDialog.Width ( ) , rcDialog .Height ( ) );
SetWindowRgn (GetSafeHwnd ( ) , (HRGN) m_ rgn , TRUE );

return TRUE ;
}
通过建立区域和调用SetWindowRgn,已经建立一个不规则形状的窗口,下面的例
子程序是修改OnPaint函数使窗口形状看起来象一个球形体。
voik CRoundDlg : : OnPaint ( )
{
CPaintDC de (this) ; // device context for painting .
//draw ellipse with out any border
dc. SelecStockObject (NULL_PEN);

//get the RGB colour components of the sphere color
COLORREF color= RGB( 0 , 0 , 255);
BYTE byRed =GetRValue (color);
BYTE byGreen = GetGValue (color);
BYTE byBlue = GetBValue (color);

// get the size of the view window
Crect rect ;
GetClientRect (rect);

// get minimun number of units
int nUnits =min (rect.right , rect.bottom );

//calculate he horiaontal and vertical step size
float fltStepHorz = (float) rect.right /nUnits ;
float fltStepVert = (float) rect.bottom /nUnits ;

int nEllipse = nUnits/3; // calculate how many to draw
int nIndex ; // current ellipse that is being draw

CBrush brush ; // bursh used for ellipse fill color
CBrush *pBrushOld; // previous brush that was selected into dc

//draw ellipse , gradually moving towards upper-right corner
for (nIndex = 0 ; nIndes < + nEllipse ; nIndes ++)
{
//creat solid brush
brush . CreatSolidBrush (RGB ( ( (nIndex *byRed ) /nEllipse ).
( ( nIndex * byGreen ) /nEllipse ), ( (nIndex * byBlue) /nEllipse ) ) );

//select brush into dc
pBrushOld= dc .SelectObject (&brhsh);

//draw ellipse
dc .Ellipse ( (int) fltStepHorz * 2, (int) fltStepVert * nIndex ,
rect. right -( (int) fltStepHorz * nIndex )+ 1,
rect . bottom -( (int) fltStepVert * (nIndex *2) ) +1) ;

//delete the brush
brush.DelecteObject ( );
}
}

最后,处理WM_NCHITTEST消息,使当击打窗口的任何位置时能移动窗口。
UINT CRoundDlg : : OnNchitTest (Cpoint point )
{
//Let user move window by clickign anywhere on the window .
UINT nHitTest = CDialog : : OnNcHitTest (point) ;
rerurn (nHitTest = = HTCLIENT)? HTCAPTION: nHitTest ;
}
begwolf 2000-06-06
  • 打赏
  • 举报
回复
在"编程技巧与维护"2000年第四或第一期(具体哪期我忘了)中有一文详细介绍,可供你参考学习!!
lara 2000-06-06
  • 打赏
  • 举报
回复
在Create()中调用:
CreateEx( 0, AfxRegisterWndClass(0),
pTitle,
WS_POPUP and WS_SYSMENU,
rect,
NULL,
NULL,
NULL );
SetWindowRgn((HRGN)wndRgn, TRUE);
其中,wndRgn是一个不规则的区域.
gogocat 2000-06-05
  • 打赏
  • 举报
回复
窗口可以建立在区域的基础上,所以用window里区域的概念可以实现
wolf_ 2000-06-05
  • 打赏
  • 举报
回复
到MSDN中去查CRgn(HRGN)的用法便知。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧