注册 |登录

0GiNr技术社区论坛系统常规开发 › 查看主题

757

查看

2

回复
返回列表

Rank: 2Rank: 2

金钱
1257 元 
经验
244 点 
威望
12 点 
贡献
0 点 
精华
go

[C/Java] Binary Clock Demo

1
发表于 2010-2-5 11:17 | 只看该作者 | 倒序看帖 | 打印
凡本论坛原创内容,其作者享有著作权,未经许可谢绝转载。
RT
  其实这个是偶源代码导读系列的一个作品……极度无聊

/**************************************************

** Project:BinaryClock

** File:BinaryClockDlg.cpp

** Edition:v1.0.0 Demo

** Coder:KingsamChen [MDSA Group]

** Last Modify:2010-1-10

**************************************************/

#include "stdafx.h"
#include "BinaryClock.h"
#include "BinaryClockDlg.h"
#include ".\binaryclockdlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CBinaryClockDlg 对话框



CBinaryClockDlg::CBinaryClockDlg(CWnd* pParent /*=NULL*/)
  :
CDialog(CBinaryClockDlg::IDD, pParent)
{
  
m_hIcon = AfxGetApp()->LoadIcon(IDR_CLOCKICO);
}


void CBinaryClockDlg::DoDataExchange(CDataExchange* pDX)
{
  
CDialog::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CBinaryClockDlg, CDialog)
  
ON_WM_PAINT()
  
ON_WM_QUERYDRAGICON()
  
ON_WM_TIMER()
  
//}}AFX_MSG_MAP
END_MESSAGE_MAP()


// CBinaryClockDlg 消息处理程序
BOOL CBinaryClockDlg::OnInitDialog()
{
  
CDialog::OnInitDialog();

  
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
  // 执行此操作
  
SetIcon(m_hIcon, TRUE);      // 设置大图标
  
SetIcon(m_hIcon, FALSE);    // 设置小图标

  // 加载Bitmap
  
m_hNumber0 = ::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_NUMBER0));
  
m_hNumber1 = ::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_NUMBER1));

  
// 设置定时器700ms触发一次
  
VERIFY(SetTimer(UPDATE_TIMER, TIMEELAPSE, NULL));

  
return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE
}


// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。
void CBinaryClockDlg::OnPaint()
{
  
if (IsIconic())
  {
   
CPaintDC dc(this); // 用于绘制的设备上下文

   
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

   
// 使图标在工作矩形中居中
   
int cxIcon = GetSystemMetrics(SM_CXICON);
   
int cyIcon = GetSystemMetrics(SM_CYICON);
   
CRect rect;
   
GetClientRect(&rect);
   
int x = (rect.Width() - cxIcon + 1) / 2;
   
int y = (rect.Height() - cyIcon + 1) / 2;

   
// 绘制图标
   
dc.DrawIcon(x, y, m_hIcon);
  }
  
else
  
{
   
CDialog::OnPaint();
  }
}


//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CBinaryClockDlg::OnQueryDragIcon()
{
  
return static_cast<HCURSOR>(m_hIcon);
}


/*
  输  入: nIDEvent(UINT) - 定时器ID
  输  出: -
  功  能: 获取日期和时间
*/
void CBinaryClockDlg::OnTimer(UINT nIDEvent)
{
  
if (UPDATE_TIMER == nIDEvent)
  {
   
TCHAR szData[LENGTH] = {0};
   
TCHAR szTime[LENGTH] = {0};

    ::
GetDateFormat(LOCALE_USER_DEFAULT, 0, NULL, _T("yyyyMMdd"), szData, LENGTH);
    ::
GetTimeFormat(LOCALE_USER_DEFAULT, TIME_FORCE24HOURFORMAT, NULL, _T("hhmmss"),
                    
szTime, LENGTH);

   
// 转换日期
   
DecToBin(szData[0], YEAR1, 4);
   
DecToBin(szData[1], YEAR2, 4);
   
DecToBin(szData[2], YEAR3, 4);
   
DecToBin(szData[3], YEAR4, 4);
   
DecToBin(szData[4], MONTH1, 1);
   
DecToBin(szData[5], MONTH2, 4);
   
DecToBin(szData[6], DAY1, 2);
   
DecToBin(szData[7], DAY2, 4);

   
// 转换时间
   
DecToBin(szTime[0], HOUR1, 2);
   
DecToBin(szTime[1], HOUR2, 4);
   
DecToBin(szTime[2], MINUTE1, 3);
   
DecToBin(szTime[3], MINUTE2, 4);
   
DecToBin(szTime[4], SECOND1, 3);
   
DecToBin(szTime[5], SECOND2, 4);
  }  

  
CDialog::OnTimer(nIDEvent);
}


/*
  输  入: -
  输  出: BOOL
  功  能: 清理定时器
*/
BOOL CBinaryClockDlg::DestroyWindow()
{
  
KillTimer(UPDATE_TIMER);  

  
return CDialog::DestroyWindow();
}


/*
  输  入: chBinary(TCHAR) - 原始10进制数字
          nType(int) - 目标类型
          nMaxSize(int) - 最大所需图片数
  输  出: -
  功  能: 将10进制数字转成相应的2进制,并用图显示
*/
void CBinaryClockDlg::DecToBin( TCHAR chBinary, int nType, int nMaxSize )
{
  
// 把TCHAR转成int
  // 0的ASCII是48
  
int nDec = chBinary - 48;
  
int nBinary[4] = {0};  

  
// 把0~9转换成相应的二进制
  // 直接通过查表,使得转换的时间复杂度为O(1)
  // 注意数组下标是从二进制的最高位开始
  
switch (nDec)
  {
   
case 0:
      
break;
   
case 1:
      
nBinary[3] = 1;
      
break;
   
case 2:
      
nBinary[2] = 1;
      
break;
   
case 3:
      
nBinary[2] = nBinary[3] = 1;
      
break;
   
case 4:
      
nBinary[1] = 1;
      
break;
   
case 5:
      
nBinary[1] = nBinary[3] = 1;
      
break;
   
case 6:
      
nBinary[1] = nBinary[2] = 1;
      
break;
   
case 7:
      
nBinary[1] = nBinary[2] = nBinary[3] = 1;
      
break;
   
case 8:
      
nBinary[0] = 1;
      
break;
   
case 9:
      
nBinary[0] = nBinary[3] = 1;
      
break;
  }

  
SetDlgItemInt(nType, nDec, FALSE);
  
int nCount = nType + nMaxSize;

  
// 填充Bitmap
  // 这里要注意的是,是从最底层的图片开始网上填充
  // 某些日期对应的二进制数字位数不同,但是都存在低位
  
for (int n = 0; n < nMaxSize; n++)
  {
   
CStatic* pBmp = (CStatic*)GetDlgItem(nCount - n);
   
pBmp->SetBitmap(nBinary[3 - n] ? m_hNumber1 : m_hNumber0);
  }
}



http://www.uushare.com/user/kingsamchen/file/2412781
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
新Blog http://blog.kingsamchen.com

TOP

0GiNr核心团队

“花”指令

Rank: 12Rank: 12

金钱
1508 元 
经验
3248 点 
威望
365 点 
贡献
34 点 
精华
2
发表于 2010-2-6 03:53 | 只看该作者
然后可以考虑再写一个自动扫描屏幕识别二进制钟读数的程序……

TOP

0GiNr核心团队

论坛管理员

Rank: 12Rank: 12

金钱
10491 元 
经验
10357 点 
威望
205 点 
贡献
17 点 
精华

技术高手

3
发表于 2010-2-6 10:06 | 只看该作者
bd

TOP

0GiNr安全门户 |联系我们

GMT+8, 2010-9-7 20:22.

Powered by Discuz! X1

© 2001-2010 Comsenz Inc.