设为首页 加入收藏

TOP

Visual C++编程实现全屏幕显示(二)
2012-11-04 15:15:43 来源: 作者: 【 】 浏览:365
Tags:Visual 编程 实现 屏幕 显示
  二、程序代码:

////////////////////////////////////////////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 <math.h>
#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,使窗口能够顺利的最大、最小化。可以看出,与本文的实现方法比起来,这种方法实现起来十分繁琐,不太适合初级编程(www.cppentry.com)爱好者。


首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇基于COM接口的Shell扩展技术应用 下一篇利用Visual C++编程实现异型窗口

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: