AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

如何创建一个不规则形状的窗口

51自学网 2015-08-30 http://www.wanshiok.com
可以使用新的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 todraw 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-rightcorner 
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 thewindow . 
UINT nHitTest = CDialog : : OnNcHitTest (point) 
rerurn (nHitTest = = HTCLIENT)? HTCAPTION: nHitTest 
}

 

 

 
说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
上一篇:得到托盘区位置与动态显示/隐藏窗口  下一篇:谈VC++中的Progress控件的使用