人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當前位置:蘿卜系統下載站 > 技術開發教程 > 詳細頁面

靈活運用Visual C++編程來完成全屏幕顯示技巧

靈活運用Visual C++編程來完成全屏幕顯示技巧

更新時間:2022-09-02 文章作者:未知 信息來源:網絡 閱讀次數:

文/劉濤

  前言:

  在Visual C++編程中,有時需要采用盡量大的區域來作為顯示區域,那么實現程序的全屏幕顯示就不失為一種很好的選擇了,所謂全屏幕顯示,就是程序界面上沒有菜單條、工具條等附加項,整個顯示屏幕作為一個顯示窗口來顯示數據或圖像,Windows的很多應用程序都提供了全屏幕顯示功能,如Word、Excel和IE等。本例通過響應鼠標單擊在全屏幕上畫數字曲線來說明如何實現程序的全屏幕顯示。

  一、實現方法

  實現程序的全屏幕其實很容易,它的實現思路就是:首先要自定義一個窗口類,重載該窗口類的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,使窗口能夠順利的最大、最小化。可以看出,與本文的實現方法比起來,這種方法實現起來十分繁瑣,不太適合初級編程愛好者。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

網站地圖xml | 網站地圖html
主站蜘蛛池模板: 平和县| 潮州市| 昆明市| 开平市| 黄龙县| 江永县| 称多县| 武陟县| 武邑县| 威信县| 柳林县| 崇阳县| 双柏县| 淮阳县| 栾城县| 黄龙县| 乾安县| 汉川市| 阿克陶县| 稻城县| 湖南省| 会泽县| 柳河县| 无极县| 大方县| 周宁县| 北票市| 济宁市| 遂平县| 诸暨市| 宁化县| 西峡县| 贞丰县| 长宁区| 邻水| 印江| 浑源县| 商水县| 家居| 平南县| 岳西县|