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

Visual C++编程技巧(中)

51自学网 2015-08-30 http://www.wanshiok.com

25、如何获取有关窗口正在处理的当前消息的信息

调用CWnd: : GetCurrentMessage可以获取一个MSG指针。例如,可以使用

ClassWizard将几个菜单项处理程序映射到一个函数中,然后调用GetCurrentMessage

来确定所选中的菜单项。

viod CMainFrame : : OnCommmonMenuHandler ( )

{

//Display selected menu item in debug window .

TRACE ("Menu item %u was selected . /n" ,

GetCruuentMessage ( ) —> wParam );

}

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

可以使用新的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 ( );

}

}

<

 

 

 
说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
上一篇:Visual&nbsp;C++编程技巧(上)  下一篇:Visual&nbsp;C++编程技巧(下)