Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1419811
  • 博文数量: 430
  • 博客积分: 9995
  • 博客等级: 中将
  • 技术积分: 4388
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-24 18:04
文章存档

2013年(1)

2008年(2)

2007年(14)

2006年(413)

分类:

2007-09-29 11:03:50

/*在实现对hour的edit控件进行只可以输入数字时,仍有bug,当光标移向前面时不再输入字母还是可以输出的。可以考虑对这种情况添加控制。或者可以考虑对edit控件另做一个回调函数来控制。*/
#i nclude
#i nclude
#i nclude
#i nclude
#i nclude

#i nclude

#define MWINDOW_LX 0  //window left border x
#define MWINDOW_TY 0  //window topp border y
#define MWINDOW_RX 300 //right x
#define MWINDOW_BY 260 //low y

#define TIMER0  0
#define IDC_RTC1 1000
#define CTRL_RTC "rtcdisp"
#define RTC_SETTIME 800
#define RTC_GETTIME 801
#define RTC_SETHOUR 802
#define RTC_SETMIN 803
#define RTC_SETSEC 804

#define IDC_SET_STATIC0 2000
#define IDC_SET_STATIC1 2001
#define IDC_SET_STATIC2 2002
#define IDC_SET_STATIC3 2003
#define IDC_SET_EDIT1 2011
#define IDC_SET_EDIT2 2012
#define IDC_SET_EDIT3 2013
#define IDC_TEST1 2100
#define IDC_TEST2 2101

#define IDM_CLOCK 3000
#define IDM_SETCLOCK 3001
#define IDM_SYSCLOCK 3002
#define IDM_SETSYSCLOCK 3003
#define IDM_SHOWCLOCK 3004
#define IDM_SYSTEM 3010
#define IDM_EXIT 3011
#define IDM_ABOUT 3012
HWND hMainWnd;
HWND s_myhwnd;

typedef struct time{
 int hour;
 int min;
 int sec;
}Time;
int showclock;
#define TDRAW_BAS_X 2
#define TDRAW_BAS_Y 23
static void DispTimeSub(HDC hdc, int x, int y, int r)
{
//draw point(x,y) and four point side of it
 x=TDRAW_BAS_X+r+x;
 y=TDRAW_BAS_Y+r+y;
 SetPixel(hdc,x,y,PIXEL_magenta);
 SetPixel(hdc,x+1,y,PIXEL_magenta);
 SetPixel(hdc,x-1,y,PIXEL_magenta);
 SetPixel(hdc,x,y+1,PIXEL_magenta);
 SetPixel(hdc,x,y-1,PIXEL_magenta);
}
static void DispTimeSubHL(HDC hdc, int x, int y, int r)
{
//draw point(x,y)'s top and under line
 x=TDRAW_BAS_X+r+x;
 y=TDRAW_BAS_Y+r+y;
 SetPenColor(hdc,PIXEL_magenta);
 MoveTo(hdc,x,y-1);
 LineTo(hdc,x-3,y-1);
 MoveTo(hdc,x,y+1);
 LineTo(hdc,x-3,y+1);
}
static void DispTimeSubHR(HDC hdc,int x, int y, int r)
{
//draw point(x,y)'s top and under line
 x=TDRAW_BAS_X+r+x;
 y=TDRAW_BAS_Y+r+y;
 SetPenColor(hdc,PIXEL_magenta);
 MoveTo(hdc,x,y-1);
 LineTo(hdc,x+3,y-1);
 MoveTo(hdc,x,y+1);
 LineTo(hdc,x+3,y+1);
}
static void DispTimeSubLT(HDC hdc,int x, int y, int r)
{
//draw point(x,y)'s lift and right line
 x=TDRAW_BAS_X+r+x;
 y=TDRAW_BAS_Y+r+y;
 SetPenColor(hdc,PIXEL_magenta);
 MoveTo(hdc,x-1,y);
 LineTo(hdc,x-1,y-4);
 MoveTo(hdc,x+1,y);
 LineTo(hdc,x+1,y-4);
}
static void DispTimeSubLB(HDC hdc,int x, int y, int r)
{
//draw point(x,y)'s lift and right line
 x=TDRAW_BAS_X+r+x;
 y=TDRAW_BAS_Y+r+y;
 SetPenColor(hdc,PIXEL_magenta);
 MoveTo(hdc,x-1,y);
 LineTo(hdc,x-1,y+4);
 MoveTo(hdc,x+1,y);
 LineTo(hdc,x+1,y+4);
}
//round's  radius is 40 ,twelve point of it's 30 degree
static const POINT PD_R40D30[]={ {40,0},{34,19},{20,34},{0,39},
     {-19,34},{-34,20},{-40,0},{-34,-20},
     {-19,-34},{0,-39},{20,-34},{34,-19}
    };
static void DrawTimeFrame(HDC hdc,int hight)
{
 int i;
 SetPenColor(hdc,PIXEL_blue);
 MoveTo(hdc,0,hight);
 LineTo(hdc,90,hight);
 MoveTo(hdc,0,hight+2);
 LineTo(hdc,90,hight+2);
//note:  the array of PD_R40D30 begin at right place,that the place of 3 hour.
 for(i=0; i<12; i++)
 {
  if((i%3) == 0)
  {
   if((i == 0) || (i == 6))
   {
    if(i == 0)
               DispTimeSubHL(hdc,PD_R40D30[i].x,PD_R40D30[i].y,40);
    else
        DispTimeSubHR(hdc,PD_R40D30[i].x,PD_R40D30[i].y,40);
   }
   else
   {
    if(i == 3)
        DispTimeSubLT(hdc,PD_R40D30[i].x,PD_R40D30[i].y,40);
    else
        DispTimeSubLB(hdc,PD_R40D30[i].x,PD_R40D30[i].y,40);
   }
  }
  else
  {
   DispTimeSub(hdc,PD_R40D30[i].x,PD_R40D30[i].y,40);
  }
 }
}
static const POINT PD_R30D6[]={
{30,0},{29,3},{29,6},{28,9},{27,12},{25,14},{24,17},{22,20},{20,22},{17,24},
{15,25},{12,27},{9,28},{6,29},{3,29},{0,29},{-3,29},{-6,29},{-9,28},{-12,27},
{-14,25},{-17,24},{-20,22},{-22,20},{-27,17},{-25,15},{-27,12},{-28,9},{-29,6},{-29,3},
{-29,0},{-29,-3},{-29,-6},{-28,-9},{-27,-12},{-25,-14},{-24,-17},{-22,-20},{-20,-22},{-17,-24},
{-15,-25},{-12,-27},{-9,-28},{-6,-29},{-3,-29},{0,-29},{3,-29},{6,-29},{9,-28},{12,-27},
{14,-25},{17,-24},{20,-22},{22,-20},{24,-17},{25,-15},{27,-12},{28,-9},{29,-6},{29,-3}
};
static const POINT PD_R20D5[]={
{20,0},{19,1},{19,3},{19,5},{18,6},{18,8},{17,9},{16,11},{15,12},{14,14},
{12,15},{11,16},{10,17},{8,18},{6,18},{5,19},{3,19},{1,19},{0,19},{-1,19},
{-3,19},{-5,19},{-6,18},{-8,18},{-9,17},{-11,16},{-12,15},{-14,14},{-15,12},{-16,11},
{-17,10},{-18,8},{-18,6},{-19,5},{-19,3},{-19,1},{-19,0},{-19,-1},{-19,-3},{-19,-5},
{-18,-6},{-18,-8},{-17,-9},{-16,-11},{-15,-12},{-14,-14},{-12,-15},{-11,-16},{-10,-17},{-8,-18},
{-6,-18},{-5,-19},{-3,-19},{-1,-19},{0,-19},{1,-19},{3,-19},{5,-19},{6,-18},{8,-18},
{9,-17},{11,-16},{12,-15},{14,-14},{15,-12},{16,-11},{17,-10},{18,-8},{18,-6},{19,-5},
{19,-3},{19,-1}
};
    
static int old_minx=0;
static int old_miny=0;
static int old_hourx=0;
static int old_houry=0;
static int old_secx=0;
static int old_secy=0;
static void DrawTime(HWND hWnd,HDC hdc,Time *rtime)
{
 int secx,secy;
 static int r=40;
 int rx,ry;
 int x,y;
 int n;
 int bak;
//calculate clock's the centre of a circle   coordinate
 rx=TDRAW_BAS_X+r;
 ry=TDRAW_BAS_Y+r;
 
 n=rtime->sec;
 n=n+45;
 if(n > 59)
  n=n-60;
 secx=TDRAW_BAS_X+r+PD_R30D6[n].x;
 secy=TDRAW_BAS_Y+r+PD_R30D6[n].y;
 bak=GetWindowBkColor(hWnd);
 if((old_secx+old_secy) != 0)
 {
  SetPenColor(hdc,bak);
  MoveTo(hdc,rx,ry);
  LineTo(hdc,old_secx,old_secy);
 }
//show second hand
 SetPenColor(hdc,PIXEL_red);
 MoveTo(hdc,rx,ry);
 LineTo(hdc,secx,secy);
 old_secx=secx;
 old_secy=secy;
 
//calculate min whether or not move
//note:  the array of PD_R30D6 begin at right place,that the place of 3 hour.
//rtime->min/60  is percent  the first 60 is clock divide up 60 part
 n=60*rtime->min/60;
//see above note,when n is 0,it must add 45 from 3 hour place.
 n=n+45;
 if(n > 59)
  n=n-60;
 x=TDRAW_BAS_X+r+PD_R30D6[n].x;
 y=TDRAW_BAS_Y+r+PD_R30D6[n].y;
// if((x == old_minx) && (y == old_miny))
//  return ;
//delete old hour hand and minute hand
 bak=GetWindowBkColor(hWnd);
 if((old_minx+old_miny) != 0)
 {
  SetPenColor(hdc,bak);
  MoveTo(hdc,rx,ry);
  LineTo(hdc,old_minx,old_miny);
 }
 SetPenType(hdc,PT_SOLID);
 SetPenWidth(hdc,2);
 if((old_hourx+old_houry) != 0)
 {
  SetPenColor(hdc,bak);
  LineEx(hdc,rx,ry,old_hourx,old_houry);
 }
//show minute hand
 SetPenColor(hdc,PIXEL_darkgray);
 MoveTo(hdc,rx,ry);
 LineTo(hdc,x,y);
 old_minx=x;
 old_miny=y;
//show hour hand
//because 24 hours.but clock show 12 hours.
 if((rtime->hour) > 11)
  bak=rtime->min+(rtime->hour-12)*60;
 else
  bak=rtime->min+rtime->hour*60;
//calculate hour*60+minute. the bak is all minute.12 hours is  60*12=720 minute.
//bak/720 is percent .the 72 is clock divide up 72 part.
//the same as minute disposal
 n=72*bak/720;
 n=n+54;
 if(n > 71)
  n=n-72;
 x=TDRAW_BAS_X+r+PD_R20D5[n].x;
 y=TDRAW_BAS_Y+r+PD_R20D5[n].y;
 LineEx(hdc,rx,ry,x,y);
 old_hourx=x;
 old_houry=y;
}
DispTimeNum(HDC hdc,Time *rtime)
{
 char disp_buf[50];
 sprintf(disp_buf,"%02d:%02d:%02d",rtime->hour,rtime->min,rtime->sec);
 TextOut(hdc,0,0,disp_buf);
}
static Time s_rtime;
static int RTCControlProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
 HDC hdc;
// static Time s_rtime;
 static PLOGFONT s_font;
 Time *p_btime;
 
 switch(message)
 {
  case MSG_CREATE:
   s_font=CreateLogFont(NULL,"Courier","ISO8859-1",
      FONT_WEIGHT_BOLD,
      FONT_SLANT_ROMAN,
      FONT_SETWIDTH_NORMAL,
      FONT_SPACING_CHARCELL,
      FONT_UNDERLINE_NONE,
      FONT_STRUCKOUT_NONE,
      16,0);
   p_btime=(Time *)GetWindowAdditionalData(hWnd);
   if(p_btime != NULL)
   {
    if((p_btime->hour) > 23)
     s_rtime.hour=0;
    else
     s_rtime.hour=p_btime->hour;
    if((p_btime->min) > 59)
     s_rtime.min=0;
    else
     s_rtime.min=p_btime->min;
    if((p_btime->sec) >59)
     s_rtime.sec=0;
    else
     s_rtime.sec=p_btime->sec;
   }
   else
   {
    s_rtime.hour=0;
    s_rtime.min=0;
    s_rtime.sec=0;
   }
   SetTimer(hWnd,TIMER0,100);
   break;
  case MSG_PAINT:
   hdc=BeginPaint(hWnd);
   SelectFont(hdc,s_font);
   DispTimeNum(hdc,&s_rtime);
   DrawTimeFrame(hdc,17);
   DrawTime(hdc,hdc,&s_rtime);
   EndPaint(hWnd,hdc);
   return 0;
  case MSG_TIMER:
   if(wParam == TIMER0)
   {
    if((++s_rtime.sec) > 59)
    {
     s_rtime.sec=0;
     if((++s_rtime.min) > 59)
     {
      s_rtime.min=0;
      if((++s_rtime.hour) > 23)
       s_rtime.hour=0;
     }
    }
   }
   hdc=GetClientDC(hWnd);
   SelectFont(hdc,s_font);
   DispTimeNum(hdc,&s_rtime);
   DrawTime(hWnd,hdc,&s_rtime);
   ReleaseDC(hdc);
   break;
  case RTC_SETTIME:
   p_btime=(Time *)lParam;
   if(p_btime != NULL)
   {
    if((p_btime->hour) > 23)
     s_rtime.hour=0;
    else
     s_rtime.hour=p_btime->hour;
    if((p_btime->min) > 59)
     s_rtime.min=0;
    else
     s_rtime.min=p_btime->min;
    if((p_btime->sec) >59)
     s_rtime.sec=0;
    else
     s_rtime.sec=p_btime->sec;
    hdc=GetClientDC(hWnd);
    SelectFont(hdc,s_font);
    DispTimeNum(hdc,&s_rtime);
    DrawTime(hWnd,hdc,&s_rtime);
    ReleaseDC(hdc);
   }
   break;
  case RTC_GETTIME:
   p_btime=(Time*)lParam;
   if(p_btime != NULL)
   {
    p_btime->hour=s_rtime.hour;
    p_btime->min=s_rtime.min;
    p_btime->sec=s_rtime.sec;
   }
   break;
  case RTC_SETHOUR:
   if(lParam > 23)
    s_rtime.hour=0;
   else
    s_rtime.hour=lParam;
   hdc=GetClientDC(hWnd);
   SelectFont(hdc,s_font);
   DispTimeNum(hdc,&s_rtime);
   DrawTime(hWnd,hdc,&s_rtime);
   ReleaseDC(hdc);
   break;
  case RTC_SETMIN:
   if(lParam > 59)
    s_rtime.min=0;
   else
    s_rtime.min=lParam;
   hdc=GetClientDC(hWnd);
   SelectFont(hdc,s_font);
   DispTimeNum(hdc,&s_rtime);
   DrawTime(hWnd,hdc,&s_rtime);
   ReleaseDC(hdc);
   break;
  case RTC_SETSEC:
   if(lParam > 59)
    s_rtime.sec=0;
   else
    s_rtime.sec=lParam;
   hdc=GetClientDC(hWnd);
   SelectFont(hdc,s_font);
   DispTimeNum(hdc,&s_rtime);
   DrawTime(hWnd,hdc,&s_rtime);
   ReleaseDC(hdc);
   break;
  case MSG_DESTROY:
   KillTimer(hWnd,TIMER0);
   break;
  default:
   return (DefaultControlProc(hWnd,message,wParam,lParam));
 }
 return 0;
}

static BOOL RegisterMyControl(void)
{
 WNDCLASS MyClass;
 MyClass.spClassName=CTRL_RTC;
 MyClass.dwStyle=WS_NONE;
 MyClass.dwExStyle=WS_EX_NONE;
 MyClass.hCursor=GetSystemCursor(IDC_BUSY);
 MyClass.iBkColor=COLOR_lightwhite;
 MyClass.WinProc=RTCControlProc;

 return RegisterWindowClass(&MyClass);
}
static void UnregisterMyControl(void)
{
 UnregisterWindowClass(CTRL_RTC);
}
static DLGTEMPLATE DlgSetTime=
{
 WS_BORDER | WS_CAPTION,
 WS_EX_NONE,
 100,100,250,250,
 "set time",
 0,
 0,
 9,
 NULL,
 0
};
static CTRLDATA CtrlInitData[]=
{
 {
  "static",
  WS_VISIBLE | SS_SIMPLE,
  40,40,50,20,
  IDC_SET_STATIC0,
  "set time",
  0,
  WS_EX_NONE
 },
 {
  "static",
  WS_VISIBLE | SS_SIMPLE,
  40,70,40,20,
  IDC_SET_STATIC1,
  "hour",
  0,
  WS_EX_NONE
 },
 {
  "static",
  WS_VISIBLE | SS_SIMPLE,
  40,100,40,20,
  IDC_SET_STATIC2,
  "minute",
  0,
  WS_EX_NONE
 },
 {
  "static",
  WS_VISIBLE | SS_SIMPLE,
  40,130,40,20,
  IDC_SET_STATIC3,
  "second",
  0,
  WS_EX_NONE
 },
 {
  "edit",
  WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,
  85,70,40,20,
  IDC_SET_EDIT1,
  "",
  0,
  WS_EX_NONE
 },
 {
  "edit",
  WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,
  85,100,40,20,
  IDC_SET_EDIT2,
  "",
  0,
  WS_EX_NONE
 },
 {
  "edit",
  WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,
  85,130,40,20,
  IDC_SET_EDIT3,
  "",
  0,
  WS_EX_NONE
 },
 {
  "button",
  WS_VISIBLE | WS_TABSTOP | BS_DEFPUSHBUTTON,
  40,170,50,30,
  IDOK,
  "OK",
  0,
  WS_EX_NONE
 },
 {
  "button",
  WS_VISIBLE | WS_TABSTOP,
  100,170,50,30,
  IDCANCEL,
  "CANCEL",
  0,
  WS_EX_NONE
 }
};
static int DialogBoxProc(HWND hDlg, int message, WPARAM wParam, LPARAM lParam)
{
 char sethour[5]={0};
 char setmin[5]={0};
 char setsec[5]={0};
 Time set_time;
 int id,nc;
 char ch;
 static char buf[10]={0};
 static int i=0,k;
 static char ppbuf[10]={0};
 int j;
 PPOINT pt;
 switch(message)
 {
  case MSG_INITDIALOG:
  // SendMessage(GetDlgItem(hDlg,IDC_SET_EDIT1),EM_LIMITTEXT,2,0L);
   SendMessage(GetDlgItem(hDlg,IDC_SET_EDIT2),EM_LIMITTEXT,2,0L);
   SendMessage(GetDlgItem(hDlg,IDC_SET_EDIT3),EM_LIMITTEXT,2,0L);
   return 1;
  case MSG_COMMAND:
   id=LOWORD(wParam);
   nc=HIWORD(wParam);
   if(id == IDC_SET_EDIT1 && nc ==EN_CHANGE)
   {
   
   GetWindowText(GetDlgItem(hDlg,IDC_SET_EDIT1),buf,10);
    if(buf[i] < '0' || buf[i] > '9' && i != 0)
    {
    strcpy(ppbuf,buf);
   SetWindowText(GetDlgItem(hDlg,IDC_SET_EDIT1),"");
    k=i;
    i=0;
    for(j=0;j SendMessage(GetDlgItem(hDlg,IDC_SET_EDIT1),MSG_CHAR,ppbuf[j],0L);
     
    }
    else
     i++;
    break;
   }
   switch(wParam)
   {
    case IDOK:
    GetWindowText(GetDlgItem(hDlg,IDC_SET_EDIT1),sethour,2);
    GetWindowText(GetDlgItem(hDlg,IDC_SET_EDIT2),setmin,2);
    GetWindowText(GetDlgItem(hDlg,IDC_SET_EDIT3),setsec,2);
    set_time.hour=atoi(sethour);
    set_time.min=atoi(setmin);
    set_time.sec=atoi(setsec);
    if((set_time.hour < 0) || set_time.hour > 24)
    {
     MessageBox(hDlg,"set hour error","error",MB_OK);
     break;
    }
    if((set_time.min < 0) || set_time.min > 59)
    {
     MessageBox(hDlg,"set minute error","error",MB_OK);
     break;
    }
    if((set_time.sec < 0) || set_time.sec > 59)
    {
     MessageBox(hDlg,"set second error","error",MB_OK);
     break;
    }
    SendMessage(s_myhwnd,RTC_SETTIME,0L,(LPARAM)(&set_time));
   
    
    case IDCANCEL:
     EndDialog(hDlg,wParam);
     DestroyAllControls(hDlg);
     break;
   }
   break;
 }
 return DefaultDialogProc(hDlg,message,wParam,lParam);
}
static void InitDialogBox(HWND hWnd)
{
 DlgSetTime.controls=CtrlInitData;
 DialogBoxIndirectParam(&DlgSetTime,hWnd,DialogBoxProc,0L);
 
}
static HMENU CreateClockMenu(void)
{
 HMENU hmenu;
 MENUITEMINFO mii;

 memset(&mii,0,sizeof(MENUITEMINFO));
 mii.type=MFT_STRING;
 mii.id=0;
 mii.typedata=(DWORD)"Clock";
 hmenu=CreatePopupMenu(&mii);
 
 memset(&mii,0,sizeof(MENUITEMINFO));
 mii.type=MFT_STRING;
 mii.state=0;
 mii.id=IDM_SHOWCLOCK;
 mii.typedata=(DWORD)"ShowClock";
 InsertMenuItem(hmenu,0,TRUE,&mii);
 
 memset(&mii,0,sizeof(MENUITEMINFO));
 mii.type=MFT_STRING;
 mii.state=0;
 mii.id=IDM_SETCLOCK;
 mii.typedata=(DWORD)"SetClock";
 InsertMenuItem(hmenu,1,TRUE,&mii);

 memset(&mii,0,sizeof(MENUITEMINFO));
 mii.type=MFT_STRING;
 mii.state=0;
 mii.id=IDM_SYSCLOCK;
 mii.typedata=(DWORD)"SysClock";
 InsertMenuItem(hmenu,2,TRUE,&mii);
 
 memset(&mii,0,sizeof(MENUITEMINFO));
 mii.type=MFT_STRING;
 mii.state=0;
 mii.id=IDM_SETSYSCLOCK;
 mii.typedata=(DWORD)"SetSysClock";
 InsertMenuItem(hmenu,3,TRUE,&mii);
 return StripPopupHead(hmenu);
}

static HMENU CreateClockSystemMenu(void)
{
 HMENU hmenu;
 MENUITEMINFO mii;

 memset(&mii,0,sizeof(MENUITEMINFO));
 mii.type=MFT_STRING;
 mii.id=0;
 mii.typedata=(DWORD)"System";
 hmenu=CreatePopupMenu(&mii);

 memset(&mii,0,sizeof(MENUITEMINFO));
 mii.type=MFT_STRING;
 mii.state=0;
 mii.id=IDM_ABOUT;
 mii.typedata=(DWORD)"About";
 InsertMenuItem(hmenu,0,TRUE,&mii);
 
 memset(&mii,0,sizeof(MENUITEMINFO));
 mii.type=MFT_STRING;
 mii.state=0;
 mii.id=IDM_EXIT;
 mii.typedata=(DWORD)"Exit";
 InsertMenuItem(hmenu,1,TRUE,&mii);
 return StripPopupHead(hmenu);
}

static HMENU CreateMainMenu(void)
{
 HMENU hmenu;
 MENUITEMINFO mii;
 hmenu=CreateMenu();
 
 memset(&mii,0,sizeof(MENUITEMINFO));
 mii.type=MFT_STRING;
 mii.id=IDM_CLOCK;
 mii.typedata=(DWORD)"Clock";
 mii.hsubmenu=CreateClockMenu();
 InsertMenuItem(hmenu,0,TRUE,&mii);
 
 memset(&mii,0,sizeof(MENUITEMINFO));
 mii.type=MFT_STRING;
 mii.id=IDM_SYSTEM;
 mii.typedata=(DWORD)"System";
 mii.hsubmenu=CreateClockSystemMenu();
 InsertMenuItem(hmenu,1,TRUE,&mii);
 return hmenu;
}
static int GetCurrTime(Time *stime)
{
 time_t now;
 struct tm *currtime;
 time(&now);
 currtime=localtime(&now);
 stime->hour=currtime->tm_hour;
 stime->min=currtime->tm_min;
 stime->sec=currtime->tm_sec;
 return 0;
}
static int SetCurrTime(Time *settime)
{
 time_t now;
 struct tm *currtime;
 time(&now);
 currtime=localtime(&now);
 currtime->tm_hour=settime->hour;
 currtime->tm_min=settime->min;
 currtime->tm_sec=settime->sec;
 now=mktime(currtime);
 stime(&now);
 return 0;
}
static DLGTEMPLATE TestDlg=
{
 WS_BORDER | WS_CAPTION | WS_VISIBLE,
 WS_EX_NONE,
 100,100,300,300,
 "NoModeDlg",
 0,
 0,
 1,
 NULL,
 0
};
static CTRLDATA TestData[]=
{
 /*{
  "CTRL_RTC",
  WS_VISIBLE | SS_SIMPLE,
  50,30,100,16,
  IDC_TEST1,
  "",
  0,
  WS_EX_NONE
 },*/
 {
  "button",
  WS_TABSTOP | WS_VISIBLE | BS_DEFPUSHBUTTON,
  40,70,50,25,
  IDOK,
  "OK",
  0,
  WS_EX_NONE
 }
};
static int TestProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
 Time stime;
 switch(message)
 {
  case MSG_INITDIALOG:
   GetCurrTime(&stime);
   s_myhwnd=CreateWindow(CTRL_RTC,"",WS_VISIBLE | WS_BORDER,
     IDC_RTC1,100,50,90,110,hWnd,(LPARAM)(&stime));
   return 1;
  case MSG_COMMAND:
   switch(wParam)
   {
    case IDOK:
     old_secx=0;
     old_secy=0;
     showclock=0;
     DestroyAllControls(hWnd);
     DestroyMainWindowIndirect(hWnd);
     break;
   }
   break;
  default:
   return DefaultMainWinProc(hWnd,message,wParam,lParam);
 }
 return 0;
}
static void InitTest(HWND hWnd)
{
 TestDlg.controls=TestData;
 CreateMainWindowIndirect(&TestDlg,hWnd,TestProc);
}
//  WinProc()
static int WinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
 HDC hdc;
 static BITMAP s_bmp;
 //static HWND s_myhwnd;
 Time stime;
 time_t now;
 MENUITEMINFO mii;
 static int GUIAPI id_message;
 switch(message)
 {
  case MSG_CREATE:
   if(LoadBitmapFromFile(HDC_SCREEN,&s_bmp,"clock.jpg"))
    return -1;
  // GetCurrTime(&stime);
  // s_myhwnd=CreateWindow(CTRL_RTC,"",WS_VISIBLE | WS_BORDER,
  //   IDC_RTC1,100,50,90,110,hWnd,(LPARAM)(&stime));
   break;
  case MSG_PAINT:
   hdc=BeginPaint(hWnd);
   FillBoxWithBitmap(hdc,MWINDOW_LX,MWINDOW_TY,MWINDOW_RX-MWINDOW_LX,
      MWINDOW_BY-MWINDOW_TY,&s_bmp);
   EndPaint(hWnd,hdc);
   break;
  /*case MSG_LBUTTONDOWN:
   SendMessage(s_myhwnd,RTC_GETTIME,0L,(LPARAM)(&stime));
   stime.hour++;
   stime.min++;
   stime.sec++;
   SendMessage(s_myhwnd,RTC_SETTIME,0L,(LPARAM)(&stime));
   //SendMessage(s_myhwnd,RTC_SETHOUR,0L,(LPARAM)(stime.hour));
   //SendMessage(s_myhwnd,RTC_SETMIN,0L,(LPARAM)(stime.min));
   //SendMessage(s_myhwnd,RTC_SETSEC,0L,(LPARAM)(stime.sec));
   break;*/
  case MSG_COMMAND:
   switch(wParam)
   {
    case IDM_EXIT:
     DestroyAllControls(hWnd);
     DestroyMainWindow(hWnd);
     PostQuitMessage(hWnd);
     break;
    case IDM_ABOUT:
     MessageBox(hWnd,"SeaRobberStudio","Clock",MB_OK);
     break;
    case IDM_SHOWCLOCK:
     if(showclock == 0)
     {
      InitTest(hWnd);
      showclock=1;
//   GetMenuItemInfo(window_info.hMenu,IDM_SHOWCLOCK,MF_BYCOMMAND,&mii);
//   mii.state=MFS_GRAYED | MFS_DISABLED;
//   SetMenuItemInfo(window_info.hMenu,IDM_SHOWCLOCK,MF_BYCOMMAND,&mii);
     }
     break;
    case IDM_SETCLOCK:
     InitDialogBox(hWnd);
     break;
    case IDM_SYSCLOCK:
     
     GetCurrTime(&stime);
    SendMessage(s_myhwnd,RTC_SETTIME,0L,(LPARAM)(&stime));
     break;
    case IDM_SETSYSCLOCK:
     SetCurrTime(&s_rtime);
   if(IDNO==MessageBox(hWnd,"SetSystemTime","Really?",MB_YESNO))
     break;
   MessageBox(hWnd,"SetSystemTime Success!","SetSysTime",MB_OK);
     break;
    default:
     break;
   }
  break;
  case MSG_CLOSE:
   UnloadBitmap(&s_bmp);
   DestroyAllControls(hWnd);
   DestroyMainWindow(hWnd);
   PostQuitMessage(hWnd);
   break;
  default:
   return (DefaultMainWinProc(hWnd,message,wParam,lParam));
 }
 return 0;
}
//InitMainWindow()
int InitMainWindow(void)
{
 MAINWINCREATE window_info;
 window_info.dwStyle=WS_VISIBLE | WS_BORDER | WS_CAPTION;
 window_info.dwExStyle=WS_EX_NONE;
 window_info.spCaption="MiniGUI";
 window_info.hMenu=CreateMainMenu();
 window_info.hCursor=GetSystemCursor(0);
 window_info.hIcon=0;
 window_info.MainWindowProc=WinProc;
 window_info.lx=MWINDOW_LX;
 window_info.ty=MWINDOW_TY;
 window_info.rx=MWINDOW_RX;
 window_info.by=MWINDOW_BY;
 window_info.iBkColor=COLOR_lightwhite;
 window_info.dwAddData=0;
 window_info.hHosting=HWND_DESKTOP;
 hMainWnd=CreateMainWindow(&window_info);
 if(hMainWnd == HWND_INVALID)
  return 0;
 else
  return 1;
}
//MiniGUIMain()
int MiniGUIMain(int argc, const char *argv[])
{
 MSG Msg;
#ifdef _LINE_VERSION
 SetDesktopRect(0,0,800,600);
#endif
 RegisterMyControl();
 InitMainWindow();
 ShowWindow(hMainWnd,SW_SHOWNORMAL);
 while(GetMessage(&Msg,hMainWnd))
 {
  TranslateMessage(&Msg);
  DispatchMessage(&Msg);
 }
 MainWindowThreadCleanup(hMainWnd);
 UnregisterMyControl();
 return 0;
}
#ifndef _LITE_VERSION
 #i nclude
#endif

阅读(2697) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~