友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
富士康小说网 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

VC语言6.0程序设计从入门到精通-第27部分

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!





    virtual BOOL TextOut( int x ; int y ; LPCTSTR lpszString; int nCount );  



    BOOL TextOut( int x ; int y ; const CString& str );  



    o  参数  

    o  x   文本起始点的 x 坐标。  

    o  y   文本起始点的 y 坐标。  

    o  lpszString  将要绘制的文本。  

    o  nCount 字符串中的字节数。  

    o  str   包含将要绘制的文本的 CString 对象  



7。3  图形设备接口(GDI )  



    图形设备接口 GDI     (Graphics Device Interface )提供了在 Windows 下绘图的基本功能。  



                                                                    ·165 ·  


…………………………………………………………Page 175……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通  



7。3。1  设备环境类(CDC )  



    CDC 直接继承自 CObject 类,类的继承顺序如图 7…1 所示。  



                                                     



                            图 7…1    CDC 类的基类继承图  



    CDC 类是设备上下文对象的基类,它提供了处理显示器、打印机等设备的成员函数,利 

用 CDC 对象可以访问整个显示设备(如显示器)和非显示设备(如打印机 )。  

    通过 CDC 类的成员函数可以进行所有的绘图操作,包括绘图工具和 GDI 对象的选择、 

颜色和调色板的处理、获得和设置绘图工具的属性、图形的绘制等。另外它可以绘制文本、 

处理字体,使用打印机和显示源文件提供的相应的成员函数。  

    CDC 类包含 m_hDC 和 m_hAttribDC 两个设备上下文句柄,CDC 对象创建时二者指向同 

一个设备。m_hDC 用于所有的输出 GDI 调用(如 SetTextColor()函数),m_hAttribDC 用于大 

部分的属性 GDI 调用(如 GetTextColor()函数)。应用程序框架可以同时使用两个设备上下文, 

并且在物理设备获得属性的同时,将结果输出到一个 CMateFileDC 对象中,打印预览就是以 

这种方式实现的。  

    CDC 类的定义包含在头文件“afxwin。h ”中。  

    CDC 类封装了几乎所有的 Windows GDI 函数,构造了 CDC 对象后,就可以调用它的成 

员函数完成相应的图形操作。同时 MFC 还提供了 CDC 类的派生类 CpaintDC、CclientDC、 

CmetaFileDC、CwindowDC,用于完成特定操作。  

    通常使用 CDC 类的方法是传递一个 CDC 的指针 pDC 到 OnDraw 函数,在 OnDraw 函数 

中调用它的成员函数完成绘图操作。 

                                 

    使用完毕后应该及时删除构造的 CDC  对象。Windows  限制了可使用的设备上下文的数 

量,如果删除一个设备上下文对象失败,将会占用一小部分内存,直到程序退出。要确保设 

备上下文对象被删除,最容易的方法是在堆栈上构造对象。  

    也可通过      CWnd::GetDC() 成员函数来获得设备上下文指针,这种情况下必须调用 

ReleaseDC 函数来释放设备环境。  



7。3。2 GDI 对象  



    Windows 的 GDI 对象都是从基类 CGdiObject 派生而来。可以通过调用 GDI 派生类的构 

造函数来创建 GDI 对象。GDI 对象如下:  

    o  CBitmap ;  

    o  CBrush ;  

    o  CPen ;  

    o  CFont ;  

    o  CRgn ;  

    o  CPalette 。  



 ·166 ·  


…………………………………………………………Page 176……………………………………………………………

                                                                                          第 7 章     图形图像  



7。4  画笔和画刷  



      画笔(CPen )和画刷(CBrush )是最常用的两个  GDI  对象。本节通过两个实例,详细 

介绍这两个对象的使用方法。  

       

       



7。4。1  画笔  



实例 7…1 :画笔使用实例实例。源代码在光盘中“07实例 7…1CpuUsage ”目录下。  



      1.创建程序  



      下面通过动态显示  CPU                 的使用记录的例子介绍画笔的使用方法。利用                                    Visual  C++ 的 

AppWizard 创建一个基于对话框的应用程序 CpuUsage,为对话框添加一个静态文本框控件和 

一个 group box 控件。为对话框类 CCpuUsageDlg 添加成员变量,如表 7…1 所示。  



      表 7…1                             CCpuUsageDlg 的成员变量表    



           成员变量                          类型                                    作用  

 m_btnView                       CButton                 显示区域  

 m_strCpuUsage                   CString                 显示字符串  

 m_UsageHistory                  int''                   CPU 使用记录  

 m_timer                         int                     计时器  

 m_Usage                         CCpuUsage               测试 Cpu 使用率类  



      2 .编写代码  



      (1)初始化对话框  

      修改 CCpuUsageDlg 的成员函数 OnInitDialog,对变量做初始化。代码如下:  



     BOOL CCpuUsageDlg::OnInitDialog()  



      {  



           CDialog::OnInitDialog();  



           // Add 〃About。。。〃 menu item to system menu。  



       



           // IDM_ABOUTBOX must be in the system mand range。  



           ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);  



           ASSERT(IDM_ABOUTBOX 《 0xF000);  



       



           CMenu* pSysMenu = GetSystemMenu(FALSE);  



           if (pSysMenu != NULL)  



           {  



                CString strAboutMenu;  



                                                                                                     ·167 ·  


…………………………………………………………Page 177……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通  



                   strAboutMenu。LoadString(IDS_ABOUTBOX);  



                   if (!strAboutMenu。IsEmpty())  



                   {  



                          pSysMenu…》AppendMenu(MF_SEPARATOR);  



                          pSysMenu…》AppendMenu(MF_STRING; IDM_ABOUTBOX; strAboutMenu);  



                   }  



             }  



        



             // Set the icon for this dialog。    The framework does this automatically  



             //    when the application’s main window is not a dialog  



              



             //  设置窗口总在最前  



             ::SetWindowPos(this…》GetSafeHwnd(); CWnd::wndTopMost; 0; 0; 0; 0; SWP_NOSIZE);  



              



             SetIcon(m_hIcon; TRUE);                     // Set big icon  



             SetIcon(m_hIcon; FALSE);              // Set small icon  



              



             //  初始化使用记录数组  



             memset(m_UsageHistory; 0; MAXTIMES*sizeof(int));  



        



             //  设置定时器  



             m_timer = SetTimer(1; 500; 0);  



              



             return TRUE;    // return TRUE    unless you set the focus to a control  



       }  



       利用 API 函数 SetTimer 启动定时器,函数原型如下:  



      UINT SetTimer( UINT  nIDEvent; UINT nElapse; void (CALLBACK EXPORT* lpfnTimer)(HWND; UINT;  



UINT; DWORD) );  



      o  nIDEvent :非 0 定时器标志;  

      o  nElapse :时间间隔;  

      o  lpfnTimer :处理函数。  

       当起动定时器后,每间隔 nElapse  时间间隔,系统就会给应用程序发送 WM_TIMER  消 

息,通常应用程序在 OnTimer  中响应这个消息。当程序退出时,需要调用 KillTimer 删除定 

时器,释放系统资源,它的函数原型如下:  



      BOOL KillTimer( int nIDEvent );  



      o  nIDEvent :调用 SetTimer 的返回值。  



       (2 )响应 OnTimer 消息  

      在初始化过程中,设置的时间间隔为 500 毫秒。即每隔 500 毫秒,测试一次 CPU 的使用 

率。响应 OnTimer 消息,代码如下:  



 ·168 ·  


…………………………………………………………Page 178……………………………………………………………

                                                                                                               第 7 章     图形图像  



void CCpuUsageDlg::OnTimer(UINT nIDEvent)    



{  



       // TODO: Add your message handler code here and/or call default  



       int per;  



         



       //  得到当前 CPU 的使用率  



       per = m_Usage。GetCpuUsage();  



  



       //  计数  



       if(times 《 MAXTIMES)  



              times ++;  



  



       //  更新 CPU 使用记录数组  



       for(int i=0; iSelectObject(&newbrush);  



              pDC…》Rectangle(rect);  



              newbrush。DeleteObject();  



              pDC…》SelectObject(oldbrush);  



         



              //  绿色画笔;  绘制曲线  



              curpen。CreatePen(PS_SOLID; 2; RGB(0; 255; 0));  



              oldpen = pDC…》SelectObject(&curpen);  



                



              pDC…》MoveTo(rect。left; rect。bottom);  



         



              //  用线段近似曲线  



              for(int i=0; iLineTo(x; y);  



              }  



         



              //  恢复设备上下文  



              pDC…》SelectObject(oldpen);  



              curpen。DeleteObject();  



       }  



       (4 )动态绘制 CPU 使用记录  

       响应 CCpuUsageDlg 的 WM_PAINT 消息,用来动态绘制 CPU 使用记录,代码如下:  



       void CCpuUsageDlg::OnPaint()    



 ·170 ·  


…………………………………………………………Page 180……………………………………………………………

                                                                                                             第 7 章     图形图像  



       {  



             if (IsIconic())  



             {  



                    ……  



             }  



             else  



             {  



                    CPaintDC dc(this);  



        



                    //  绘制 CPU 使用记录  



                    DrawDiagram(&dc);  



             }  



       }  



       (5 )释放资源  

       最后,响应 CCpuUsageDlg 的 WM_DESTROY 消息,在程序退出时,删除定时器,释放 

系统资源,代码如下:  



       void CCpuUsageDlg::OnDestroy()    



       {  



             CDialog::OnDestroy();  



               



             //  释放定时器资源  



             KillTimer(m_timer);  



       }  



       (6 )运行结果  

       程      序       运      行       后      ,       界      面       如       图        7…2       至        7…5        所      示       。 



                                                                                                



                                                                                                                           ·171 ·  


…………………………………………………………Page 181……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通  



       图 7…2    Cpu 使用记录 1  



                                                                                               



       图 7…3    Cpu 使用记录 2  



                                                                                               



       图 7…4    Cpu 使用记录 3  



 ·172 ·  


…………………………………………………………Page 182……………………………………………………………

                                                                            第 7 章     图形图像  



                                                                            



                                    图 7…5    CPU 使用记录  



7。4。2  画刷  



实例 7…2 :画刷使用实例实例。源代码在光盘中“07实例 7…2Color ”目录下。  



     1.创建程序  



     本节利用       CDC   类的一个函数和画刷来取得指定点的颜色。首先用                                  Visual  C++ 的 

AppWizard   创建一个基于对话框的应用程序                     Color ,为对话框添加两个图像框控件。为 

CColorDlg 添加如表 7…2 所示的成员变量,。  



     表 7…2                         CColorDlg 的成员变量表    



          成员变量                     类型                              作用  

 m_StaticClr                CStatic             显示颜色区域  

 m_StaticPic                CStatic             显示图像区域  



     为应用程序添加一个 bmp 资源 IDB_BITMAP1 ,设置图片控件的属性,如图 7…6 所示。  



                                                                              



                                    图 7…6    设置图片框属性    



     2 .添加响应代码  



     添加响应鼠标单击的代码,用来得到鼠标落点的颜色并且显示出来。代码如下:  



                                                                                     ·173 ·  


…………………………………………………………Page 183……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通  



       //  响应鼠标左键落在图片区域的操作  



       void CColorDlg::OnLButtonDown(UINT nFlags; CPoint point)    



       {  



              // TODO: Add your message handler code here and/or call default  



              CRect picRect; clrRect;  



              CBrush newBrush; *oldBrush;  



              COLORREF rgb;  



              CClientDC dc(this);  



                



              //  得到图片所在的区域矩形  



              m_StaticPic。GetWindowRect(picRect);  



              ScreenToClient(picRect);  



         



              //  得到颜色所在的区域矩形  



              m_StaticClr。GetWindowRect(clrRect);  



              ScreenToClient(clrRect);  



         



              //  如果鼠标落在图像区域  



              if(picRect。PtInRect(point))  



              {  



                     //  得到该点的像素  



                     rgb = dc。GetPixel(point);  



         



                     //  生成新的画刷  



                     newBrush。CreateSolidBrush(rgb);  



         



                     //  设备选择新的画刷  



                     oldBrush = dc。SelectObject(&newBrush);  



         



                     //  用�
返回目录 上一页 下一页 回到顶部 赞(1) 踩(1)
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!