SetWindowExt与SetViewportExt OnTimer与SetTimer VC系统时间调用

SetWindowExt设定窗口尺寸,SetViewportExt设定视口尺寸。  
  窗口尺寸以逻辑单位计算,视口尺寸以物理单位计算。   

 

          CRect   rectClient;   

     
          GetClientRect(rectClient);//取窗口物理尺寸(单位:像素)  
          pDC->SetMapMode(MM_ANISOTROPIC);  
          pDC->SetWindowExt(1000,   1000);//窗口逻辑大小:1000*1000,  
          pDC->SetViewportExt(rectClient.right,   -rectClient.bottom);//改变Y坐标方向--viewport使用物理大小  
          pDC->SetViewportOrg(rectClient.right   /   2,   rectClient.bottom   /   2);//设置窗口中心点为坐标系原点--Viewport使用物理大小  
         
          pDC->Ellipse(CRect(-500,   -500,   500,   500));//以逻辑单位画图---普通GDI   API使用逻辑单位  
   
  默认方式下,物理/逻辑值是1:1关系,可换用。但使用SetWindowExt/SetViewportExt后两者不可混用。

 

 

 

 

 

 

UINT_PTR SetTimer(         
    HWND hWnd,//
和定时器相关联的窗口
    UINT_PTR nIDEvent,//
一个非0的数字标志这个定时器
    UINT uElapse,//
指定时间间隔,以毫秒为单位
    TIMERPROC lpTimerFunc//
一般指定为null
);
当在MFC的工程中如下:
UINT_PTR SetTimer(         
    UINT_PTR nIDEvent,//
一个非0的数字标志这个定时器
    UINT uElapse,//
指定时间间隔,以毫秒为单位
    TIMERPROC lpTimerFunc//
一般指定为null
);
用法如下:

SetTimer(1,1000,NULL);//
设置了一个1s的定时器1.
然后在每次时间到1s时会触发WM_TIMER消息,其消息响应函数如下:
void CXXX::OnTimer(UINT_PTR nIDEvent)
{
// TODO:
在此添加消息处理程序代码和/或调用默认值
        //
此处加入如下代码就好了:
        switch()
        {
        case 1:
              //
做该做的事情
                //
当不需要的时候在此处调用KillTimer(1);
              break;
        default:
              break;
        }
CDialog::OnTimer(nIDEvent);
}

 

 

 

 

 

/************************************************************************ 
系统:windows XP 
工具:VS2008 
************************************************************************/
 
#include <stdio.h> 
#include <iostream> 
#include <Windows.h> 
#include <time.h> 
#include <string>  
 
using namespace std;  
 
void IntToDate1(time_t tm,string &);  
void IntToDate2(time_t tm,string &);  
void GetSysTime(string &tmp_tm);  
 
/* 
说明:struct tm  
{  
    int tm_sec;   /*秒,0-59*/   
    int tm_min;   /*分,0-59*/   
    int tm_hour;  /*时,0-23*/   
    int tm_mday;  /*天数,1-31*/   
    int tm_mon;   /*月数,0-11*/   
    int tm_year;  /*自1900的年数*/   
    int tm_wday;  /*自星期日的天数0-6*/   
    int tm_yday;  /*自1月1日起的天数,0-365*/   
    int tm_isdst; /*是否采用夏时制,采用为正数*  
}  
 
在VC++中,我们可以借助CTime时间类,获取系统当前日期:  
 
CTime t = CTime::GetCurrentTime(); //获取系统日期  
 
int d=t.GetDay(); //获得几号  
 
int y=t.GetYear(); //获取年份  
 
int m=t.GetMonth(); //获取当前月份  
 
int h=t.GetHour(); //获取当前为几时  
 
int mm=t.GetMinute(); //获取分钟  
 
int s=t.GetSecond(); //获取秒  
 
int w=t.GetDayOfWeek(); //获取星期几,注意1为星期天,7为星期六 
 
1 使用time_t time( time_t * timer )    精确到秒 
 计算时间差使用double difftime( time_t timer1, time_t timer0 ) 
2 使用clock_t clock() 得到的是CPU时间    精确到1/CLOCKS_PER_SEC秒 
3 使用DWORD GetTickCount() 得到的是系统运行的时间 精确到毫秒 
4 如果使用MFC的CTime类,可以用CTime::GetCurrentTime() 精确到秒 
5 要获取高精度时间,可以使用 
  BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)获取系统的计数器的频率 
  BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount)获取计数器的值 
  然后用两次计数器的差除以Frequency就得到时间。 
6 还有David的文章中提到的方法: 
  Multimedia Timer Functions 
  The following functions are used with multimedia timers. 
  timeBeginPeriod/timeEndPeriod/timeGetDevCaps/timeGetSystemTime 
  timeGetTime/timeKillEvent/TimeProc/timeSetEvent  精度很高 
  Q:GetTickCount()函数,说是毫秒记数,是真的吗,还是精确到55毫秒? 
  A: 
  GetTickCount()和GetCurrentTime()都只精确到55ms(1个tick就是55ms)。如果要精确到毫秒, 
  应该使用timeGetTime函数或QueryPerformanceCounter函数。具体例子可以参考QA001022  
  "VC++中使用高精度定时器"、QA001813 "如何在Windows实现准确的定时"和QA004842 "timeGetTime函数延时不准"。 
   
  Q:vc++怎样获取系统时间,返回值是什么类型的变量呢? 
  GetSystemTime返回的是格林威志标准时间  
  GetLocalTime,和上面用法一样,返回的是你所在地区的时间,中国返回的是北京时间  
 
  VOID GetSystemTime(  
  LPSYSTEMTIME lpSystemTime // address of system time structure  
  );  
  函数就可以获得了,其中LPSYSTEMTIME 是个结构体  
  含:年,月,日,周几,小时,分,秒,毫秒。 
 
*/ 
 
int main(int argc, char **argv)  
{  
 
    time_t t = 1253683761;  
 
    cout << "两者时间相隔的秒数:" << difftime(time(NULL), t) << endl;  
 
    string time_tmp;  
 
    IntToDate1(t, time_tmp);  
    cout << time_tmp << endl;  
 
    time_tmp = "";  
    IntToDate2(t, time_tmp);  
    cout << time_tmp << endl;  
 
    time_tmp = "";  
    GetSysTime(time_tmp);  
    cout << time_tmp << endl;  
 
    time_tmp = "";  
    time_t temp = time(NULL);  
    t=temp;  
    IntToDate1(t, time_tmp);  
    cout << time_tmp << endl;  
 
    return 0;  
}  
 
/************************************************************************/ 
/* 第一种方式:根据指定的数字输出对应的时间                             */ 
/* date: 2009-06-03                                                     */ 
/* auth: xgq                                                            */ 
/************************************************************************/ 
void IntToDate1(time_t tm, string &tmp_tm)  
{  
    time_t t = tm;  
 
    struct tm tm1 = *localtime(&t);  
 
    char tmp[40];  
 
    sprintf( tmp, "%.4d-%.2d-%.2d %.2d:%.2d:%.2d", 1900+tm1.tm_year, /  
        tm1.tm_mon+1, tm1.tm_mday, tm1.tm_hour, tm1.tm_min, tm1.tm_sec );    
 
    tmp_tm = tmp;  
}  
 
/************************************************************************/ 
/* 第二种方式:使用系统函数                                             */ 
/* size_t strftime(char *strDest, size_t maxsize, const char *format,   */ 
/* const struct tm *timeptr);                                           */ 
/* 根据格式字符串生成字符串。                                           */ 
/* struct tm *localtime(const time_t *timer);                           */ 
/* 取得当地时间,localtime获取的结果由结构tm返回                        */ 
/* 返回的字符串可以依下列的格式而定:                                   */ 
/* %a 星期几的缩写。Eg:Tue                                              */ 
/* %A 星期几的全名。 Eg: Tuesday                                        */ 
/* %b 月份名称的缩写。                                                  */ 
/* %B 月份名称的全名。                                                  */ 
/* %c 本地端日期时间较佳表示字符串。                                    */ 
/* %d 用数字表示本月的第几天 (范围为 00 至 31)。日期                    */ 
/* %H 用 24 小时制数字表示小时数 (范围为 00 至 23)。                    */ 
/* %I 用 12 小时制数字表示小时数 (范围为 01 至 12)。                    */ 
/* %j 以数字表示当年度的第几天 (范围为 001 至 366)。                    */ 
/* %m 月份的数字 (范围由 1 至 12)。                                     */ 
/* %M 分钟。                                                            */ 
/* %p 以 ''AM'' 或 ''PM'' 表示本地端时间。                              */ 
/* %S 秒数。                                                            */ 
/* %U 数字表示为本年度的第几周,第一个星期由第一个周日开始。            */ 
/* %W 数字表示为本年度的第几周,第一个星期由第一个周一开始。            */ 
/* %w 用数字表示本周的第几天 ( 0 为周日)。                              */ 
/* %x 不含时间的日期表示法。                                            */ 
/* %X 不含日期的时间表示法。 Eg: 15:26:30                               */ 
/* %y 二位数字表示年份 (范围由 00 至 99)。                              */ 
/* %Y 完整的年份数字表示,即四位数。 Eg:2008                            */ 
/* %Z(%z) 时区或名称缩写。Eg:中国标准时间                               */   
/* %% % 字符。                                                          */ 
/* date: 2009-06-03                                                     */ 
/* auth: xgq                                                            */ 
/************************************************************************/ 
void IntToDate2(time_t tm, string &tmp_tm)  
{  
    time_t t = tm;  
 
    char tmp[64];  
      
    strftime( tmp, sizeof(tmp), "%Y/%m/%d %X %A 本年第%j天 %z",localtime(&t) );  
 
    tmp_tm = tmp;  
}  
 
/************************************************************************/ 
/* 第三种方式:使用window系统API获取毫秒级的时间                        */ 
/* date: 2009-06-03                                                     */ 
/* auth: xgq                                                            */ 
/************************************************************************/ 
void GetSysTime(string &tmp_tm)  
{  
    SYSTEMTIME sys;      
      
    GetLocalTime( &sys );      
 
    char tmp[64];  
 
    sprintf(tmp, "%4d/%02d/%02d %02d:%02d:%02d.%03d 星期%1d/n",sys.wYear,sys.wMonth,/  
        sys.wDay,sys.wHour,sys.wMinute, sys.wSecond,sys.wMilliseconds,sys.wDayOfWeek);   
 
    tmp_tm = tmp;  

你可能感兴趣的:(timer,String,struct,null,Integer,iostream)