📄 窗口控制.htm
字号:
</Br>CWnd: : PreCreateWindow并关闭FWS_ADDTOTITLE风格。<Br></Br>BOOL CMainFrame : : PreCreateWindow (CREATESTRUCT&cs)<Br></Br>{<Br></Br>//Turn off FWS_ADDTOTITLE in main frame .<Br></Br>cs.styel & = ~FWS_ADDTOTITLE ; <Br></Br>return CMDIFrameWnd : : PreCreateWindow (cs );<Br></Br>}<Br></Br>关闭MDI子窗口的FWS _ADDTOTITLE风格将创建一个具有空标题的窗口,可以调<Br></Br>用CWnd: : SetWindowText来设置标题。记住自己设置标题时要遵循接口风格指南。<Br></Br></Br></p></td></tr><tr><td><font color="0000FF"><a name="14">如何创建一个不规则形状的窗口 </a></font></td></tr><tr><td><p></Br>可以使用新的SDK函数SetWindowRgn。该函数将绘画和鼠标消息限定在窗口的一<Br></Br>个指定的区域,实际上使窗口成为指定的不规则形状。<Br></Br>使用AppWizard创建一个基于对的应用程序并使用资源编辑器从主对话资源中删<Br></Br>除所在的缺省控件、标题以及边界。<Br></Br>给对话类增加一个CRgn数据成员,以后要使用该数据成员建立窗口区域。<Br></Br>Class CRoundDlg : public CDialog<Br></Br>{<Br></Br>…<Br></Br>private :<Br></Br>Crgn m_rgn : // window region<Br></Br>…<Br></Br>} ;<Br></Br>修改OnInitDialog函数建立一个椭圆区域并调用SetWindowRgn将该区域分配给<Br></Br>窗口:<Br></Br>BOOL CRoundDlg : : OnInitDialog ( )<Br></Br>{<Br></Br>CDialog : : OnInitDialog ( ) ;<Br></Br>//Get size of dialog .<Br></Br>CRect rcDialog ;<Br></Br>GetClientRect (rcDialog );<Br></Br>// Create region and assign to window .<Br></Br>m_rgn . CreateEllipticRgn (0 , 0 , rcDialog.Width ( ) , rcDialog .Height ( ) );<Br></Br>SetWindowRgn (GetSafeHwnd ( ) , (HRGN) m_ rgn , TRUE );<Br></Br>return TRUE ;<Br></Br>}<Br></Br>通过建立区域和调用SetWindowRgn,已经建立一个不规则形状的窗口,下面的例<Br></Br>子程序是修改OnPaint函数使窗口形状看起来象一个球形体。<Br></Br>voik CRoundDlg : : OnPaint ( )<Br></Br>{<Br></Br>CPaintDC de (this) ; // device context for painting .<Br></Br>//draw ellipse with out any border<Br></Br>dc. SelecStockObject (NULL_PEN);<Br></Br>//get the RGB colour components of the sphere color<Br></Br>COLORREF color= RGB( 0 , 0 , 255);<Br></Br>BYTE byRed =GetRValue (color);<Br></Br>BYTE byGreen = GetGValue (color);<Br></Br>BYTE byBlue = GetBValue (color);<Br></Br>// get the size of the view window<Br></Br>Crect rect ;<Br></Br>GetClientRect (rect);<Br></Br>// get minimun number of units<Br></Br>int nUnits =min (rect.right , rect.bottom );<Br></Br>//calculate he horiaontal and vertical step size<Br></Br>float fltStepHorz = (float) rect.right /nUnits ;<Br></Br>float fltStepVert = (float) rect.bottom /nUnits ;<Br></Br>int nEllipse = nUnits/3; // calculate how many to draw<Br></Br>int nIndex ; // current ellipse that is being draw<Br></Br>CBrush brush ; // bursh used for ellipse fill color<Br></Br>CBrush *pBrushOld; // previous brush that was selected into dc<Br></Br>//draw ellipse , gradually moving towards upper-right corner<Br></Br>for (nIndex = 0 ; nIndes < + nEllipse ; nIndes ++)<Br></Br>{<Br></Br>//creat solid brush<Br></Br>brush . CreatSolidBrush (RGB ( ( (nIndex *byRed ) /nEllipse ).<Br></Br>( ( nIndex * byGreen ) /nEllipse ), ( (nIndex * byBlue) /nEllipse ) ) );<Br></Br>//select brush into dc<Br></Br>pBrushOld= dc .SelectObject (&brhsh);<Br></Br>//draw ellipse<Br></Br>dc .Ellipse ( (int) fltStepHorz * 2, (int) fltStepVert * nIndex ,<Br></Br>rect. right -( (int) fltStepHorz * nIndex )+ 1,<Br></Br>rect . bottom -( (int) fltStepVert * (nIndex *2) ) +1) ;<Br></Br>//delete the brush<Br></Br>brush.DelecteObject ( );<Br></Br>}<Br></Br>}<Br></Br>最后,处理WM_NCHITTEST消息,使当击打窗口的任何位置时能移动窗口。<Br></Br>UINT CRoundDlg : : OnNchitTest (Cpoint point )<Br></Br>{<Br></Br>//Let user move window by clickign anywhere on the window .<Br></Br>UINT nHitTest = CDialog : : OnNcHitTest (point) ;<Br></Br>rerurn (nHitTest = = HTCLIENT)? HTCAPTION: nHitTest ;<Br></Br>}<Br></p></td></tr><tr><td><font color="0000FF"><a name="15">如何创建和使用无模式对话框 </a></font></td></tr><tr><td><p></Br>MFC将模式和无模式对话封装在同一个类中,但是使用无模式对话需要几<Br></Br>个对话需要几个额处的步骤。首先,使用资源编辑器建立对话资源并使用<Br></Br>ClassWizard创建一个CDialog的派生类。模式和无模式对话的中止是不一样的:<Br></Br>模式对话通过调用CDialog : : EndDialog 来中止,无模式对话则是调用<Br></Br>CWnd: : DestroyWindow来中止的,函数CDialog : : OnOK和CDialog : : OnCancel<Br></Br>调用EndDialog ,所以需要调用DestroyWindow并重置无模式对话的函数。<Br></Br>void CSampleDialog : : OnOK ( )<Br></Br>{<Br></Br>// Retrieve and validate dialog data .<Br></Br>if (! UpdateData (TRUE) )<Br></Br>{<Br></Br>// the UpdateData rountine will set focus to correct item<Br></Br>TRACEO (" UpdateData failed during dialog termination .\n") ;<Br></Br>return ;<Br></Br>}<Br></Br>//Call DestroyWindow instead of EndDialog .<Br></Br>DestroyWindow ( ) ;<Br></Br>}<Br></Br>void CSampleDialog : : OnCancel ( )<Br></Br>{<Br></Br>//Call DestroyWindow instead of EndDialog .<Br></Br>DestroyWindow ( ) ;<Br></Br>}<Br></Br>其次,需要正确删除表示对话的C++对象。对于模式对来说,这很容易,需要创建函数返回后即可删除C++对象;无模式对话不是同步的,创建函数调用后立即返回,因而用户不知道何时删除C++对象。撤销窗口时工作框调用CWnd : : PostNcDestroy,可以重置该函数并执行清除操作,诸如删除this指针。<Br></Br>void CSampleDialog : : PostNcDestroy ( )<Br></Br>{<Br></Br>// Declete the C++ object that represents this dialog .<Br></Br>delete this ;<Br></Br>}<Br></Br>最后,要创建无模式对话。可以调用CDialog : : DoModal创建一个模式对放, 要创建一个无模式对话则要调用CDialog: : Create。下面的例子说明了应用程序是如何创建无模式对话的:<Br></Br>void CMainFrame : : OnSampleDialog ( )<Br></Br>{<Br></Br>//Allocate a modeless dialog object .<Br></Br>CSampleDilog * pDialog =new CSampleDialog ;<Br></Br>ASSERT_VALID (pDialog) ;<Br></Br>//Create the modeless dialog .<Br></Br>BOOL bResult = pDialog —> Creste (IDD_IDALOG) ;<Br></Br>ASSERT (bResult ) ;<Br></Br>}<Br></Br> <Br></p></td></tr><tr><td><font color="0000FF"><a name="16">多边形窗口<Br>闻怡洋</a></font></td></tr><tr><td><p></Br>当你看腻了矩形窗口后,你想不想改变你窗口的形状呢?你需要做的很简单。<Br></Br>产生一个CRgn对象,并调用int CWnd::SetWindowRgn( HRGN hRgn, BOOL bRedraw );<Br></Br>下面将讲述具体方法:<Br></Br>在窗口的OnCreate中(窗口必须为WS_POPUP风格,其它的我没有试过)下面的代码将创建一个三角形的窗口。<Br></Br>int ctW::OnCreate(LPCREATESTRUCT lpCreateStruct)<Br>{<Br> if (CWnd::OnCreate(lpCreateStruct) == -1)<Br> return -1;<Br> POINT pt[3];<Br> pt[0].x=100;<Br> pt[0].y=20;<Br> pt[1].x=0;<Br> pt[1].y=150;<Br> pt[2].x=180;<Br> pt[2].y=150;<Br></Br> m_rgn.CreatePolygonRgn(pt,3,WINDING);<Br> SetWindowRgn(m_rgn,1);<Br></Br> // TODO: Add your specialized creation code here<Br></Br> return 0;<Br>}<Br></Br>CWnd::GetWindowRgn(...)将通过返回值告诉你该多边形是否为一个单独的矩形。<Br>请注意该RGN坐标是以原来窗口的矩形为零点坐标的而不是以屏幕坐标为零点坐标。<Br>你可以利用CRgn::CombineRgn(...)将多个RGN并起了形成自己所需要的形状。<Br></Br></p></td></tr><tr><td><font color="0000FF"><a name="17">如何通过代码获得应用程序主窗口的指针? </a></font></td></tr><tr><td><p></Br>主窗口的 指针保存在CWinThread::m_pMainWnd中,调用 AfxGetMainWnd实现。<Br></Br>AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED); //使程序最大化.<Br></Br></p></td></tr><tr><td><font color="0000FF"><a name="18">如何改变窗口的图标? </a></font></td></tr><tr><td><p></Br>向窗口发送 WM_SECTION消息。<Br></Br>Example:<Br></Br>HICON hIcon=AfxGetApp() ->LoadIcon(IDI_ICON);<Br></Br>ASSERT(hIcon);<Br></Br>AfxGetMainWnd() ->SendMessage(WM_SECTION,TRUE,(LPARAM) hIcon);<Br></Br></p></td></tr><tr><td><font color="0000FF"><a name="19">如何获取有关窗口正在处理的当前消息的信息 </a></font></td></tr><tr><td><p></Br>调用CWnd: : GetCurrentMessage可以获取一个MSG指针。例如,可以使用<Br></Br>ClassWizard将几个菜单项处理程序映射到一个函数中,然后调用GetCurrentMessage<Br></Br>来确定所选中的菜单项。<Br></Br>viod CMainFrame : : OnCommmonMenuHandler ( )<Br></Br>{<Br></Br>//Display selected menu item in debug window .<Br></Br>TRACE ("Menu item %u was selected . \n" ,<Br></Br>GetCruuentMessage ( ) —> wParam );<Br></Br>}<Br></Br></p></td></tr><tr><td><font color="0000FF"><a name="20">在DLL用自定义窗口 </a></font></td></tr><tr><td><p></Br>我在DLL中用如下窗口,<Br></Br>class CMyWin:public CWnd<Br></Br>{<Br></Br>public:<Br></Br>CMyWin() ;<Br></Br>} ;<Br></Br>CMyWin::CMyWin()<Br></Br>{<Br></Br>if( !CreateEx( WS_EX_TOPMOST ,<Br></Br>AfxRegisterWndClass( CS_SAVEBITS ) ,<Br></Br>"mywin" , WS_POPUP ,<Br></Br>0 , 0 , 100 , 100 , NULL , NULL ) )<Br></Br>AfxMessageBox( "CreateEx error" ) ;<Br></Br>}<Br></Br>请问有谁知道是什么原因?谁在DLL中做过类似工作,望赐教。ror”,<Br></Br>我记得AfxRegisterWndClass好象应该在PreCreateWindow中调用,<Br></Br>在构造函数中用这个函数似乎有问题,你再试试吧!<Br></Br>用C++作DLL可以吗?好象名字分裂回有些负作用吧?<Br></Br>用MFC C++是可以做传统的DLL的。只要将回调函数定义成如下格式就行了:<Br></Br>#ifdef __cplusplus<Br></Br>extern "C" {<Br></Br>#endif<Br></Br>void __export FAR PASCAL fun() ;<Br></Br>#ifdef __cplusplus<Br></Br>}<Br></Br>#endif<Br></Br>其它与普通MFC程序一样。当然,在例程类的定义上也有点特别的地方<Br></Br>我如果在正常的执行程序中这样用CreateEx就没有任何问题,而在DLL中<Br></Br>就有问题。并且这问题也只发生在WIN3.1上,在WIN95上却可以正常执行。<Br></Br></p></td></tr></table><p align="center"><img src="/logo.gif" align="center"><a href="/co/index.htm">北京美达美科技有限公司</a> 版权所有: 1998-1999</a></p></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -