| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3542 人关注过本帖
标题:[转载]巧用Visual C++编程来实现全屏幕显示功能
只看楼主 加入收藏
云中雾
Rank: 1
等 级:新手上路
威 望:1
帖 子:168
专家分:3
注 册:2005-12-30
收藏
 问题点数:0 回复次数:24 
[转载]巧用Visual C++编程来实现全屏幕显示功能
一、实现方法

  实现程序的全屏幕其实很容易,它的实现思路就是:首先要自定义一个窗口类,重载该窗口类的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,使窗口能够顺利的最大、最小化。可以看出,与本文的实现方法比起来,这种方法实现起来十分繁琐,不太适合初级编程爱好者。
搜索更多相关主题的帖子: Visual 屏幕 
2006-05-28 15:06
phycise
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2006-6-29
收藏
得分:0 
不错,不过内容好像不全!!!!!!!!!!!
2006-07-04 11:06
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
  void CGribbleWnd::OnLButtonDown(UINT nFlags, CPoint point) //响应用户的鼠标单击操作;

  {

   Invalidate();//重画窗口;

  }

这样作会不会画的次数太多?

http://myajax95./
2006-07-04 13:42
aen0716
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2006-7-19
收藏
得分:0 

五体投地阿

2006-07-19 17:31
yzhypieceqjm
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2006-8-10
收藏
得分:0 

我学了C++3个月 我感到我还差的很多 你上面写的我很多函数看不懂 不知道什么意思。我汗

2006-08-10 13:53
wain
Rank: 1
等 级:新手上路
帖 子:71
专家分:0
注 册:2006-6-7
收藏
得分:0 


书上有的是

抄过来就可以了

2006-08-10 16:20
ccchenzhong
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2006-8-11
收藏
得分:0 
OK
2006-08-11 13:35
网上浪子
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2006-9-1
收藏
得分:0 

我才刚开始学,看不懂。

2006-09-01 22:28
khlacc123
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2006-10-9
收藏
得分:0 
我也看不懂,哎,看来还得继续努力了~~~~~~~~~~
2006-10-10 22:03
radcat
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:306
专家分:45
注 册:2006-9-12
收藏
得分:0 

MFC太麻烦了,用sdk改一个参数就行了,WM_POPUP.

2006-10-11 08:33
快速回复:[转载]巧用Visual C++编程来实现全屏幕显示功能
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028542 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved