- Implement 'Choose font', 'No title', 'Always on Top'.

- Paint to offscreen bitmap to eliminate flicker.
- Put 'Always on top' on the main menu not the system menu.
- Date format should be DATE_LONGDATE.
- L button drag to move.
- Cosmetic adjustments.
This commit is contained in:
Richard Cohen 2003-12-08 22:23:03 +00:00 committed by Alexandre Julliard
parent 7499242fd3
commit cc8c205adb
27 changed files with 354 additions and 302 deletions

View File

@ -31,6 +31,8 @@ MAIN_MENU MENU LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Se&kunder", IDM_SECONDS MENUITEM "Se&kunder", IDM_SECONDS
MENUITEM "Da&to", IDM_DATE MENUITEM "Da&to", IDM_DATE
MENUITEM SEPARATOR
MENUITEM "&Altid øverst", IDM_ONTOP
} }
POPUP "Inf&o" { POPUP "Inf&o" {
MENUITEM "&Licens...", IDM_LICENSE MENUITEM "&Licens...", IDM_LICENSE
@ -42,5 +44,4 @@ MAIN_MENU MENU LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE LANGUAGE LANG_DANISH, SUBLANG_DEFAULT STRINGTABLE DISCARDABLE LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
{ {
IDS_CLOCK, "Ur" IDS_CLOCK, "Ur"
IDS_ONTOP, "&Altid øverst"
} }

View File

@ -31,6 +31,8 @@ MAIN_MENU MENU LANGUAGE LANG_GERMAN, SUBLANG_DEFAULT
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Sekunden", IDM_SECONDS MENUITEM "&Sekunden", IDM_SECONDS
MENUITEM "&Datum", IDM_DATE MENUITEM "&Datum", IDM_DATE
MENUITEM SEPARATOR
MENUITEM "&Immer im Vordergrund", IDM_ONTOP
} }
POPUP "Inf&o" { POPUP "Inf&o" {
MENUITEM "&Lizenz...", IDM_LICENSE MENUITEM "&Lizenz...", IDM_LICENSE
@ -42,5 +44,4 @@ MAIN_MENU MENU LANGUAGE LANG_GERMAN, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE LANGUAGE LANG_GERMAN, SUBLANG_DEFAULT STRINGTABLE DISCARDABLE LANGUAGE LANG_GERMAN, SUBLANG_DEFAULT
{ {
IDS_CLOCK, "Uhr" IDS_CLOCK, "Uhr"
IDS_ONTOP, "&Immer im Vordergrund"
} }

View File

@ -33,6 +33,8 @@ MAIN_MENU MENU
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Seconds", IDM_SECONDS MENUITEM "&Seconds", IDM_SECONDS
MENUITEM "&Date", IDM_DATE MENUITEM "&Date", IDM_DATE
MENUITEM SEPARATOR
MENUITEM "&Always on Top", IDM_ONTOP
} }
POPUP "Inf&o" { POPUP "Inf&o" {
MENUITEM "&License...", IDM_LICENSE MENUITEM "&License...", IDM_LICENSE
@ -44,5 +46,4 @@ MAIN_MENU MENU
STRINGTABLE DISCARDABLE STRINGTABLE DISCARDABLE
{ {
IDS_CLOCK, "Clock" IDS_CLOCK, "Clock"
IDS_ONTOP, "&Always on Top"
} }

View File

@ -33,6 +33,8 @@ MAIN_MENU MENU LANGUAGE LANG_SPANISH, SUBLANG_DEFAULT
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Segundos", IDM_SECONDS MENUITEM "&Segundos", IDM_SECONDS
MENUITEM "Fe&cha", IDM_DATE MENUITEM "Fe&cha", IDM_DATE
MENUITEM SEPARATOR
MENUITEM "Siempre &visible", IDM_ONTOP
} }
POPUP "Inf&o" { POPUP "Inf&o" {
MENUITEM "&Licencia...", IDM_LICENSE MENUITEM "&Licencia...", IDM_LICENSE
@ -44,5 +46,4 @@ MAIN_MENU MENU LANGUAGE LANG_SPANISH, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE LANGUAGE LANG_SPANISH, SUBLANG_DEFAULT STRINGTABLE DISCARDABLE LANGUAGE LANG_SPANISH, SUBLANG_DEFAULT
{ {
IDS_CLOCK, "Reloj" IDS_CLOCK, "Reloj"
IDS_ONTOP, "Siempre &visible"
} }

View File

@ -31,6 +31,8 @@ MAIN_MENU MENU LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Sekunnit", IDM_SECONDS MENUITEM "&Sekunnit", IDM_SECONDS
MENUITEM "&Päivämäärä", IDM_DATE MENUITEM "&Päivämäärä", IDM_DATE
MENUITEM SEPARATOR
MENUITEM "&Aina päällimmäisenä", IDM_ONTOP
} }
POPUP "Inf&o" { POPUP "Inf&o" {
MENUITEM "&Lisenssi...", IDM_LICENSE MENUITEM "&Lisenssi...", IDM_LICENSE
@ -42,5 +44,4 @@ MAIN_MENU MENU LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT STRINGTABLE DISCARDABLE LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT
{ {
IDS_CLOCK, "Kello" IDS_CLOCK, "Kello"
IDS_ONTOP, "&Aina päällimmäisenä"
} }

View File

@ -33,6 +33,8 @@ MAIN_MENU MENU
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Secondes", IDM_SECONDS MENUITEM "&Secondes", IDM_SECONDS
MENUITEM "&Date", IDM_DATE MENUITEM "&Date", IDM_DATE
MENUITEM SEPARATOR
MENUITEM "&Toujours visible", IDM_ONTOP
} }
POPUP "Inf&o" { POPUP "Inf&o" {
MENUITEM "&Licence...", IDM_LICENSE MENUITEM "&Licence...", IDM_LICENSE
@ -44,5 +46,4 @@ MAIN_MENU MENU
STRINGTABLE DISCARDABLE STRINGTABLE DISCARDABLE
{ {
IDS_CLOCK, "Horloge" IDS_CLOCK, "Horloge"
IDS_ONTOP, "&Toujours visible"
} }

View File

@ -32,6 +32,8 @@ MAIN_MENU MENU LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Másodperc", IDM_SECONDS MENUITEM "&Másodperc", IDM_SECONDS
MENUITEM "&Dátum", IDM_DATE MENUITEM "&Dátum", IDM_DATE
MENUITEM SEPARATOR
MENUITEM "&Mindig legfelül", IDM_ONTOP
} }
POPUP "Inf&ormáció" { POPUP "Inf&ormáció" {
MENUITEM "&Licenc...", IDM_LICENSE MENUITEM "&Licenc...", IDM_LICENSE
@ -43,5 +45,4 @@ MAIN_MENU MENU LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT STRINGTABLE DISCARDABLE LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT
{ {
IDS_CLOCK, "Óra" IDS_CLOCK, "Óra"
IDS_ONTOP, "&Mindig legfelül"
} }

View File

@ -34,6 +34,8 @@ MAIN_MENU MENU
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Secondi", IDM_SECONDS MENUITEM "&Secondi", IDM_SECONDS
MENUITEM "&Data", IDM_DATE MENUITEM "&Data", IDM_DATE
MENUITEM SEPARATOR
MENUITEM "&Sempre in primo piano", IDM_ONTOP
} }
POPUP "Inf&o" { POPUP "Inf&o" {
MENUITEM "&Licenza...", IDM_LICENSE MENUITEM "&Licenza...", IDM_LICENSE
@ -45,5 +47,4 @@ MAIN_MENU MENU
STRINGTABLE DISCARDABLE STRINGTABLE DISCARDABLE
{ {
IDS_CLOCK, "Orologio" IDS_CLOCK, "Orologio"
IDS_ONTOP, "&Sempre in primo piano"
} }

View File

@ -9,7 +9,6 @@ IMPORTS = comdlg32 shell32 user32 gdi32 kernel32
LICENSELANG = En LICENSELANG = En
C_SRCS = \ C_SRCS = \
language.c \
license.c \ license.c \
main.c \ main.c \
winclock.c \ winclock.c \

View File

@ -32,6 +32,8 @@ MAIN_MENU MENU
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Seconden", IDM_SECONDS MENUITEM "&Seconden", IDM_SECONDS
MENUITEM "Da&tum", IDM_DATE MENUITEM "Da&tum", IDM_DATE
MENUITEM SEPARATOR
MENUITEM "&Altijd op de voorgrond", IDM_ONTOP
} }
POPUP "Inf&o" { POPUP "Inf&o" {
MENUITEM "&Licentie...", IDM_LICENSE MENUITEM "&Licentie...", IDM_LICENSE
@ -43,5 +45,4 @@ MAIN_MENU MENU
STRINGTABLE DISCARDABLE STRINGTABLE DISCARDABLE
{ {
IDS_CLOCK, "Klok" IDS_CLOCK, "Klok"
IDS_ONTOP, "&Altijd op de voorgrond"
} }

View File

@ -35,6 +35,8 @@ MAIN_MENU MENU
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Segundos", IDM_SECONDS MENUITEM "&Segundos", IDM_SECONDS
MENUITEM "&Data", IDM_DATE MENUITEM "&Data", IDM_DATE
MENUITEM SEPARATOR
MENUITEM "&Sempre visível", IDM_ONTOP
} }
POPUP "&Informações" { POPUP "&Informações" {
MENUITEM "&Licença...", IDM_LICENSE MENUITEM "&Licença...", IDM_LICENSE
@ -46,5 +48,4 @@ MAIN_MENU MENU
STRINGTABLE DISCARDABLE STRINGTABLE DISCARDABLE
{ {
IDS_CLOCK, "Relógio" IDS_CLOCK, "Relógio"
IDS_ONTOP, "&Sempre visível"
} }

View File

@ -2,7 +2,4 @@
Clock for Wine Clock for Wine
============== ==============
This is a first attempt to realize a desktop clock for Wine as done in
Windows. It's an early release and some of the code is still broken.
Originally contributed by <mbaur@g26.ethz.ch> Originally contributed by <mbaur@g26.ethz.ch>

View File

@ -30,6 +30,8 @@ MAIN_MENU MENU LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Ñåêóíäû", IDM_SECONDS MENUITEM "&Ñåêóíäû", IDM_SECONDS
MENUITEM "&Äàòà", IDM_DATE MENUITEM "&Äàòà", IDM_DATE
MENUITEM SEPARATOR
MENUITEM "&Ïîâåðõ âñåõ", IDM_ONTOP
} }
POPUP "&Ñâåäåíèÿ" { POPUP "&Ñâåäåíèÿ" {
MENUITEM "&Ëèöåíçèÿ...", IDM_LICENSE MENUITEM "&Ëèöåíçèÿ...", IDM_LICENSE
@ -41,5 +43,4 @@ MAIN_MENU MENU LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT STRINGTABLE DISCARDABLE LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
{ {
IDS_CLOCK, "×àñû" IDS_CLOCK, "×àñû"
IDS_ONTOP, "&Ïîâåðõ âñåõ"
} }

View File

@ -30,6 +30,8 @@ MAIN_MENU MENU LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Sekunde", IDM_SECONDS MENUITEM "&Sekunde", IDM_SECONDS
MENUITEM "&Datum", IDM_DATE MENUITEM "&Datum", IDM_DATE
MENUITEM SEPARATOR
MENUITEM "&Vedno na vrhu", IDM_ONTOP
} }
POPUP "Inf&ormacije " { POPUP "Inf&ormacije " {
MENUITEM "&Licenèna pogodba...", IDM_LICENSE MENUITEM "&Licenèna pogodba...", IDM_LICENSE
@ -41,5 +43,4 @@ MAIN_MENU MENU LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT STRINGTABLE DISCARDABLE LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT
{ {
IDS_CLOCK, "Ura" IDS_CLOCK, "Ura"
IDS_ONTOP, "&Vedno na vrhu"
} }

View File

@ -32,6 +32,8 @@ MAIN_MENU MENU LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Sekundy", IDM_SECONDS MENUITEM "&Sekundy", IDM_SECONDS
MENUITEM "&Dátum", IDM_DATE MENUITEM "&Dátum", IDM_DATE
MENUITEM SEPARATOR
MENUITEM "&Vždy na vrchu", IDM_ONTOP
} }
POPUP "Inf&o" { POPUP "Inf&o" {
MENUITEM "&Licencia...", IDM_LICENSE MENUITEM "&Licencia...", IDM_LICENSE
@ -43,5 +45,4 @@ MAIN_MENU MENU LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT STRINGTABLE DISCARDABLE LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT
{ {
IDS_CLOCK, "Hodiny" IDS_CLOCK, "Hodiny"
IDS_ONTOP, "&Vždy na vrchu"
} }

View File

@ -32,6 +32,8 @@ MAIN_MENU MENU LANGUAGE LANG_SWEDISH, SUBLANG_DEFAULT
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Sekunder", IDM_SECONDS MENUITEM "&Sekunder", IDM_SECONDS
MENUITEM "&Datum", IDM_DATE MENUITEM "&Datum", IDM_DATE
MENUITEM SEPARATOR
MENUITEM "&Alltid överst", IDM_ONTOP
} }
POPUP "Inf&o" { POPUP "Inf&o" {
MENUITEM "&Licens...", IDM_LICENSE MENUITEM "&Licens...", IDM_LICENSE
@ -43,5 +45,4 @@ MAIN_MENU MENU LANGUAGE LANG_SWEDISH, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE LANGUAGE LANG_SWEDISH, SUBLANG_DEFAULT STRINGTABLE DISCARDABLE LANGUAGE LANG_SWEDISH, SUBLANG_DEFAULT
{ {
IDS_CLOCK, "Klockan" IDS_CLOCK, "Klockan"
IDS_ONTOP, "&Alltid överst"
} }

View File

@ -1,17 +1,4 @@
'L button move', 'No title bar' & 'Always on top' don't work unless Wine is in
desktop mode
Some ideas for improvements: This is a problem in Wine, not in Clock
============================
- Make "Without Titlebar", Double-clicking the clock should reveal the caption
again.
- Font Handling of Digital Clock.
(Does not work probably due to Winelib)
- Complete translation for the following languages : Pt,Sk
- Add new .rc resources for all languages you know. That's in fact very easy.
Just clone the file En.rc, change the strings and submit it. You can find
my email address in the README file.
Please don't forget a ChangeLog entry.

View File

@ -32,6 +32,8 @@ MAIN_MENU MENU
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "窃挂氛", IDM_SECONDS MENUITEM "窃挂氛", IDM_SECONDS
MENUITEM "茄狗砧", IDM_DATE MENUITEM "茄狗砧", IDM_DATE
MENUITEM SEPARATOR
MENUITEM "ÂÙº¹ÊØ´àÊÁÍ", IDM_ONTOP
} }
POPUP "靡屡朽驼麓" { POPUP "靡屡朽驼麓" {
MENUITEM "愫凸丨业...", IDM_LICENSE MENUITEM "愫凸丨业...", IDM_LICENSE
@ -43,5 +45,4 @@ MAIN_MENU MENU
STRINGTABLE DISCARDABLE STRINGTABLE DISCARDABLE
{ {
IDS_CLOCK, "挂淘∫" IDS_CLOCK, "挂淘∫"
IDS_ONTOP, "ÂÙº¹ÊØ´àÊÁÍ"
} }

View File

@ -37,6 +37,8 @@ MAIN_MENU MENU LANGUAGE LANG_WALON, SUBLANG_DEFAULT
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Segondes", IDM_SECONDS MENUITEM "&Segondes", IDM_SECONDS
MENUITEM "&Date", IDM_DATE MENUITEM "&Date", IDM_DATE
MENUITEM SEPARATOR
MENUITEM "Todi &Visibe", IDM_ONTOP
} }
POPUP "&Informåcion" { POPUP "&Informåcion" {
MENUITEM "&Licinse...", IDM_LICENSE MENUITEM "&Licinse...", IDM_LICENSE
@ -48,7 +50,6 @@ MAIN_MENU MENU LANGUAGE LANG_WALON, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE LANGUAGE LANG_WALON, SUBLANG_DEFAULT STRINGTABLE DISCARDABLE LANGUAGE LANG_WALON, SUBLANG_DEFAULT
{ {
IDS_CLOCK, "Ôrlodje" IDS_CLOCK, "Ôrlodje"
IDS_ONTOP, "Todi &Visibe"
} }
#endif /* LANG_WALON */ #endif /* LANG_WALON */

View File

@ -30,6 +30,8 @@ MAIN_MENU MENU LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "秒(&", IDM_SECONDS MENUITEM "秒(&", IDM_SECONDS
MENUITEM "日期(&D", IDM_DATE MENUITEM "日期(&D", IDM_DATE
MENUITEM SEPARATOR
MENUITEM "总是在最前面(&A", IDM_ONTOP
} }
POPUP "资料信息(&O" { POPUP "资料信息(&O" {
MENUITEM "用户许可协议(&L...", IDM_LICENSE MENUITEM "用户许可协议(&L...", IDM_LICENSE
@ -41,5 +43,4 @@ MAIN_MENU MENU LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
STRINGTABLE DISCARDABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED STRINGTABLE DISCARDABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
{ {
IDS_CLOCK, "时钟" IDS_CLOCK, "时钟"
IDS_ONTOP, "总是在最前面(&A"
} }

View File

@ -31,4 +31,3 @@
#define IDM_ONTOP 0x113 #define IDM_ONTOP 0x113
#define IDS_CLOCK 0x10C #define IDS_CLOCK 0x10C
#define IDS_ONTOP 0x10D

View File

@ -1,108 +0,0 @@
/*
* Clock
*
* Copyright 1998 Marcel Baur <mbaur@g26.ethz.ch>
* Copyright 1998 Karl Backström <karl_b@geocities.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdio.h>
#include "windows.h"
#include "main.h"
#include "language.h"
#include "winnls.h"
VOID LANGUAGE_UpdateMenuCheckmarks(VOID)
{
if(Globals.bAnalog == TRUE) {
/* analog clock */
CheckMenuItem(Globals.hPropertiesMenu, IDM_ANALOG, MF_BYCOMMAND | MF_CHECKED);
CheckMenuItem(Globals.hPropertiesMenu, IDM_DIGITAL, MF_BYCOMMAND | MF_UNCHECKED);
EnableMenuItem(Globals.hPropertiesMenu, IDM_FONT, MF_BYCOMMAND | MF_GRAYED);
}
else
{
/* digital clock */
CheckMenuItem(Globals.hPropertiesMenu, IDM_ANALOG, MF_BYCOMMAND | MF_UNCHECKED);
CheckMenuItem(Globals.hPropertiesMenu, IDM_DIGITAL, MF_BYCOMMAND | MF_CHECKED);
EnableMenuItem(Globals.hPropertiesMenu, IDM_FONT, MF_BYCOMMAND);
}
CheckMenuItem(Globals.hPropertiesMenu, IDM_NOTITLE, MF_BYCOMMAND |
(Globals.bWithoutTitle ? MF_CHECKED : MF_UNCHECKED));
CheckMenuItem(Globals.hSystemMenu, IDM_ONTOP, MF_BYCOMMAND |
(Globals.bAlwaysOnTop ? MF_CHECKED : MF_UNCHECKED));
CheckMenuItem(Globals.hPropertiesMenu, IDM_SECONDS, MF_BYCOMMAND |
(Globals.bSeconds ? MF_CHECKED : MF_UNCHECKED));
CheckMenuItem(Globals.hPropertiesMenu, IDM_DATE, MF_BYCOMMAND |
(Globals.bDate ? MF_CHECKED : MF_UNCHECKED));
}
VOID LANGUAGE_UpdateWindowCaption(VOID)
{
CHAR szCaption[MAX_STRING_LEN];
CHAR szDate[MAX_STRING_LEN];
SYSTEMTIME st;
GetLocalTime(&st);
GetDateFormat(LOCALE_USER_DEFAULT, LOCALE_SLONGDATE, &st, NULL, szDate, sizeof(szDate));
/* Set frame caption */
LoadString(Globals.hInstance, IDS_CLOCK, szCaption, sizeof(szCaption));
if (Globals.bDate) {
lstrcat(szCaption, " - ");
lstrcat(szCaption, szDate);
}
SetWindowText(Globals.hMainWnd, szCaption);
}
VOID LANGUAGE_LoadMenus(VOID)
{
CHAR szItem[MAX_STRING_LEN];
HMENU hMainMenu;
/* Create menu */
hMainMenu = LoadMenu(Globals.hInstance, MAKEINTRESOURCE(MAIN_MENU));
Globals.hPropertiesMenu = GetSubMenu(hMainMenu, 0);
Globals.hLanguageMenu = GetSubMenu(hMainMenu, 1);
Globals.hInfoMenu = GetSubMenu(hMainMenu, 2);
SetMenu(Globals.hMainWnd, hMainMenu);
/* Destroy old menu */
if (Globals.hMainMenu) DestroyMenu(Globals.hMainMenu);
Globals.hMainMenu = hMainMenu;
/* specific for Clock: */
LANGUAGE_UpdateMenuCheckmarks();
LANGUAGE_UpdateWindowCaption();
Globals.hSystemMenu = GetSystemMenu(Globals.hMainWnd, TRUE);
/* FIXME: Append a SEPARATOR to Globals.hSystemMenu here */
LoadString(Globals.hInstance, IDS_ONTOP, szItem, sizeof(szItem));
AppendMenu(Globals.hSystemMenu, MF_STRING | MF_BYCOMMAND, IDM_ONTOP, szItem);
}
/* Local Variables: */
/* c-file-style: "GNU" */
/* End: */

View File

@ -1,28 +0,0 @@
/*
* Clock
*
* Copyright 1998 Marcel Baur <mbaur@g26.ethz.ch>
* Copyright 1998 Karl Backström <karl_b@geocities.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
VOID LANGUAGE_UpdateWindowCaption(VOID);
VOID LANGUAGE_UpdateMenuCheckmarks(VOID);
VOID LANGUAGE_LoadMenus(VOID);
/* Local Variables: */
/* c-file-style: "GNU" */
/* End: */

View File

@ -23,8 +23,6 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include "config.h"
#include <stdio.h> #include <stdio.h>
#include "windows.h" #include "windows.h"
@ -32,7 +30,6 @@
#include "main.h" #include "main.h"
#include "license.h" #include "license.h"
#include "language.h"
#include "winclock.h" #include "winclock.h"
#define INITIAL_WINDOW_SIZE 200 #define INITIAL_WINDOW_SIZE 200
@ -40,6 +37,54 @@
CLOCK_GLOBALS Globals; CLOCK_GLOBALS Globals;
static VOID CLOCK_UpdateMenuCheckmarks(VOID)
{
HMENU hPropertiesMenu;
hPropertiesMenu = GetSubMenu(Globals.hMainMenu, 0);
if (!hPropertiesMenu)
return;
if(Globals.bAnalog) {
/* analog clock */
CheckMenuRadioItem(hPropertiesMenu, IDM_ANALOG, IDM_DIGITAL, IDM_ANALOG, MF_CHECKED);
EnableMenuItem(hPropertiesMenu, IDM_FONT, MF_GRAYED);
}
else
{
/* digital clock */
CheckMenuRadioItem(hPropertiesMenu, IDM_ANALOG, IDM_DIGITAL, IDM_DIGITAL, MF_CHECKED);
EnableMenuItem(hPropertiesMenu, IDM_FONT, 0);
}
CheckMenuItem(hPropertiesMenu, IDM_NOTITLE, (Globals.bWithoutTitle ? MF_CHECKED : MF_UNCHECKED));
CheckMenuItem(hPropertiesMenu, IDM_ONTOP, (Globals.bAlwaysOnTop ? MF_CHECKED : MF_UNCHECKED));
CheckMenuItem(hPropertiesMenu, IDM_SECONDS, (Globals.bSeconds ? MF_CHECKED : MF_UNCHECKED));
CheckMenuItem(hPropertiesMenu, IDM_DATE, (Globals.bDate ? MF_CHECKED : MF_UNCHECKED));
}
static VOID CLOCK_UpdateWindowCaption(VOID)
{
CHAR szCaption[MAX_STRING_LEN];
int chars = 0;
/* Set frame caption */
if (Globals.bDate) {
chars = GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, NULL, NULL,
szCaption, sizeof(szCaption));
if (chars) {
--chars;
szCaption[chars++] = ' ';
szCaption[chars++] = '-';
szCaption[chars++] = ' ';
szCaption[chars] = '\0';
}
}
LoadString(0, IDS_CLOCK, szCaption + chars, sizeof(szCaption) - chars);
SetWindowText(Globals.hMainWnd, szCaption);
}
/*********************************************************************** /***********************************************************************
* *
* CLOCK_ResetTimer * CLOCK_ResetTimer
@ -67,6 +112,84 @@ static BOOL CLOCK_ResetTimer(void)
return TRUE; return TRUE;
} }
/***********************************************************************
*
* CLOCK_ResetFont
*/
static VOID CLOCK_ResetFont(VOID)
{
HFONT newfont;
HDC dc = GetDC(Globals.hMainWnd);
newfont = SizeFont(dc, Globals.MaxX, Globals.MaxY, Globals.bSeconds, &Globals.logfont);
if (newfont) {
DeleteObject(Globals.hFont);
Globals.hFont = newfont;
}
ReleaseDC(Globals.hMainWnd, dc);
}
/***********************************************************************
*
* CLOCK_ChooseFont
*/
static VOID CLOCK_ChooseFont(VOID)
{
LOGFONT lf;
CHOOSEFONT cf;
memset(&cf, 0, sizeof(cf));
lf = Globals.logfont;
cf.lStructSize = sizeof(cf);
cf.hwndOwner = Globals.hMainWnd;
cf.lpLogFont = &lf;
cf.Flags = CF_SCREENFONTS | CF_INITTOLOGFONTSTRUCT;
if (ChooseFont(&cf)) {
Globals.logfont = lf;
CLOCK_ResetFont();
}
}
/***********************************************************************
*
* CLOCK_ToggleTitle
*/
static VOID CLOCK_ToggleTitle(VOID)
{
/* Also shows/hides the menu */
LONG style = GetWindowLong(Globals.hMainWnd, GWL_STYLE);
if ((Globals.bWithoutTitle = !Globals.bWithoutTitle)) {
style = (style & ~WS_OVERLAPPEDWINDOW) | WS_POPUP|WS_THICKFRAME;
SetMenu(Globals.hMainWnd, 0);
}
else {
style = (style & ~(WS_POPUP|WS_THICKFRAME)) | WS_OVERLAPPEDWINDOW;
SetMenu(Globals.hMainWnd, Globals.hMainMenu);
}
SetWindowLong(Globals.hMainWnd, GWL_STYLE, style);
SetWindowPos(Globals.hMainWnd, 0,0,0,0,0,
SWP_DRAWFRAME|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER);
CLOCK_UpdateMenuCheckmarks();
CLOCK_UpdateWindowCaption();
}
/***********************************************************************
*
* CLOCK_ToggleOnTop
*/
static VOID CLOCK_ToggleOnTop(VOID)
{
if ((Globals.bAlwaysOnTop = !Globals.bAlwaysOnTop)) {
SetWindowPos(Globals.hMainWnd, HWND_TOPMOST, 0,0,0,0,
SWP_NOMOVE|SWP_NOSIZE);
}
else {
SetWindowPos(Globals.hMainWnd, HWND_NOTOPMOST, 0,0,0,0,
SWP_NOMOVE|SWP_NOSIZE);
}
CLOCK_UpdateMenuCheckmarks();
}
/*********************************************************************** /***********************************************************************
* *
* CLOCK_MenuCommand * CLOCK_MenuCommand
@ -74,7 +197,7 @@ static BOOL CLOCK_ResetTimer(void)
* All handling of main menu events * All handling of main menu events
*/ */
int CLOCK_MenuCommand (WPARAM wParam) static int CLOCK_MenuCommand (WPARAM wParam)
{ {
CHAR szApp[MAX_STRING_LEN]; CHAR szApp[MAX_STRING_LEN];
CHAR szAppRelease[MAX_STRING_LEN]; CHAR szAppRelease[MAX_STRING_LEN];
@ -82,7 +205,7 @@ int CLOCK_MenuCommand (WPARAM wParam)
/* switch to analog */ /* switch to analog */
case IDM_ANALOG: { case IDM_ANALOG: {
Globals.bAnalog = TRUE; Globals.bAnalog = TRUE;
LANGUAGE_UpdateMenuCheckmarks(); CLOCK_UpdateMenuCheckmarks();
CLOCK_ResetTimer(); CLOCK_ResetTimer();
InvalidateRect(Globals.hMainWnd, NULL, FALSE); InvalidateRect(Globals.hMainWnd, NULL, FALSE);
break; break;
@ -90,42 +213,42 @@ int CLOCK_MenuCommand (WPARAM wParam)
/* switch to digital */ /* switch to digital */
case IDM_DIGITAL: { case IDM_DIGITAL: {
Globals.bAnalog = FALSE; Globals.bAnalog = FALSE;
LANGUAGE_UpdateMenuCheckmarks(); CLOCK_UpdateMenuCheckmarks();
CLOCK_ResetTimer(); CLOCK_ResetTimer();
CLOCK_ResetFont();
InvalidateRect(Globals.hMainWnd, NULL, FALSE); InvalidateRect(Globals.hMainWnd, NULL, FALSE);
break; break;
} }
/* change font */ /* change font */
case IDM_FONT: { case IDM_FONT: {
MAIN_FileChooseFont(); CLOCK_ChooseFont();
break; break;
} }
/* hide title bar */ /* hide title bar */
case IDM_NOTITLE: { case IDM_NOTITLE: {
Globals.bWithoutTitle = !Globals.bWithoutTitle; CLOCK_ToggleTitle();
LANGUAGE_UpdateWindowCaption();
LANGUAGE_UpdateMenuCheckmarks();
break; break;
} }
/* always on top */ /* always on top */
case IDM_ONTOP: { case IDM_ONTOP: {
Globals.bAlwaysOnTop = !Globals.bAlwaysOnTop; CLOCK_ToggleOnTop();
LANGUAGE_UpdateMenuCheckmarks();
break; break;
} }
/* show or hide seconds */ /* show or hide seconds */
case IDM_SECONDS: { case IDM_SECONDS: {
Globals.bSeconds = !Globals.bSeconds; Globals.bSeconds = !Globals.bSeconds;
LANGUAGE_UpdateMenuCheckmarks(); CLOCK_UpdateMenuCheckmarks();
CLOCK_ResetTimer(); CLOCK_ResetTimer();
if (!Globals.bAnalog)
CLOCK_ResetFont();
InvalidateRect(Globals.hMainWnd, NULL, FALSE); InvalidateRect(Globals.hMainWnd, NULL, FALSE);
break; break;
} }
/* show or hide date */ /* show or hide date */
case IDM_DATE: { case IDM_DATE: {
Globals.bDate = !Globals.bDate; Globals.bDate = !Globals.bDate;
LANGUAGE_UpdateMenuCheckmarks(); CLOCK_UpdateMenuCheckmarks();
LANGUAGE_UpdateWindowCaption(); CLOCK_UpdateWindowCaption();
break; break;
} }
/* show license */ /* show license */
@ -142,7 +265,6 @@ int CLOCK_MenuCommand (WPARAM wParam)
case IDM_ABOUT: { case IDM_ABOUT: {
LoadString(Globals.hInstance, IDS_CLOCK, szApp, sizeof(szApp)); LoadString(Globals.hInstance, IDS_CLOCK, szApp, sizeof(szApp));
lstrcpy(szAppRelease,szApp); lstrcpy(szAppRelease,szApp);
lstrcat(szAppRelease,"\n" PACKAGE_STRING);
ShellAbout(Globals.hMainWnd, szApp, szAppRelease, 0); ShellAbout(Globals.hMainWnd, szApp, szAppRelease, 0);
break; break;
} }
@ -150,30 +272,47 @@ int CLOCK_MenuCommand (WPARAM wParam)
return 0; return 0;
} }
VOID MAIN_FileChooseFont(VOID) /***********************************************************************
*
* CLOCK_Paint
*/
static VOID CLOCK_Paint(HWND hWnd)
{ {
CHOOSEFONT font; PAINTSTRUCT ps;
LOGFONT lf; HDC dcMem, dc;
HBITMAP bmMem, bmOld;
font.lStructSize = sizeof(font); dc = BeginPaint(hWnd, &ps);
font.hwndOwner = Globals.hMainWnd;
font.hDC = NULL;
font.lpLogFont = &lf;
font.iPointSize = 0;
font.Flags = 0;
font.rgbColors = 0;
font.lCustData = 0;
font.lpfnHook = 0;
font.lpTemplateName = 0;
font.hInstance = Globals.hInstance;
/* font.lpszStyle = LF_FACESIZE; */
font.nFontType = 0;
font.nSizeMin = 0;
font.nSizeMax = 144;
if (ChooseFont(&font)) { /* Use an offscreen dc to avoid flicker */
/* do nothing yet */ dcMem = CreateCompatibleDC(dc);
} bmMem = CreateCompatibleBitmap(dc, ps.rcPaint.right - ps.rcPaint.left,
ps.rcPaint.bottom - ps.rcPaint.top);
bmOld = SelectObject(dcMem, bmMem);
SetViewportOrgEx(dcMem, -ps.rcPaint.left, -ps.rcPaint.top, NULL);
/* Erase the background */
FillRect(dcMem, &ps.rcPaint, GetStockObject(LTGRAY_BRUSH));
if(Globals.bAnalog)
AnalogClock(dcMem, Globals.MaxX, Globals.MaxY, Globals.bSeconds);
else
DigitalClock(dcMem, Globals.MaxX, Globals.MaxY, Globals.bSeconds, Globals.hFont);
/* Blit the changes to the screen */
BitBlt(dc,
ps.rcPaint.left, ps.rcPaint.top,
ps.rcPaint.right - ps.rcPaint.left, ps.rcPaint.bottom - ps.rcPaint.top,
dcMem,
ps.rcPaint.left, ps.rcPaint.top,
SRCCOPY);
SelectObject(dcMem, bmOld);
DeleteObject(bmMem);
DeleteDC(dcMem);
EndPaint(hWnd, &ps);
} }
/*********************************************************************** /***********************************************************************
@ -184,35 +323,30 @@ VOID MAIN_FileChooseFont(VOID)
LRESULT WINAPI CLOCK_WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) LRESULT WINAPI CLOCK_WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{ {
switch (msg) { switch (msg) {
/* L button drag moves the window */
case WM_CREATE: { case WM_NCHITTEST: {
break; LRESULT ret = DefWindowProc (hWnd, msg, wParam, lParam);
if (ret == HTCLIENT)
ret = HTCAPTION;
return ret;
} }
case WM_RBUTTONUP: { case WM_NCLBUTTONDBLCLK:
Globals.bWithoutTitle = !Globals.bWithoutTitle; case WM_LBUTTONDBLCLK: {
LANGUAGE_UpdateMenuCheckmarks(); CLOCK_ToggleTitle();
LANGUAGE_UpdateWindowCaption();
UpdateWindow (Globals.hMainWnd);
break; break;
} }
case WM_PAINT: { case WM_PAINT: {
PAINTSTRUCT ps; CLOCK_Paint(hWnd);
HDC context;
context = BeginPaint(hWnd, &ps);
if(Globals.bAnalog)
AnalogClock(context, Globals.MaxX, Globals.MaxY, Globals.bSeconds);
else
DigitalClock(context, Globals.MaxX, Globals.MaxY, Globals.bSeconds);
EndPaint(hWnd, &ps);
break; break;
} }
case WM_SIZE: { case WM_SIZE: {
Globals.MaxX = LOWORD(lParam); Globals.MaxX = LOWORD(lParam);
Globals.MaxY = HIWORD(lParam); Globals.MaxY = HIWORD(lParam);
CLOCK_ResetFont();
break; break;
} }
@ -255,27 +389,19 @@ int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE prev, LPSTR cmdline, int show
char szWinName[] = "Clock"; char szWinName[] = "Clock";
/* Setup Globals */ /* Setup Globals */
memset(&Globals.hFont, 0, sizeof (Globals.hFont));
Globals.bAnalog = TRUE; Globals.bAnalog = TRUE;
Globals.bSeconds = TRUE; Globals.bSeconds = TRUE;
Globals.lpszIniFile = "clock.ini";
Globals.lpszIcoFile = "clock.ico";
Globals.hInstance = hInstance;
Globals.hMainIcon = ExtractIcon(Globals.hInstance,
Globals.lpszIcoFile, 0);
if (!Globals.hMainIcon)
Globals.hMainIcon = LoadIcon(0, MAKEINTRESOURCE(DEFAULTICON));
if (!prev){ if (!prev){
class.style = CS_HREDRAW | CS_VREDRAW; class.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
class.lpfnWndProc = CLOCK_WndProc; class.lpfnWndProc = CLOCK_WndProc;
class.cbClsExtra = 0; class.cbClsExtra = 0;
class.cbWndExtra = 0; class.cbWndExtra = 0;
class.hInstance = Globals.hInstance; class.hInstance = hInstance;
class.hIcon = LoadIcon (0, IDI_APPLICATION); class.hIcon = LoadIcon (0, IDI_APPLICATION);
class.hCursor = LoadCursor (0, IDC_ARROW); class.hCursor = LoadCursor (0, IDC_ARROW);
class.hbrBackground = GetStockObject (GRAY_BRUSH); class.hbrBackground = 0;
class.lpszMenuName = 0; class.lpszMenuName = 0;
class.lpszClassName = szClassName; class.lpszClassName = szClassName;
} }
@ -286,15 +412,15 @@ int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE prev, LPSTR cmdline, int show
Globals.hMainWnd = CreateWindow (szClassName, szWinName, WS_OVERLAPPEDWINDOW, Globals.hMainWnd = CreateWindow (szClassName, szWinName, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
Globals.MaxX, Globals.MaxY, 0, Globals.MaxX, Globals.MaxY, 0,
0, Globals.hInstance, 0); 0, hInstance, 0);
if (!CLOCK_ResetTimer()) if (!CLOCK_ResetTimer())
return FALSE; return FALSE;
LANGUAGE_LoadMenus(); Globals.hMainMenu = LoadMenu(0, MAKEINTRESOURCE(MAIN_MENU));
SetMenu(Globals.hMainWnd, Globals.hMainMenu); SetMenu(Globals.hMainWnd, Globals.hMainMenu);
CLOCK_UpdateMenuCheckmarks();
LANGUAGE_UpdateMenuCheckmarks(); CLOCK_UpdateWindowCaption();
ShowWindow (Globals.hMainWnd, show); ShowWindow (Globals.hMainWnd, show);
UpdateWindow (Globals.hMainWnd); UpdateWindow (Globals.hMainWnd);
@ -305,6 +431,7 @@ int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE prev, LPSTR cmdline, int show
} }
KillTimer(Globals.hMainWnd, TIMER_ID); KillTimer(Globals.hMainWnd, TIMER_ID);
DeleteObject(Globals.hFont);
return 0; return 0;
} }

View File

@ -25,18 +25,11 @@
typedef struct typedef struct
{ {
LOGFONT logfont;
HFONT hFont;
HANDLE hInstance; HANDLE hInstance;
HWND hMainWnd; HWND hMainWnd;
HICON hMainIcon;
HICON hDefaultIcon;
HMENU hMainMenu; HMENU hMainMenu;
HMENU hPropertiesMenu;
HMENU hLanguageMenu;
HMENU hInfoMenu;
HMENU hSystemMenu;
HMENU hPopupMenu1;
LPCSTR lpszIniFile;
LPCSTR lpszIcoFile;
BOOL bAnalog; BOOL bAnalog;
BOOL bAlwaysOnTop; BOOL bAlwaysOnTop;
@ -49,6 +42,3 @@ typedef struct
} CLOCK_GLOBALS; } CLOCK_GLOBALS;
extern CLOCK_GLOBALS Globals; extern CLOCK_GLOBALS Globals;
/* function prototypes */
VOID MAIN_FileChooseFont(VOID);

View File

@ -23,7 +23,6 @@
* License along with this library; if not, write to the Free Software * License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include "config.h" #include "config.h"
#include "wine/port.h" #include "wine/port.h"
@ -33,11 +32,18 @@
#include "windows.h" #include "windows.h"
#include "winclock.h" #include "winclock.h"
static COLORREF FaceColor = RGB(192,192,192); #define Black RGB(0,0,0)
static COLORREF HandColor = RGB(0,0,0); #define Gray RGB(128,128,128)
static COLORREF EtchColor = RGB(0,0,0); #define LtGray RGB(192,192,192)
static COLORREF GRAY = RGB(128,128,128); #define White RGB(255,255,255)
static const int ETCH_DEPTH = 2;
static const COLORREF FaceColor = LtGray;
static const COLORREF HandColor = White;
static const COLORREF TickColor = White;
static const COLORREF ShadowColor = Black;
static const COLORREF BackgroundColor = LtGray;
static const int SHADOW_DEPTH = 2;
typedef struct typedef struct
{ {
@ -47,17 +53,25 @@ typedef struct
HandData HourHand, MinuteHand, SecondHand; HandData HourHand, MinuteHand, SecondHand;
static void DrawFace(HDC dc, const POINT* centre, int radius) static void DrawTicks(HDC dc, const POINT* centre, int radius)
{ {
int t; int t;
SelectObject(dc,CreateSolidBrush(FaceColor)); /* Minute divisions */
SelectObject(dc,CreatePen(PS_SOLID,1,EtchColor)); if (radius>64)
Ellipse(dc, for(t=0; t<60; t++) {
centre->x - radius, centre->y - radius, MoveToEx(dc,
centre->x + radius, centre->y + radius); centre->x + sin(t*M_PI/30)*0.9*radius,
centre->y - cos(t*M_PI/30)*0.9*radius,
NULL);
LineTo(dc,
centre->x + sin(t*M_PI/30)*0.89*radius,
centre->y - cos(t*M_PI/30)*0.89*radius);
}
/* Hour divisions */
for(t=0; t<12; t++) { for(t=0; t<12; t++) {
MoveToEx(dc, MoveToEx(dc,
centre->x + sin(t*M_PI/6)*0.9*radius, centre->x + sin(t*M_PI/6)*0.9*radius,
centre->y - cos(t*M_PI/6)*0.9*radius, centre->y - cos(t*M_PI/6)*0.9*radius,
@ -66,12 +80,18 @@ static void DrawFace(HDC dc, const POINT* centre, int radius)
centre->x + sin(t*M_PI/6)*0.8*radius, centre->x + sin(t*M_PI/6)*0.8*radius,
centre->y - cos(t*M_PI/6)*0.8*radius); centre->y - cos(t*M_PI/6)*0.8*radius);
} }
if (radius>64) }
for(t=0; t<60; t++)
SetPixel(dc, static void DrawFace(HDC dc, const POINT* centre, int radius)
centre->x + sin(t*M_PI/30)*0.9*radius, {
centre->y - cos(t*M_PI/30)*0.9*radius, /* Ticks */
EtchColor); SelectObject(dc, CreatePen(PS_SOLID, 2, ShadowColor));
OffsetWindowOrgEx(dc, -SHADOW_DEPTH, -SHADOW_DEPTH, NULL);
DrawTicks(dc, centre, radius);
DeleteObject(SelectObject(dc, CreatePen(PS_SOLID, 2, TickColor)));
OffsetWindowOrgEx(dc, SHADOW_DEPTH, SHADOW_DEPTH, NULL);
DrawTicks(dc, centre, radius);
DeleteObject(SelectObject(dc, GetStockObject(NULL_BRUSH))); DeleteObject(SelectObject(dc, GetStockObject(NULL_BRUSH)));
DeleteObject(SelectObject(dc, GetStockObject(NULL_PEN))); DeleteObject(SelectObject(dc, GetStockObject(NULL_PEN)));
} }
@ -84,11 +104,31 @@ static void DrawHand(HDC dc,HandData* hand)
static void DrawHands(HDC dc, BOOL bSeconds) static void DrawHands(HDC dc, BOOL bSeconds)
{ {
SelectObject(dc,CreatePen(PS_SOLID,1,HandColor)); if (bSeconds) {
if (bSeconds) #if 0
SelectObject(dc, CreatePen(PS_SOLID, 1, ShadowColor));
OffsetWindowOrgEx(dc, -SHADOW_DEPTH, -SHADOW_DEPTH, NULL);
DrawHand(dc, &SecondHand); DrawHand(dc, &SecondHand);
DeleteObject(SelectObject(dc, CreatePen(PS_SOLID, 1, HandColor)));
OffsetWindowOrgEx(dc, SHADOW_DEPTH, SHADOW_DEPTH, NULL);
#else
SelectObject(dc, CreatePen(PS_SOLID, 1, HandColor));
#endif
DrawHand(dc, &SecondHand);
DeleteObject(SelectObject(dc, GetStockObject(NULL_PEN)));
}
SelectObject(dc, CreatePen(PS_SOLID, 4, ShadowColor));
OffsetWindowOrgEx(dc, -SHADOW_DEPTH, -SHADOW_DEPTH, NULL);
DrawHand(dc, &MinuteHand); DrawHand(dc, &MinuteHand);
DrawHand(dc, &HourHand); DrawHand(dc, &HourHand);
DeleteObject(SelectObject(dc, CreatePen(PS_SOLID, 4, HandColor)));
OffsetWindowOrgEx(dc, SHADOW_DEPTH, SHADOW_DEPTH, NULL);
DrawHand(dc, &MinuteHand);
DrawHand(dc, &HourHand);
DeleteObject(SelectObject(dc, GetStockObject(NULL_PEN))); DeleteObject(SelectObject(dc, GetStockObject(NULL_PEN)));
} }
@ -108,6 +148,7 @@ static void PositionHands(const POINT* centre, int radius, BOOL bSeconds)
/* Adding the millisecond count makes the second hand move more smoothly */ /* Adding the millisecond count makes the second hand move more smoothly */
GetLocalTime(&st); GetLocalTime(&st);
second = st.wSecond + st.wMilliseconds/1000.0; second = st.wSecond + st.wMilliseconds/1000.0;
minute = st.wMinute + second/60.0; minute = st.wMinute + second/60.0;
hour = st.wHour % 12 + minute/60.0; hour = st.wHour % 12 + minute/60.0;
@ -122,49 +163,79 @@ void AnalogClock(HDC dc, int x, int y, BOOL bSeconds)
{ {
POINT centre; POINT centre;
int radius; int radius;
radius = min(x, y)/2;
radius = min(x, y)/2 - SHADOW_DEPTH;
if (radius < 0)
return;
centre.x = x/2; centre.x = x/2;
centre.y = y/2; centre.y = y/2;
DrawFace(dc, &centre, radius); DrawFace(dc, &centre, radius);
PositionHands(&centre, radius, bSeconds); PositionHands(&centre, radius, bSeconds);
DrawHands(dc, bSeconds); DrawHands(dc, bSeconds);
} }
void DigitalClock(HDC dc, int x, int y, BOOL bSeconds)
HFONT SizeFont(HDC dc, int x, int y, BOOL bSeconds, const LOGFONT* font)
{ {
CHAR szTime[255];
SIZE extent; SIZE extent;
LOGFONT lf; LOGFONT lf;
double xscale, yscale; double xscale, yscale;
HFONT oldFont; HFONT oldFont, newFont;
CHAR szTime[255];
int chars;
GetTimeFormat(LOCALE_USER_DEFAULT, bSeconds ? 0 : TIME_NOSECONDS, NULL, chars = GetTimeFormat(LOCALE_USER_DEFAULT, bSeconds ? 0 : TIME_NOSECONDS, NULL,
NULL, szTime, sizeof (szTime)); NULL, szTime, sizeof (szTime));
if (!chars)
return 0;
memset(&lf, 0, sizeof (lf)); --chars;
lf = *font;
lf.lfHeight = -20; lf.lfHeight = -20;
x -= 2 * ETCH_DEPTH; x -= 2 * SHADOW_DEPTH;
y -= 2 * ETCH_DEPTH; y -= 2 * SHADOW_DEPTH;
oldFont = SelectObject(dc, CreateFontIndirect(&lf)); oldFont = SelectObject(dc, CreateFontIndirect(&lf));
GetTextExtentPoint(dc, szTime, strlen(szTime), &extent); GetTextExtentPoint(dc, szTime, chars, &extent);
DeleteObject(SelectObject(dc, oldFont));
xscale = (double)x/extent.cx; xscale = (double)x/extent.cx;
yscale = (double)y/extent.cy; yscale = (double)y/extent.cy;
lf.lfHeight *= min(xscale, yscale); lf.lfHeight *= min(xscale, yscale);
newFont = CreateFontIndirect(&lf);
DeleteObject(SelectObject(dc, CreateFontIndirect(&lf))); return newFont;
GetTextExtentPoint(dc, szTime, strlen(szTime), &extent); }
SetBkColor(dc, GRAY); /* to match the background brush */ void DigitalClock(HDC dc, int x, int y, BOOL bSeconds, HFONT font)
SetTextColor(dc, EtchColor); {
TextOut(dc, (x - extent.cx)/2 + ETCH_DEPTH, (y - extent.cy)/2 + ETCH_DEPTH, SIZE extent;
szTime, strlen(szTime)); HFONT oldFont;
CHAR szTime[255];
int chars;
chars = GetTimeFormat(LOCALE_USER_DEFAULT, bSeconds ? 0 : TIME_NOSECONDS, NULL,
NULL, szTime, sizeof (szTime));
if (!chars)
return;
--chars;
oldFont = SelectObject(dc, font);
GetTextExtentPoint(dc, szTime, chars, &extent);
SetBkColor(dc, BackgroundColor);
SetTextColor(dc, ShadowColor);
TextOut(dc, (x - extent.cx)/2 + SHADOW_DEPTH, (y - extent.cy)/2 + SHADOW_DEPTH,
szTime, chars);
SetBkMode(dc, TRANSPARENT); SetBkMode(dc, TRANSPARENT);
SetTextColor(dc, FaceColor); SetTextColor(dc, HandColor);
TextOut(dc, (x - extent.cx)/2, (y - extent.cy)/2, szTime, strlen(szTime)); TextOut(dc, (x - extent.cx)/2, (y - extent.cy)/2, szTime, chars);
DeleteObject(SelectObject(dc, oldFont));
SelectObject(dc, oldFont);
} }

View File

@ -22,4 +22,5 @@
*/ */
void AnalogClock(HDC dc, int X, int Y, BOOL bSeconds); void AnalogClock(HDC dc, int X, int Y, BOOL bSeconds);
void DigitalClock(HDC dc, int X, int Y, BOOL bSeconds); HFONT SizeFont(HDC dc, int x, int y, BOOL bSeconds, const LOGFONT* font);
void DigitalClock(HDC dc, int X, int Y, BOOL bSeconds, HFONT font);