<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    聚合 管理  

    Blog Stats

    News

    我使用新博客啦:
    http://www.linjunhai.com/
    大家到我的新博客上看看吧!

    隨筆分類(28)

    文章分類(4)

    隨筆檔案(53)

    文章檔案(4)

    相冊

    相關鏈接


    林俊海的博客

    超級大菜鳥,每天要自強!

    一、實現方法

      實現程序的全屏幕其實很容易,它的實現思路就是:首先要自定義一個窗口類,重載該窗口類的OnPaint()或OnDraw()函數,實現具體的窗口顯示功能,然后調用API函數GetDeviceCaps(int nIndex )函數來獲取當前顯示屏幕的尺寸,如nIndex取LOGPIXELSX值可以得到屏幕的寬度(以像素為單位),取LOGPIXELSY值可以得到屏幕的高度。有了屏幕的尺寸還不夠,還必須調用一個API函數MoveWindow()用來定位當前窗口到整個屏幕。需要讀者注意的是,為了實現窗口與用戶的交互,要在窗口中裝載一個光標,另外,為了重全屏幕顯示恢復到正常狀態,需要在該窗口類中處理WM_KEYDOWN消息,在該消息處理函數中識別是否用戶按下了ESC(退出)鍵,如是,程序恢復到正常顯示狀態。下面的代碼實現了上面所有的功能,并且能夠響應鼠標操作,在屏幕上數字曲線。編程步驟如下:

      1、定義一個窗口類CGribbleWnd,它包含兩個整形變量m_pixelsX、m_pixelsY,分別用來存儲窗口的尺寸;

      2、使用CLASSWIZARD重載窗口類的OnPain()函數,實現具體的顯示功能;

      3、使用CLASSWIZARD為窗口類添加WM_CREATE、WM_ERASEBKGND、WM_KEYDOWN、WM_LBUTTONDOWN等消息處理函數,以實現全屏幕窗口和響應用戶操作;

      二、程序代碼:

      ////////////////////////////////////////////CGribbleWnd類的頭文件

      #if !defined(AFX_GRIBBLEWND_H__6E1D4ED1_D9A6_11D4_9B9F_525400DAE6A0__INCLUDED_)

      #define AFX_GRIBBLEWND_H__6E1D4ED1_D9A6_11D4_9B9F_525400DAE6A0__INCLUDED_

      #if _MSC_VER > 1000

      #pragma once

      #endif // _MSC_VER > 1000

      class CGribbleWnd : public CWnd

      {

       // Construction

       public:

      CGribbleWnd();

      // Attributes

       public:

      // screen stuff

      int m_pixelsX;//存放屏幕的寬度;

      int m_pixelsY;//存放屏幕的高度;

      CDC* m_pDC;//設備上下文對象;

      HCURSOR m_hCursor; //光標句柄;

      COLORREF m_backColor; //顏色對象,用來存放用戶自定義的顏色;

      // Operations

      // Overrides

      // ClassWizard generated virtual function overrides

      //{{AFX_VIRTUAL(CGribbleWnd)

      //}}AFX_VIRTUAL

      // Implementation

      virtual ~CGribbleWnd();

      // Generated message map functions

       protected:

      //{{AFX_MSG(CGribbleWnd)

      afx_msg BOOL OnEraseBkgnd(CDC* pDC);

      afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

      afx_msg void OnLButtonDown(UINT nFlags, CPoint point);

      afx_msg void OnPaint();

      afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);

      //}}AFX_MSG

      DECLARE_MESSAGE_MAP()

      };

       //{{AFX_INSERT_LOCATION}}

      #endif // !defined(AFX_GRIBBLEWND_H__6E1D4ED1_D9A6_11D4_9B9F_525400DAE6A0__INCLUDED_)

      /////////////////////////////////////////////////////// CGribleWnd類的實現文件;

      #include "stdafx.h"

      #include "GribbleWnd.h"

      #include

      #ifdef _DEBUG

      #define new DEBUG_NEW

      #undef THIS_FILE

      static char THIS_FILE[] = __FILE__;

      #endif

      CGribbleWnd::CGribbleWnd()//構造函數;

      {

      }

      CGribbleWnd::~CGribbleWnd()//析構函數;

      {

      }

      BEGIN_MESSAGE_MAP(CGribbleWnd, CWnd)

      //{{AFX_MSG_MAP(CGribbleWnd)

      ON_WM_ERASEBKGND()

      ON_WM_CREATE()

      ON_WM_LBUTTONDOWN()

      ON_WM_PAINT()

      ON_WM_KEYDOWN()

      ON_WM_TIMER()

      //}}AFX_MSG_MAP

      END_MESSAGE_MAP()

      BOOL CGribbleWnd::OnEraseBkgnd(CDC* pDC) //重畫背景窗口的背景;

      {

       m_backColor = RGB(125,200,125);//自定義顏色;

       //生成一個新的畫刷,用自定義的顏色刷新顯示區域;

       CBrush cb(m_backColor);

       HBRUSH hOldBrush = (HBRUSH)pDC->SelectObject(cb);

       RECT rect = {0,0,m_pixelsX,m_pixelsY};

       pDC->FillRect(&rect,&cb);

       pDC->SelectObject(hOldBrush);

       cb.DeleteObject();

       return TRUE;

      }

      int CGribbleWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) //創建窗口;

      {

       if (CWnd::OnCreate(lpCreateStruct) == -1)

      return -1;

      // TODO: Add your specialized creation code here

       m_hCursor =LoadCursor(NULL,IDC_ARROW); //裝載鼠標,用來與用戶交互;

       SetCursor(m_hCursor);//將裝載的鼠標附給生成的窗體;

       ShowCursor(true);//顯示鼠標;

       m_pDC = GetDC();//得到當前窗體的設備上下文對象;

       

       m_pixelsX = m_pDC->GetDeviceCaps(HORZRES);//獲取屏幕的寬度;

       m_pixelsY = m_pDC->GetDeviceCaps(VERTRES);//獲取屏幕的高度;

       MoveWindow(0,0,m_pixelsX, m_pixelsY);//將當前窗口全屏幕顯示;

       return 0;

      }

      void CGribbleWnd::OnLButtonDown(UINT nFlags, CPoint point) //響應用戶的鼠標單擊操作;

      {

       Invalidate();//重畫窗口;

      }

      void CGribbleWnd::OnPaint() //實現具體的顯示效果,本例用來顯示數學曲線;

      {

       CPaintDC dc(this); //得到設備上下文對象;

       //下面的代碼用來實現顯示數學曲線;

       static int s_nLisXCoef = 1;

       static int s_nLisYCoef = 3;

       static int s_nLisYOffset = 44;

       ++s_nLisXCoef;

       ++s_nLisYCoef;

       int x,y;

       for (float t = 0; t < 32767; t+=0.2) {

      x = sin(s_nLisXCoef*t) * m_pixelsX/2 + m_pixelsX/2;

      y = sin(s_nLisYCoef*t+s_nLisYOffset) * m_pixelsY/2 + m_pixelsY/2;

      dc.SetPixel(x, y, RGB(255,80,255));

       }

      }

      //響應用戶的按鍵操作,當用戶按下ESC(退出)鍵后,程序恢復正常顯示;

      void CGribbleWnd::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)

      {

       if(VK_ESCAPE == nChar)//判斷當前按下的鍵是否為"ESC"

      DestroyWindow();//銷毀當前窗體;

      CWnd::OnKeyDown(nChar, nRepCnt, nFlags);

       }

      四、小結

      實現程序全屏幕顯示的思路有很多種,例如另外一種可行的思路是:

      1)利用Windows API提供的一個結構體WINDOWPLACEMENT來存儲全屏顯示前視圖和主框架窗口在屏幕上的位置和顯示信息、非客戶區窗口的顯隱信息,以便全屏幕顯示時恢復窗口原狀;

      2)通過API函數::GetDesktopWindow()得到桌面窗口,由::GetWindowRect()得到顯示器的尺寸;

      3)通過::AdjustWindowRect()來計算當客戶區大小為屏幕大小時相應的窗口大小;

      4)通過::SetWindowPlacement()來設置視圖窗口和主窗口為客戶區大小和屏幕大小的窗口;

      5)處理窗口消息WM_GETMINMAXINFO,使窗口能夠順利的最大、最小化。可以看出,與本文的實現方法比起來,這種方法實現起來十分繁瑣,不太適合初級編程愛好者。
    posted on 2007-03-16 21:28 林俊海 閱讀(616) 評論(0)  編輯  收藏 所屬分類: 其它相關
    主站蜘蛛池模板: 亚洲乱人伦精品图片| 国精无码欧精品亚洲一区| 亚洲成电影在线观看青青| 久久aa毛片免费播放嗯啊| 亚洲AV无码久久精品成人| 久久久久久免费一区二区三区| 国产国拍精品亚洲AV片| a级在线免费观看| 亚洲午夜精品久久久久久人妖| 三年片在线观看免费观看大全一 | tom影院亚洲国产一区二区| 亚洲视频免费播放| 亚洲午夜一区二区三区| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 亚洲日本在线免费观看| 亚洲欧洲尹人香蕉综合| 国产在线a免费观看| www亚洲精品久久久乳| 亚洲精品NV久久久久久久久久| 精品无码国产污污污免费网站国产 | 亚洲女子高潮不断爆白浆| 在线观看国产情趣免费视频| 污污的视频在线免费观看| 亚洲色大成网站WWW久久九九| 国产免费无码一区二区 | 免费萌白酱国产一区二区| 一级毛片完整版免费播放一区| 亚洲人成影院在线无码按摩店| 99re免费在线视频| 亚洲欧美日韩国产精品一区| 免费在线观看亚洲| 十八禁在线观看视频播放免费| 亚洲福利电影一区二区?| 日本v片免费一区二区三区| 国内精品免费久久影院| 久久亚洲私人国产精品vA | 中文字幕亚洲一区二区三区| 全部免费毛片在线播放| 成人精品国产亚洲欧洲| 亚洲gv白嫩小受在线观看| 精品免费国产一区二区三区|