一些小问题

1:问题:在我的程序的某些部分,我可以调用 MessageBox 函数来建立一个信息对话 框,例如在视类中。但是,在其它部分我却不能,如文档类中。为什么?我怎样才 能在我的应用程序类中建立一个信息对话框?
\n解答:MessageBox函数来自CWnd类,所以你只能在从CWnd继承的类(如CView)中调 用它。但是,MFC也提供了AfxMessageBox函数,你可以在任何地方调用它。
\n
\n2:问题:我应该如何改变视窗口的大小?
\n解答:因为视窗口实际上是框架窗口的子窗口,所以你必须改变框架窗口的大小,而不 是改变视窗口。使用CView类中的GetParentFrame()函数获得指向框架窗口的指针,然 后调用MoveWindow()函数来改变框架的大小。这会使变尺寸的视充满框架窗口
\n
\n3:从窗口中删除了极大按钮并设置了初始位置和大小:
\n BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
\n{cs.style = WS_OVERLAPPED | WS_SYSMENU | WS_BORDER;
\n    // Set the position of the window to the upper -left corner.
\ncs.x =cs. y =0;
\n//Set the width and height of the window .
\ncs. cx=GetSystemMetrics (SM_CXSCREEN);
\ncs. cy=GetSystemMetrics (SM_CYSCREEN) /2;
\nreturn CFrameWnd::PreCreateWindow(cs);} 
\n4:将窗口设置为极大或极小。
\nBOOL CSampleApp : : InitInstance ( )
\n{
\npMainWnd ->Show Window (SW_SHOWMINMIZED或者SW_SHOWMAXIMIZED);}
\n4:如何移动窗口
\n调用CWnd : : SetWindowPos并指定SWP_NOSIZE标志。目的位置与父窗口有关
\n(顶层窗口与屏幕有关)。调用CWnd : : MoveWindow时必须要指定窗口的大小。
\n//Move window to positoin 100 , 100 of its parent window .
\nSetWindowPos (NULL, 100 , 100 , 0 , 0 , SWP_NOSIZE |SWP_NOACTIVATE);
\n5 如何获取窗口目前正在处理的消息
\n利用函数
\nGetCurrentMessage();
\n6、MFC黑屏窗口
\n
\n作者:陈玉东
\n
\nCRect rect(-1,-1,804,602);
\nCFrameWnd *pWnd=new CFrameWnd();
\npWnd->Create(AfxRegisterWndClass(NULL,NULL,
\nHBRUSH)::GetStockObject(BLACK_BRUSH),NULL),
\n"",WS_POPUP,rect);
\npWnd->ShowWindow(m_nCmdShow);
\n
\n这一段程序直接利用CFrameWnd类,和AfxRegisterWndClass()
\n全局函数,其中RECT取-1,-1,804,602 是针对800*600分辨率,这
\n些参数可根据情况微调。我赞成写的程序核心代码,所以我只给到此,
\n若需要此类,请回个EMAIL,若你业已生成更复杂的相关类,我会写入主页。
\n7为MFC程序添加全屏幕显示功能
\n发信站: 饮水思源站
\n
\n在CMainFrame类中添加下列成员变量和成员函数(使用ClassWizard),下面是这
\n
\n些变量和函数的功能说明:
\n成员变量:
\nBOOL m_bFullScreen; //全屏幕显示标志
\nCRect m_FullScreenWindowRect; //全屏幕显示窗口Rect
\nWINDOWPLACEMENT m_wpPrev; //用于保存正常视图时的窗口位置信息
\nCToolBar * m_wndFullScreenBar; //全屏幕显示时的浮动工具条
\n成员函数:
\nvoid OnMenuFullscreen(); //全屏幕显示的处理函数
\nvoid OnGetMinMaxInfo(); //捕获WM_GETMINMAXINFO消息以便允许你增加
\n
\n窗口大小
\nvoid OnUpdateViewFullScreen(); //更新“全屏幕显示”菜单的状态
\n源码
\nvoid CMainFrame::OnMenuFullscreen()
\n{//全屏幕显示的处理函数
\nRECT rectDesktop;
\nWINDOWPLACEMENT wpNew;
\nif (m_bFullScreen)
\n{//全屏幕显示模式
\n//隐藏工具条和状态条
\nm_wndStatusBar.ShowWindow(SW_HIDE);
\nm_wndToolBar.ShowWindow(SW_HIDE);
\n//保存正常视图时的窗口位置信息以便恢复原来状态
\nGetWindowPlacement (&m_wpPrev);
\nm_wpPrev.length = sizeof m_wpPrev;
\n//调整RECT为新的窗口尺寸
\n::GetWindowRect ( ::GetDesktopWindow(), &rectDesktop );
\n::AdjustWindowRectEx(&rectDesktop, GetStyle(), TRUE,
\n
\nGetExStyle());
\n//保存RECT以便OnGetMinMaxInfo()使用
\nm_FullScreenWindowRect = rectDesktop;
\nwpNew = m_wpPrev;
\nwpNew.showCmd = SW_SHOWNORMAL;
\nwpNew.rcNormalPosition = rectDesktop;
\n//生成新的工具条
\nm_wndFullScreenBar=new CToolBar;
\nif(!m_wndFullScreenBar->Create(this,
\n
\nCBRS_SIZE_DYNAMIC|CBRS_FLOATING)
\n|| !m_wndFullScreenBar->LoadToolBar(IDR_FULLSCREEN))
\n{
\nTRACE0("Failed to create toolbar
\n");
\nreturn; // fail to create
\n}
\n//不允许工具条停泊
\nm_wndFullScreenBar->EnableDocking(FALSE);
\nm_wndFullScreenBar->SetWindowPos(0,100,100,0,0,SWP_NOSIZE
\n|SWP_NOZORDER|SWP_NOACTIVATE|SWP_SHOWWINDOW);
\nm_wndFullScreenBar->SetWindowText(_T("全屏幕显示"));
\nFloatControlBar(m_wndFullScreenBar, CPoint(100,100));
\nm_bFullScreen=TRUE;
\n}
\nelse
\n{//正常显示模式
\n//删除全屏幕工具条
\nm_wndFullScreenBar->DestroyWindow();
\ndelete m_wndFullScreenBar;
\nm_bFullScreen=FALSE;
\n//恢复工具条和状态条
\nm_wndStatusBar.ShowWindow(SW_SHOWNORMAL);
\nm_wndToolBar.ShowWindow(SW_SHOWNORMAL);
\nwpNew = m_wpPrev;
\n}
\n//设置窗口显示状态
\nSetWindowPlacement ( &wpNew );
\n}
\nvoid CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
\n{
\nif (m_bFullScreen)
\n{
\nlpMMI->ptMaxSize.y = m_FullScreenWindowRect.Height();
\nlpMMI->ptMaxTrackSize.y = lpMMI->ptMaxSize.y;
\nlpMMI->ptMaxSize.x = m_FullScreenWindowRect.Width();
\nlpMMI->ptMaxTrackSize.x = lpMMI->ptMaxSize.x;
\n}
\n}
\nvoid CMainFrame::OnUpdateMenuFullscreen(CCmdUI* pCmdUI)
\n{//更新菜单的状态
\npCmdUI->Enable();
\npCmdUI->SetCheck(m_bFullScreen);
\n}
\n--
\n※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.5.220]
\n
\n8用鼠标单击窗口标题条以外区域移动窗口
\n
\n移动标准窗口是通过用鼠标单击窗口标题条来实现的,但对于没有标题条的
\n窗口,就需要用鼠标单击窗口标题条以外区域来移动窗口。有两种方法可以
\n达到这一目标。
\n
\n方法一:
\n当窗口确定鼠标位置时,Windows向窗口发送WM_NCHITTEST消息,可以处理该
\n消息,使得只要鼠标在窗口内,Windows便认为鼠标在标题条上。这需要重载
\nCWnd类处理WM_NCHITTEST消息的OnNcHitTest函数,在函数中调用父类的该函数,
\n如果返回HTCLIENT,说明鼠标在窗口客户区内,使重载函数返回HTCAPTION,
\n使Windows误认为鼠标处于标题条上。
\n
\n下例是使用该方法的实际代码:
\n
\nUINT CEllipseWndDlg::OnNcHitTest(CPoint point)
\n{
\n// 取得鼠标所在的窗口区域
\nUINT nHitTest = CDialog::OnNcHitTest(point);
\n
\n// 如果鼠标在窗口客户区,则返回标题条代号给Windows
\n// 使Windows按鼠标在标题条上类进行处理,即可单击移动
\n//窗口
\nreturn (nHitTest==HTCLIENT) ? HTCAPTION : nHitTest;
\n}
\n
\n方法二:当用户在窗口客户区按下鼠标左键时,使Windows认为鼠标是在标题条
\n上,即在处理WM_LBUTTONDOWN消息的处理函数OnLButtonDown中发送一个wParam
\n参数为HTCAPTION,lParam为当前坐标的WM_NCLBUTTONDOWN消息。
\n下面是使用该方法的实际代码:
\n
\nvoid CEllipseWndDlg::OnLButtonDown(UINT nFlags, CPoint point)
\n{
\n// 调用父类处理函数完成基本操作
\nCDialog::OnLButtonDown(nFlags, point);
\n
\n// 发送WM_NCLBUTTONDOWN消息
\n// 使Windows认为鼠标在标题条上
\nPostMessage(WM_NCLBUTTONDOWN,
\nHTCAPTION,
\nMAKELPARAM(point.x, point.y));
\n}
\n9 怎样将一个窗口的屏幕在另一个窗?
\n发信站: 一网深情 (Mon May 31 23:57:26 1999), 转信
\n
\n完成将一个窗口的屏幕在另一个窗口中展现,关键是要理解
\n设备描述表DC.
\n
\n我编写了一个简单的程序,你只需建立一单(多)文档程序,
\n将下面的程序加入到视类的OnDraw()中,即可完成对桌面
\n窗口的内容复制。
\n若还有问题,欢迎来信探讨。
\nOnDraw()
\n{ .
\n.
\nCWnd *m_pWndShow=GetDesktopWindow();//得到桌面窗口
\nASSERT(m_pWndShow!=NULL);
\n
\nCDC *pdc_Showed=m_pWndShow->GetDC();
\n
\nCDC myDC;
\nmyDC.CreateCompatibleDC(pdc_Showed);
\n
\nCRect rect;
\nGetClientRect(rect);
\n
\npDC->BitBlt (0,0,rect.right,rect.bottom,pdc_Showed,0,0,SRCCOPY);
\n
\nm_pWndShow->ReleaseDC(pdc_Showed);
\n}
\n
\n【 在 zhenyu (·真鱼·) 的大作中提到: 】
\n:
\n: 在传参时,应选什么参数呀?
\n: 俺试过传CClient dc;
\n: 结果是在目标窗口中用
\n: pDC->BitBlt(0,0,100,100,&dc,0,0,SRCCOPY);
\n: 后运行时没有一点点的反映。
\n: 传指针CClentDC * pdc吧,
\n: 编译时无错可运行时就有非法操作出现。
\n:
\n: 唉,真不知道怎么办,毕业设计可是没有时间了呀!
\n: 请大学帮一把!谢谢!!!
\n
\n10 如何使用FindWindow()函数发信站: 我爱南开站 :
\n帮助文件中说的用法如下: : HWND FindWindow( : LPCTSTR lpClassName, // pointer to class name : LPCTSTR lpWindowName // pointer to window name : ); : 但不知 lpClassName和lpWindowName 参数该采取什么形式? : 是用CHAR, 还是用STRING,还是用其他形式? : 请大虾们给个例子。 : 多谢了! hWnd = FindWindow( TEXT( "MyWndClassName" ), TEXT( "MyWndTitleName" ) );
\n
\n11:Re: 我要黑屏
\n发信站: 武汉白云黄鹤站
\n
\n不好意思,再把这问题提出来,不过现在觉得比较好的方法是:
\n1 建立一个基于对话框的应用程序
\n2 在资源编辑器内设置对话框窗口无边框,无title bar,system modal
\n3 在InitDialog()中用SetDialogBkColor(RGB(0,0,0),RGB(x,x,x))
\n将窗口底色设置为黑色
\n4 在InitInstance()中让窗口初始时最大化:
\nShowWindow(WS_SHOWMAXIMIZED);
\n
\n对话框上可随意放些控件,很方便的.
\n
\n
\n在 bone (李逍遥) 的大作中提到: 】
\n: 我后来发现用PreCreateWindow是一样的:
\n: BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
\n: {
\n: // TODO: Modify the Window class or styles here by modifying
\n: // the CREATESTRUCT cs
\n: cs.hMenu = FALSE; //隐去菜单
\n: cs.style = WS_POPUP; //去边框
\n: cs.dwExStyle = WS_EX_TOPMOST; //不设此项则Windows任务栏会在下面露出一
\n: //线,屏不够黑
\n: cs.cy = ::GetSystemMetrics(SM_CYSCREEN)+3;
\n: cs.cx = ::GetSystemMetrics(SM_CXSCREEN)+3;
\n: cs.y = cs.x =-1; //这里比较奇怪,取0仍显示极细的边框,所以取了-1,
\n: //上面两处加3也是这原因,试出来的。
\n: return CFrameWnd::PreCreateWindow(cs);
\n: }
\n: /
\n: // CArtView drawing
\n: void CArtView::OnDraw(CDC* pDC)
\n: {
\n: CArtDoc* pDoc = GetDocument();
\n: ASSERT_VALID(pDoc);
\n: // TODO: add draw code for native data here
\n: RECT rcBounds;
\n: CBrush bkBrush(RGB(0,0,0)); //选了黑色
\n: GetClientRect(&rcBounds);
\n: pDC->FillRect(&rcBounds, &bkBrush );
\n: }
\n: 再请教了,如何屏蔽Windows键和Ctrl+Alt+Del键?
\n
\n
\n12、如何创建一个字回绕的CEditView
\n
\n重载CWnd : : PreCreateWindow和修改CREATESTRUCT结构,关闭CEditView对象的ES_AUTOHSCROLL和WS_HSCROLL风格位, 由于CEditView : : PreCreateWindow显示设置cs. style,调用基类函数后要修改cs . style。
\n
\nBOOL CSampleEDitView : : PreCreateWindow (CREATESTRUCT&cs)
\n
\n{
\n
\n//First call basse class function .
\n
\nBOOL bResutl =CEditView : : PreCreateWindow (cs) ;
\n
\n// Now specify the new window style .
\n
\ncs.style &= ~ (ES_AUTOHSCROLL |WS_HSCROLL);
\n
\nreturn bResult ;
\n
\n}
\n
\n13、移动窗口
\n
\n调用CWnd : : SetWindowPos并指定SWP_NOSIZE标志。目的位置与父窗口
\n
\n有关(顶层窗口与屏幕有关)。调用CWnd : : MoveWindow时必须要指定窗口
\n
\n的大小。
\n
\n//Move window to positoin 100 , 100 of its parent window .
\n
\nSetWindowPos (NULL, 100 , 100 , 0 , 0 , SWP_NOSIZE |SWP_NOAORDER);
\n
\n14、重置窗口的大小
\n
\n调用CWnd: : SetWindowPos并指定SWP_NOMOVE标志, 也可调用
\n
\nCWnd : : MoveWindow 但必须指定窗口的位置。
\n
\n// Get the size of the window .
\n
\nCrect reWindow ;
\n
\nGetWindowRect (reWindow );
\n
\n//Make the window twice as wide and twice as tall .
\n
\nSetWindowPos (NULL , 0 , 0 , reWindow . Width ( ) *2,
\n
\nreWindow . Height () * 2,
\n
\nSWP_NOMOVE |SWP_NOZORDER );
\n
\n15、如何单击除了窗口标题栏以外的区域使窗口移动
\n
\n当窗口需要确定鼠标位置时Windows向窗口发送WM_NCHITTEST信息,可以处理
\n
\n该信息使Windows认为鼠标在窗口标题上。对于对话框和基于对话的应用程序,可
\n
\n以使用ClassWizard处理该信息并调用基类函数, 如果函数返回HTCLIENT 则表明
\n
\n鼠标在客房区域,返回HTCAPTION表明鼠标在Windows的标题栏中。
\n
\nUINT CSampleDialog : : OnNcHitTest (Cpoint point )
\n
\n{
\n
\nUINT nHitTest =Cdialog: : OnNcHitTest (point );
\n
\nreturn (nHitTest = =HTCLIENT)? HTCAPTION : nHitTest ;
\n
\n}
\n
\n上述技术有两点不利之处, 其一是在窗口的客户区域双击时, 窗口将极大;
\n
\n其二, 它不适合包含几个视窗的主框窗口。还有一种方法,当用户按下鼠标左键
\n
\n使主框窗口认为鼠标在其窗口标题上,使用ClassWizard在视窗中处理WM_LBUTTODOWN
\n
\n信息并向主框窗口发送一个WM_NCLBUTTONDOWN信息和一个单击测试HTCAPTION。
\n
\nvoid CSampleView : : OnLButtonDown (UINT nFlags , Cpoint point )
\n
\n{
\n
\nCView : : OnLButtonDow (nFlags , pont );
\n
\n//Fool frame window into thinking somene clicked on
\n
\nits caption bar .
\n
\nGetParentFrame ( ) —> PostMessage (
\n
\nWM_NCLBUTTONDOWN , HTCAPTION , MAKELPARAM (poitn .x , point .y) );
\n
\n}
\n
\n该技术也适用于对话框和基于对的应用程序,只是不必调用CWnd : : GetParentFrame 。
\n
\nvoid CSampleDialog : : OnLbuttonDown (UINT nFlags, Cpoint point )
\n
\n{
\n
\nCdialog : : OnLButtonDow (nFlags, goint );
\n
\n//Fool dialog into thinking simeone clicked on its caption bar .
\n
\nPostMessage (WM_NCLBUTTONDOWN , HTCAPTION , MAKELPARM (point.x , point. y ) )
\n
\n}
\n
\n16、如何改变视窗的背景颜色
\n
\nWindows向窗口发送一个WM_ERASEBKGND消息通知该窗口擦除背景,可以使用
\n
\nClassWizard重载该消息的缺省处理程序来擦除背景(实际是画),并返回TRUE以
\n
\n防止Windows擦除窗口。
\n
\n//Paint area that needs to be erased.
\n
\nBOOL CSampleView : : OnEraseBkgnd (CDC* pDC)
\n
\n{
\n
\n// Create a pruple brush.
\n
\nCBrush Brush (RGB (128 , 0 , 128) );
\n
\n// Select the brush into the device context .
\n
\nCBrush* pOldBrush = pDC—>SelcetObject (&brush);
\n
\n// Get the area that needs to be erased .
\n
\nCRect reClip ;
\n
\npDC—>GetCilpBox (&rcClip);
\n
\n//Paint the area.
\n
\npDC—> PatBlt (rcClip.left , rcClip.top ,
\n
\nrcClip.Width ( ) , rcClip.Height ( ) , PATCOPY );
\n
\n//Unselect brush out of device context .
\n
\npDC—>SelectObject (pOldBrush );
\n
\n// Return nonzero to half fruther processing .
\n
\nreturn TRUE;
\n
\n}
\n
\n17、如何改变窗口标题
\n
\n调用CWnd : : SetWindowText可以改变任何窗口(包括控件)的标题。
\n
\n//Set title for application’s main frame window .
\n
\nAfxGetMainWnd ( ) —> SetWindowText (_T("Application title") );
\n
\n//Set title for View’s MDI child frame window .
\n
\nGetParentFrame ( ) —> SetWindowText ("_T ("MDI Child Frame new title") );
\n
\n//Set title for dialog’s push button control.
\n
\nGetDigitem (IDC_BUTTON) —> SetWindowText (_T ("Button new title ") );
\n
\n如果需要经常修改窗口的标题(注:控件也是窗口),应该考虑使用半文档化
\n
\n的函数AfxSetWindowText。该函数在AFXPRIV.H中说明,在WINUTIL.CPP中实现,在
\n
\n联机帮助中找不到它,它在AFXPRIV.H中半文档化, 在以后发行的MFC中将文档化。
\n
\nAfxSetWindowText的实现如下:
\n
\nvoik AFXAPI AfxSetWindowText (HWND hWndCtrl , LPCTSTR IpszNew )
\n
\n{
\n
\nitn nNewLen= Istrlen (Ipaznew);
\n
\nTCHAR szOld [256];
\n
\n//fast check to see if text really changes (reduces flash in the controls )
\n
\nif (nNewLen >_contof (szOld) ||
\n
\n: : GetWindowText (hWndCrtl , szOld , _countof (szOld) !=nNewLen ||
\n
\nIstrcmp (szOld , IpszNew )! = 0
\n
\n{
\n
\n//change it
\n
\n: : SetWindowText (hWndCtrl , IpszNew );
\n
\n}
\n
\n}
\n
\n18、如何防止主框窗口在其说明中显示活动的文档名
\n
\n创建主框窗口和MDI子窗口进通常具有FWS_ADDTOTITLE风格位, 如果不希望在
\n
\n说明中自动添加文档名, 必须禁止该风格位, 可以使用ClassWizard重置
\n
\nCWnd: : PreCreateWindow并关闭FWS_ADDTOTITLE风格。
\n
\nBOOL CMainFrame : : PreCreateWindow (CREATESTRUCT&cs)
\n
\n{
\n
\n//Turn off FWS_ADDTOTITLE in main frame .
\n
\ncs.styel & = ~FWS_ADDTOTITLE ; 
\n
\nreturn CMDIFrameWnd : : PreCreateWindow (cs );
\n
\n}
\n
\n关闭MDI子窗口的FWS _ADDTOTITLE风格将创建一个具有空标题的窗口,可以调
\n
\n用CWnd: : SetWindowText来设置标题。记住自己设置标题时要遵循接口风格指南。
\n
\n19如何创建一个不规则形状的窗口
\n
\n可以使用新的SDK函数SetWindowRgn。该函数将绘画和鼠标消息限定在窗口的一
\n
\n个指定的区域,实际上使窗口成为指定的不规则形状。
\n
\n使用AppWizard创建一个基于对的应用程序并使用资源编辑器从主对话资源中删
\n
\n除所在的缺省控件、标题以及边界。
\n
\n给对话类增加一个CRgn数据成员,以后要使用该数据成员建立窗口区域。
\n
\nClass CRoundDlg : public CDialog
\n
\n{
\n
\n…
\n
\nprivate :
\n
\nCrgn m_rgn : // window region
\n
\n…
\n
\n} ;
\n
\n修改OnInitDialog函数建立一个椭圆区域并调用SetWindowRgn将该区域分配给
\n
\n窗口:
\n
\nBOOL CRoundDlg : : OnInitDialog ( )
\n
\n{
\n
\nCDialog : : OnInitDialog ( ) ;
\n
\n//Get size of dialog .
\n
\nCRect rcDialog ;
\n
\nGetClientRect (rcDialog );
\n
\n// Create region and assign to window .
\n
\nm_rgn . CreateEllipticRgn (0 , 0 , rcDialog.Width ( ) , rcDialog .Height ( ) );
\n
\nSetWindowRgn (GetSafeHwnd ( ) , (HRGN) m_ rgn , TRUE );
\n
\nreturn TRUE ;
\n
\n}
\n
\n通过建立区域和调用SetWindowRgn,已经建立一个不规则形状的窗口,下面的例
\n
\n子程序是修改OnPaint函数使窗口形状看起来象一个球形体。
\n
\nvoik CRoundDlg : : OnPaint ( )
\n
\n{
\n
\nCPaintDC de (this) ; // device context for painting .
\n
\n//draw ellipse with out any border
\n
\ndc. SelecStockObject (NULL_PEN);
\n
\n//get the RGB colour components of the sphere color
\n
\nCOLORREF color= RGB( 0 , 0 , 255);
\n
\nBYTE byRed =GetRValue (color);
\n
\nBYTE byGreen = GetGValue (color);
\n
\nBYTE byBlue = GetBValue (color);
\n
\n// get the size of the view window
\n
\nCrect rect ;
\n
\nGetClientRect (rect);
\n
\n// get minimun number of units
\n
\nint nUnits =min (rect.right , rect.bottom );
\n
\n//calculate he horiaontal and vertical step size
\n
\nfloat fltStepHorz = (float) rect.right /nUnits ;
\n
\nfloat fltStepVert = (float) rect.bottom /nUnits ;
\n
\nint nEllipse = nUnits/3; // calculate how many to draw
\n
\nint nIndex ; // current ellipse that is being draw
\n
\nCBrush brush ; // bursh used for ellipse fill color
\n
\nCBrush *pBrushOld; // previous brush that was selected into dc
\n
\n//draw ellipse , gradually moving towards upper-right corner
\n
\nfor (nIndex = 0 ; nIndes < + nEllipse ; nIndes ++)
\n
\n{
\n
\n//creat solid brush
\n
\nbrush . CreatSolidBrush (RGB ( ( (nIndex *byRed ) /nEllipse ).
\n
\n( ( nIndex * byGreen ) /nEllipse ), ( (nIndex * byBlue) /nEllipse ) ) );
\n
\n//select brush into dc
\n
\npBrushOld= dc .SelectObject (&brhsh);
\n
\n//draw ellipse
\n
\ndc .Ellipse ( (int) fltStepHorz * 2, (int) fltStepVert * nIndex ,
\n
\nrect. right -( (int) fltStepHorz * nIndex )+ 1,
\n
\nrect . bottom -( (int) fltStepVert * (nIndex *2) ) +1) ;
\n
\n//delete the brush
\n
\nbrush.DelecteObject ( );
\n
\n}
\n
\n}
\n
\n最后,处理WM_NCHITTEST消息,使当击打窗口的任何位置时能移动窗口。
\n
\nUINT CRoundDlg : : OnNchitTest (Cpoint point )
\n
\n{
\n
\n//Let user move window by clickign anywhere on the window .
\n
\nUINT nHitTest = CDialog : : OnNcHitTest (point) ;
\n
\nrerurn (nHitTest = = HTCLIENT)? HTCAPTION: nHitTest ;
\n
\n}

你可能感兴趣的:(MFC)