聚合 管理  

          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()來計算當客戶區大小為屏幕大小時相應的窗口大?。?br>
            4)通過::SetWindowPlacement()來設置視圖窗口和主窗口為客戶區大小和屏幕大小的窗口;

            5)處理窗口消息WM_GETMINMAXINFO,使窗口能夠順利的最大、最小化。可以看出,與本文的實現方法比起來,這種方法實現起來十分繁瑣,不太適合初級編程愛好者。
          posted on 2007-03-16 21:28 林俊海 閱讀(620) 評論(0)  編輯  收藏 所屬分類: 其它相關
          主站蜘蛛池模板: 墨脱县| 静安区| 丹阳市| 远安县| 游戏| 鄂州市| 潼关县| 三江| 彩票| 民乐县| 黄龙县| 林芝县| 大悟县| 灵璧县| 绥滨县| 邯郸县| 从江县| 新干县| 四子王旗| 海伦市| 普安县| 镇江市| 油尖旺区| 东源县| 丽水市| 武定县| 沁源县| 永川市| 家居| 普兰店市| 屏山县| 塘沽区| 涡阳县| 漯河市| 大英县| 安多县| 马关县| 大埔县| 湛江市| 利辛县| 古田县|