From 636e39eb03ab3133049b0664591446604a9da4ce Mon Sep 17 00:00:00 2001 From: Steven Edwards Date: Mon, 1 Mar 2004 23:27:02 +0000 Subject: [PATCH] Imported WineCalc by James Briggs. svn path=/trunk/; revision=8502 --- rosapps/calc/En.rc | 155 ++ rosapps/calc/Es.rc | 155 ++ rosapps/calc/Fr.rc | 155 ++ rosapps/calc/It.rc | 155 ++ rosapps/calc/Nl.rc | 155 ++ rosapps/calc/Pt.rc | 155 ++ rosapps/calc/Ru.rc | 155 ++ rosapps/calc/Si.rc | 156 ++ rosapps/calc/button.c | 219 --- rosapps/calc/button.h | 44 - rosapps/calc/calc.rc | 388 +--- rosapps/calc/dialog.c | 93 + rosapps/calc/dialog.h | 24 + rosapps/calc/main.c | 266 --- rosapps/calc/main.h | 52 - rosapps/calc/makefile | 20 +- rosapps/calc/resource.h | 180 +- rosapps/calc/rsrc.rc | 33 + rosapps/calc/settings.c | 115 -- rosapps/calc/settings.h | 44 - rosapps/calc/stats.c | 131 ++ rosapps/calc/stats.h | 24 + rosapps/calc/winecalc.c | 3785 +++++++++++++++++++++++++++++++++++++++ rosapps/calc/winecalc.h | 364 ++++ 24 files changed, 5762 insertions(+), 1261 deletions(-) create mode 100644 rosapps/calc/En.rc create mode 100644 rosapps/calc/Es.rc create mode 100644 rosapps/calc/Fr.rc create mode 100644 rosapps/calc/It.rc create mode 100644 rosapps/calc/Nl.rc create mode 100644 rosapps/calc/Pt.rc create mode 100644 rosapps/calc/Ru.rc create mode 100644 rosapps/calc/Si.rc delete mode 100644 rosapps/calc/button.c delete mode 100644 rosapps/calc/button.h create mode 100644 rosapps/calc/dialog.c create mode 100644 rosapps/calc/dialog.h delete mode 100644 rosapps/calc/main.c delete mode 100644 rosapps/calc/main.h create mode 100644 rosapps/calc/rsrc.rc delete mode 100644 rosapps/calc/settings.c delete mode 100644 rosapps/calc/settings.h create mode 100644 rosapps/calc/stats.c create mode 100644 rosapps/calc/stats.h create mode 100644 rosapps/calc/winecalc.c create mode 100644 rosapps/calc/winecalc.h diff --git a/rosapps/calc/En.rc b/rosapps/calc/En.rc new file mode 100644 index 00000000000..7aa9134a5b2 --- /dev/null +++ b/rosapps/calc/En.rc @@ -0,0 +1,155 @@ +/* + * WineCalc (En.rc) + * + * Copyright 2003 James Briggs + * + * 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 "windows.h" +#include "resource.h" +#include "winecalc.h" + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +STRINGTABLE DISCARDABLE +{ + IDS_APPNAME, "GNU Calculator" + + IDS_COPYRIGHT1, "GNU Calculator 5.0. Licensed under LGPL 2" + IDS_COPYRIGHT2 "Copyright 2003, James Briggs" + IDS_COPYRIGHT3 "San Jose, California, USA" + IDS_COPYRIGHT4 "james@ActionMessage.com" + IDS_COPYRIGHT5 "http://www.ActionMessage.com/winecalc/" + + IDS_BTN_BACKSPACE, "Backspace" + IDS_BTN_CLEAR_ENTRY, "CE" + IDS_BTN_CLEAR_ALL, "C" + IDS_BTN_MEM_CLEAR, "MC" + IDS_BTN_MEM_RECALL, "MR" + IDS_BTN_MEM_STORE, "MS" + IDS_BTN_MEM_PLUS, "M+" + IDS_BTN_MEM_STATUS_M, "M" + IDS_BTN_SQRT, "sqrt" + IDS_ERR_INVALID_INPUT, "Invalid input for function." + IDS_ERR_DIVIDE_BY_ZERO, "Cannot divide by zero." + IDS_ERR_UNDEFINED, "Result of function is undefined." +} + +MAIN_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIMS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Degrees\tF2", ID_CALC_MS_DEGREES + MENUITEM "Radians\tF3", ID_CALC_MS_RADIANS + MENUITEM "Grads\tF4", ID_CALC_MS_GRADS + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIWS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Qword\tF12", ID_CALC_WS_QWORD + MENUITEM "Dword\tF2", ID_CALC_WS_DWORD + MENUITEM "Word\tF3", ID_CALC_WS_WORD + MENUITEM "Byte\tF4", ID_CALC_WS_BYTE + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +MAIN_MENU ACCELERATORS +BEGIN + VK_F1, IDV_HELP, VIRTKEY +END + +DLG_ABOUT DIALOG 12,0,120,82 +CAPTION "About GNU winecalc" +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +BEGIN + DEFPUSHBUTTON "OK", IDOK, 42, 60, 30, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +WHATS_THIS_MENU MENU DISCARDABLE +{ + POPUP "" { + MENUITEM "What's This?", IDM_WHATS_THIS + } +} + +DLG_STATS DIALOG 12,0,125,78 +CAPTION "Statistics Box" +FONT 9, "Tahoma" +STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE +BEGIN + DEFPUSHBUTTON "&RET", ID_STATS_RET, 4, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&LOAD", ID_STATS_LOAD, 34, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&CD" ID_STATS_CD, 64, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "C&AD", ID_STATS_CAD, 94, 52, 25, 13, WS_TABSTOP | WS_GROUP +END diff --git a/rosapps/calc/Es.rc b/rosapps/calc/Es.rc new file mode 100644 index 00000000000..29a8ab828f4 --- /dev/null +++ b/rosapps/calc/Es.rc @@ -0,0 +1,155 @@ +/* + * WineCalc (Es.rc) + * + * Copyright 2003 James Briggs + * + * 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 "windows.h" +#include "resource.h" +#include "winecalc.h" + +LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +{ + IDS_APPNAME, "GNU Calculator" + + IDS_COPYRIGHT1, "GNU Calculator 5.0. Licensed under LGPL 2" + IDS_COPYRIGHT2 "Copyright 2003, James Briggs" + IDS_COPYRIGHT3 "San Jose, California, USA" + IDS_COPYRIGHT4 "james@ActionMessage.com" + IDS_COPYRIGHT5 "http://www.ActionMessage.com/winecalc/" + + IDS_BTN_BACKSPACE, "Backspace" + IDS_BTN_CLEAR_ENTRY, "CE" + IDS_BTN_CLEAR_ALL, "C" + IDS_BTN_MEM_CLEAR, "MC" + IDS_BTN_MEM_RECALL, "MR" + IDS_BTN_MEM_STORE, "MS" + IDS_BTN_MEM_PLUS, "M+" + IDS_BTN_MEM_STATUS_M, "M" + IDS_BTN_SQRT, "sqrt" + IDS_ERR_INVALID_INPUT, "Invalid input for function." + IDS_ERR_DIVIDE_BY_ZERO, "Cannot divide by zero." + IDS_ERR_UNDEFINED, "Result of function is undefined." +} + +MAIN_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIMS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Degrees\tF2", ID_CALC_MS_DEGREES + MENUITEM "Radians\tF3", ID_CALC_MS_RADIANS + MENUITEM "Grads\tF4", ID_CALC_MS_GRADS + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIWS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Qword\tF12", ID_CALC_WS_QWORD + MENUITEM "Dword\tF2", ID_CALC_WS_DWORD + MENUITEM "Word\tF3", ID_CALC_WS_WORD + MENUITEM "Byte\tF4", ID_CALC_WS_BYTE + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +MAIN_MENU ACCELERATORS +BEGIN + VK_F1, IDV_HELP, VIRTKEY +END + +WHATS_THIS_MENU MENU DISCARDABLE +{ + POPUP "" { + MENUITEM "What's This?", IDM_WHATS_THIS + } +} + +DLG_ABOUT DIALOG 12,0,120,82 +CAPTION "About GNU winecalc" +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +BEGIN + DEFPUSHBUTTON "OK", IDOK, 42, 60, 30, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +DLG_STATS DIALOG 12,0,125,78 +CAPTION "Statistics Box" +FONT 9, "Tahoma" +STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE +BEGIN + DEFPUSHBUTTON "&RET", ID_STATS_RET, 4, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&LOAD", ID_STATS_LOAD, 34, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&CD" ID_STATS_CD, 64, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "C&AD", ID_STATS_CAD, 94, 52, 25, 13, WS_TABSTOP | WS_GROUP +END diff --git a/rosapps/calc/Fr.rc b/rosapps/calc/Fr.rc new file mode 100644 index 00000000000..44e6858bb2f --- /dev/null +++ b/rosapps/calc/Fr.rc @@ -0,0 +1,155 @@ +/* + * WineCalc (Fr.rc) + * + * Copyright 2003 James Briggs + * + * 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 "windows.h" +#include "resource.h" +#include "winecalc.h" + +LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +{ + IDS_APPNAME, "GNU Calculator" + + IDS_COPYRIGHT1, "GNU Calculator 5.0. Licensed under LGPL 2" + IDS_COPYRIGHT2 "Copyright 2003, James Briggs" + IDS_COPYRIGHT3 "San Jose, California, USA" + IDS_COPYRIGHT4 "james@ActionMessage.com" + IDS_COPYRIGHT5 "http://www.ActionMessage.com/winecalc/" + + IDS_BTN_BACKSPACE, "Backspace" + IDS_BTN_CLEAR_ENTRY, "CE" + IDS_BTN_CLEAR_ALL, "C" + IDS_BTN_MEM_CLEAR, "MC" + IDS_BTN_MEM_RECALL, "MR" + IDS_BTN_MEM_STORE, "MS" + IDS_BTN_MEM_PLUS, "M+" + IDS_BTN_MEM_STATUS_M, "M" + IDS_BTN_SQRT, "sqrt" + IDS_ERR_INVALID_INPUT, "Invalid input for function." + IDS_ERR_DIVIDE_BY_ZERO, "Cannot divide by zero." + IDS_ERR_UNDEFINED, "Result of function is undefined." +} + +MAIN_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIMS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Degrees\tF2", ID_CALC_MS_DEGREES + MENUITEM "Radians\tF3", ID_CALC_MS_RADIANS + MENUITEM "Grads\tF4", ID_CALC_MS_GRADS + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIWS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Qword\tF12", ID_CALC_WS_QWORD + MENUITEM "Dword\tF2", ID_CALC_WS_DWORD + MENUITEM "Word\tF3", ID_CALC_WS_WORD + MENUITEM "Byte\tF4", ID_CALC_WS_BYTE + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +MAIN_MENU ACCELERATORS +BEGIN + VK_F1, IDV_HELP, VIRTKEY +END + +WHATS_THIS_MENU MENU DISCARDABLE +{ + POPUP "" { + MENUITEM "What's This?", IDM_WHATS_THIS + } +} + +DLG_ABOUT DIALOG 12,0,120,82 +CAPTION "About GNU winecalc" +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +BEGIN + DEFPUSHBUTTON "OK", IDOK, 42, 60, 30, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +DLG_STATS DIALOG 12,0,125,78 +CAPTION "Statistics Box" +FONT 9, "Tahoma" +STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE +BEGIN + DEFPUSHBUTTON "&RET", ID_STATS_RET, 4, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&LOAD", ID_STATS_LOAD, 34, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&CD" ID_STATS_CD, 64, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "C&AD", ID_STATS_CAD, 94, 52, 25, 13, WS_TABSTOP | WS_GROUP +END diff --git a/rosapps/calc/It.rc b/rosapps/calc/It.rc new file mode 100644 index 00000000000..c269516d61c --- /dev/null +++ b/rosapps/calc/It.rc @@ -0,0 +1,155 @@ +/* + * WineCalc (It.rc) + * + * Copyright 2003 James Briggs + * + * 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 "windows.h" +#include "resource.h" +#include "winecalc.h" + +LANGUAGE LANG_ITALIAN, SUBLANG_DEFAULT + +STRINGTABLE DISCARDABLE +{ + IDS_APPNAME, "GNU Calculator" + + IDS_COPYRIGHT1, "GNU Calculator 5.0. Licensed under LGPL 2" + IDS_COPYRIGHT2 "Copyright 2003, James Briggs" + IDS_COPYRIGHT3 "San Jose, California, USA" + IDS_COPYRIGHT4 "james@ActionMessage.com" + IDS_COPYRIGHT5 "http://www.ActionMessage.com/winecalc/" + + IDS_BTN_BACKSPACE, "Backspace" + IDS_BTN_CLEAR_ENTRY, "CE" + IDS_BTN_CLEAR_ALL, "C" + IDS_BTN_MEM_CLEAR, "MC" + IDS_BTN_MEM_RECALL, "MR" + IDS_BTN_MEM_STORE, "MS" + IDS_BTN_MEM_PLUS, "M+" + IDS_BTN_MEM_STATUS_M, "M" + IDS_BTN_SQRT, "sqrt" + IDS_ERR_INVALID_INPUT, "Invalid input for function." + IDS_ERR_DIVIDE_BY_ZERO, "Cannot divide by zero." + IDS_ERR_UNDEFINED, "Result of function is undefined." +} + +MAIN_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIMS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Degrees\tF2", ID_CALC_MS_DEGREES + MENUITEM "Radians\tF3", ID_CALC_MS_RADIANS + MENUITEM "Grads\tF4", ID_CALC_MS_GRADS + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIWS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Qword\tF12", ID_CALC_WS_QWORD + MENUITEM "Dword\tF2", ID_CALC_WS_DWORD + MENUITEM "Word\tF3", ID_CALC_WS_WORD + MENUITEM "Byte\tF4", ID_CALC_WS_BYTE + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +MAIN_MENU ACCELERATORS +BEGIN + VK_F1, IDV_HELP, VIRTKEY +END + +WHATS_THIS_MENU MENU DISCARDABLE +{ + POPUP "" { + MENUITEM "What's This?", IDM_WHATS_THIS + } +} + +DLG_ABOUT DIALOG 12,0,120,82 +CAPTION "About GNU winecalc" +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +BEGIN + DEFPUSHBUTTON "OK", IDOK, 42, 60, 30, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +DLG_STATS DIALOG 12,0,125,78 +CAPTION "Statistics Box" +FONT 9, "Tahoma" +STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE +BEGIN + DEFPUSHBUTTON "&RET", ID_STATS_RET, 4, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&LOAD", ID_STATS_LOAD, 34, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&CD" ID_STATS_CD, 64, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "C&AD", ID_STATS_CAD, 94, 52, 25, 13, WS_TABSTOP | WS_GROUP +END diff --git a/rosapps/calc/Nl.rc b/rosapps/calc/Nl.rc new file mode 100644 index 00000000000..cf4cfb088b5 --- /dev/null +++ b/rosapps/calc/Nl.rc @@ -0,0 +1,155 @@ +/* + * WineCalc (Nl.rc) + * + * Copyright 2003 James Briggs + * + * 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 "windows.h" +#include "resource.h" +#include "winecalc.h" + +LANGUAGE LANG_DUTCH, SUBLANG_DEFAULT + +STRINGTABLE DISCARDABLE +{ + IDS_APPNAME, "GNU Calculator" + + IDS_COPYRIGHT1, "GNU Calculator 5.0. Licensed under LGPL 2" + IDS_COPYRIGHT2 "Copyright 2003, James Briggs" + IDS_COPYRIGHT3 "San Jose, California, USA" + IDS_COPYRIGHT4 "james@ActionMessage.com" + IDS_COPYRIGHT5 "http://www.ActionMessage.com/winecalc/" + + IDS_BTN_BACKSPACE, "Backspace" + IDS_BTN_CLEAR_ENTRY, "CE" + IDS_BTN_CLEAR_ALL, "C" + IDS_BTN_MEM_CLEAR, "MC" + IDS_BTN_MEM_RECALL, "MR" + IDS_BTN_MEM_STORE, "MS" + IDS_BTN_MEM_PLUS, "M+" + IDS_BTN_MEM_STATUS_M, "M" + IDS_BTN_SQRT, "sqrt" + IDS_ERR_INVALID_INPUT, "Invalid input for function." + IDS_ERR_DIVIDE_BY_ZERO, "Cannot divide by zero." + IDS_ERR_UNDEFINED, "Result of function is undefined." +} + +MAIN_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIMS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Degrees\tF2", ID_CALC_MS_DEGREES + MENUITEM "Radians\tF3", ID_CALC_MS_RADIANS + MENUITEM "Grads\tF4", ID_CALC_MS_GRADS + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIWS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Qword\tF12", ID_CALC_WS_QWORD + MENUITEM "Dword\tF2", ID_CALC_WS_DWORD + MENUITEM "Word\tF3", ID_CALC_WS_WORD + MENUITEM "Byte\tF4", ID_CALC_WS_BYTE + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +MAIN_MENU ACCELERATORS +BEGIN + VK_F1, IDV_HELP, VIRTKEY +END + +WHATS_THIS_MENU MENU DISCARDABLE +{ + POPUP "" { + MENUITEM "What's This?", IDM_WHATS_THIS + } +} + +DLG_ABOUT DIALOG 12,0,120,82 +CAPTION "About GNU winecalc" +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +BEGIN + DEFPUSHBUTTON "OK", IDOK, 42, 60, 30, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +DLG_STATS DIALOG 12,0,125,78 +CAPTION "Statistics Box" +FONT 9, "Tahoma" +STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE +BEGIN + DEFPUSHBUTTON "&RET", ID_STATS_RET, 4, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&LOAD", ID_STATS_LOAD, 34, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&CD" ID_STATS_CD, 64, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "C&AD", ID_STATS_CAD, 94, 52, 25, 13, WS_TABSTOP | WS_GROUP +END diff --git a/rosapps/calc/Pt.rc b/rosapps/calc/Pt.rc new file mode 100644 index 00000000000..2a76f5e132f --- /dev/null +++ b/rosapps/calc/Pt.rc @@ -0,0 +1,155 @@ +/* + * WineCalc (Pt.rc) + * + * Copyright 2003 James Briggs + * + * 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 "windows.h" +#include "resource.h" +#include "winecalc.h" + +LANGUAGE LANG_PORTUGUESE, SUBLANG_DEFAULT + +STRINGTABLE DISCARDABLE +{ + IDS_APPNAME, "GNU Calculator" + + IDS_COPYRIGHT1, "GNU Calculator 5.0. Licensed under LGPL 2" + IDS_COPYRIGHT2 "Copyright 2003, James Briggs" + IDS_COPYRIGHT3 "San Jose, California, USA" + IDS_COPYRIGHT4 "james@ActionMessage.com" + IDS_COPYRIGHT5 "http://www.ActionMessage.com/winecalc/" + + IDS_BTN_BACKSPACE, "Backspace" + IDS_BTN_CLEAR_ENTRY, "CE" + IDS_BTN_CLEAR_ALL, "C" + IDS_BTN_MEM_CLEAR, "MC" + IDS_BTN_MEM_RECALL, "MR" + IDS_BTN_MEM_STORE, "MS" + IDS_BTN_MEM_PLUS, "M+" + IDS_BTN_MEM_STATUS_M, "M" + IDS_BTN_SQRT, "sqrt" + IDS_ERR_INVALID_INPUT, "Invalid input for function." + IDS_ERR_DIVIDE_BY_ZERO, "Cannot divide by zero." + IDS_ERR_UNDEFINED, "Result of function is undefined." +} + +MAIN_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIMS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Degrees\tF2", ID_CALC_MS_DEGREES + MENUITEM "Radians\tF3", ID_CALC_MS_RADIANS + MENUITEM "Grads\tF4", ID_CALC_MS_GRADS + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIWS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Qword\tF12", ID_CALC_WS_QWORD + MENUITEM "Dword\tF2", ID_CALC_WS_DWORD + MENUITEM "Word\tF3", ID_CALC_WS_WORD + MENUITEM "Byte\tF4", ID_CALC_WS_BYTE + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +MAIN_MENU ACCELERATORS +BEGIN + VK_F1, IDV_HELP, VIRTKEY +END + +WHATS_THIS_MENU MENU DISCARDABLE +{ + POPUP "" { + MENUITEM "What's This?", IDM_WHATS_THIS + } +} + +DLG_ABOUT DIALOG 12,0,120,82 +CAPTION "About GNU winecalc" +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +BEGIN + DEFPUSHBUTTON "OK", IDOK, 42, 60, 30, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +DLG_STATS DIALOG 12,0,125,78 +CAPTION "Statistics Box" +FONT 9, "Tahoma" +STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE +BEGIN + DEFPUSHBUTTON "&RET", ID_STATS_RET, 4, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&LOAD", ID_STATS_LOAD, 34, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&CD" ID_STATS_CD, 64, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "C&AD", ID_STATS_CAD, 94, 52, 25, 13, WS_TABSTOP | WS_GROUP +END diff --git a/rosapps/calc/Ru.rc b/rosapps/calc/Ru.rc new file mode 100644 index 00000000000..2b5315f8141 --- /dev/null +++ b/rosapps/calc/Ru.rc @@ -0,0 +1,155 @@ +/* + * WineCalc (Ru.rc) + * + * Copyright 2003 James Briggs + * + * 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 "windows.h" +#include "resource.h" +#include "winecalc.h" + +LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT + +STRINGTABLE DISCARDABLE +{ + IDS_APPNAME, "GNU Calculator" + + IDS_COPYRIGHT1, "GNU Calculator 5.0. Licensed under LGPL 2" + IDS_COPYRIGHT2 "Copyright 2003, James Briggs" + IDS_COPYRIGHT3 "San Jose, California, USA" + IDS_COPYRIGHT4 "james@ActionMessage.com" + IDS_COPYRIGHT5 "http://www.ActionMessage.com/winecalc/" + + IDS_BTN_BACKSPACE, "Backspace" + IDS_BTN_CLEAR_ENTRY, "CE" + IDS_BTN_CLEAR_ALL, "C" + IDS_BTN_MEM_CLEAR, "MC" + IDS_BTN_MEM_RECALL, "MR" + IDS_BTN_MEM_STORE, "MS" + IDS_BTN_MEM_PLUS, "M+" + IDS_BTN_MEM_STATUS_M, "M" + IDS_BTN_SQRT, "sqrt" + IDS_ERR_INVALID_INPUT, "Invalid input for function." + IDS_ERR_DIVIDE_BY_ZERO, "Cannot divide by zero." + IDS_ERR_UNDEFINED, "Result of function is undefined." +} + +MAIN_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIMS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Degrees\tF2", ID_CALC_MS_DEGREES + MENUITEM "Radians\tF3", ID_CALC_MS_RADIANS + MENUITEM "Grads\tF4", ID_CALC_MS_GRADS + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIWS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Qword\tF12", ID_CALC_WS_QWORD + MENUITEM "Dword\tF2", ID_CALC_WS_DWORD + MENUITEM "Word\tF3", ID_CALC_WS_WORD + MENUITEM "Byte\tF4", ID_CALC_WS_BYTE + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +MAIN_MENU ACCELERATORS +BEGIN + VK_F1, IDV_HELP, VIRTKEY +END + +WHATS_THIS_MENU MENU DISCARDABLE +{ + POPUP "" { + MENUITEM "What's This?", IDM_WHATS_THIS + } +} + +DLG_ABOUT DIALOG 12,0,120,82 +CAPTION "About GNU winecalc" +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +BEGIN + DEFPUSHBUTTON "OK", IDOK, 42, 60, 30, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +DLG_STATS DIALOG 12,0,125,78 +CAPTION "Statistics Box" +FONT 9, "Tahoma" +STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE +BEGIN + DEFPUSHBUTTON "&RET", ID_STATS_RET, 4, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&LOAD", ID_STATS_LOAD, 34, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&CD" ID_STATS_CD, 64, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "C&AD", ID_STATS_CAD, 94, 52, 25, 13, WS_TABSTOP | WS_GROUP +END diff --git a/rosapps/calc/Si.rc b/rosapps/calc/Si.rc new file mode 100644 index 00000000000..970c71847d5 --- /dev/null +++ b/rosapps/calc/Si.rc @@ -0,0 +1,156 @@ +/* + * WineCalc (Si.rc) + * + * Copyright 2003 James Briggs + * + * 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 "windows.h" +#include "resource.h" +#include "winecalc.h" + +LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT + +STRINGTABLE DISCARDABLE +{ + IDS_APPNAME, "GNU Calculator" + + IDS_COPYRIGHT1, "GNU Calculator 5.0. Licensed under LGPL 2" + IDS_COPYRIGHT2 "Copyright 2003, James Briggs" + IDS_COPYRIGHT3 "San Jose, California, USA" + IDS_COPYRIGHT4 "james@ActionMessage.com" + IDS_COPYRIGHT5 "http://www.ActionMessage.com/winecalc/" + + IDS_BTN_BACKSPACE, "Backspace" + IDS_BTN_CLEAR_ENTRY, "CE" + IDS_BTN_CLEAR_ALL, "C" + IDS_BTN_MEM_CLEAR, "MC" + IDS_BTN_MEM_RECALL, "MR" + IDS_BTN_MEM_STORE, "MS" + IDS_BTN_MEM_PLUS, "M+" + IDS_BTN_MEM_STATUS_M, "M" + IDS_BTN_SQRT, "sqrt" + IDS_ERR_INVALID_INPUT, "Invalid input for function." + IDS_ERR_DIVIDE_BY_ZERO, "Cannot divide by zero." + IDS_ERR_UNDEFINED, "Result of function is undefined." +} + +MAIN_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIMS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Degrees\tF2", ID_CALC_MS_DEGREES + MENUITEM "Radians\tF3", ID_CALC_MS_RADIANS + MENUITEM "Grads\tF4", ID_CALC_MS_GRADS + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +SCIWS_MENU MENU DISCARDABLE +{ + POPUP "&Edit" { + MENUITEM "&Copy Ctrl+C", IDM_COPY + MENUITEM "&Paste Ctrl+V", IDM_PASTE + } + POPUP "&View" { + MENUITEM "Standard", IDM_MODE_STANDARD + MENUITEM "Scientific", IDM_MODE_SCIENTIFIC + MENUITEM SEPARATOR + MENUITEM "Hex\tF5", ID_CALC_NS_HEX + MENUITEM "Decimal\tF6", ID_CALC_NS_DEC + MENUITEM "Octal\tF7", ID_CALC_NS_OCT + MENUITEM "Binary\tF8", ID_CALC_NS_BIN + MENUITEM SEPARATOR + MENUITEM "Qword\tF12", ID_CALC_WS_QWORD + MENUITEM "Dword\tF2", ID_CALC_WS_DWORD + MENUITEM "Word\tF3", ID_CALC_WS_WORD + MENUITEM "Byte\tF4", ID_CALC_WS_BYTE + MENUITEM SEPARATOR + MENUITEM "Digit Grouping", IDM_DIGIT_GROUPING + } + POPUP "&Help" { + MENUITEM "Help Topics", IDM_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "About Calculator", IDM_ABOUT + } +} + +MAIN_MENU ACCELERATORS +BEGIN + VK_F1, IDV_HELP, VIRTKEY +END + +WHATS_THIS_MENU MENU DISCARDABLE +{ + POPUP "" { + MENUITEM "What's This?", IDM_WHATS_THIS + } +} + + +DLG_ABOUT DIALOG 12,0,120,82 +CAPTION "About GNU winecalc" +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +BEGIN + DEFPUSHBUTTON "OK", IDOK, 42, 60, 30, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +DLG_STATS DIALOG 12,0,125,78 +CAPTION "Statistics Box" +FONT 9, "Tahoma" +STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE +BEGIN + DEFPUSHBUTTON "&RET", ID_STATS_RET, 4, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&LOAD", ID_STATS_LOAD, 34, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&CD" ID_STATS_CD, 64, 52, 25, 13, WS_TABSTOP | WS_GROUP + PUSHBUTTON "C&AD", ID_STATS_CAD, 94, 52, 25, 13, WS_TABSTOP | WS_GROUP +END diff --git a/rosapps/calc/button.c b/rosapps/calc/button.c deleted file mode 100644 index f66572e13e0..00000000000 --- a/rosapps/calc/button.c +++ /dev/null @@ -1,219 +0,0 @@ -/* - * ReactOS calc - * - * button.c - * - * Copyright (C) 2002 Robert Dickenson - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers -#include -#include - -#include "resource.h" -#include "button.h" - - -COLORREF text_colour; -COLORREF background_colour; -COLORREF disabled_background_colour; -COLORREF light; -COLORREF highlight; -COLORREF shadow; -COLORREF dark_shadow; - -const COLORREF CLR_BTN_WHITE = RGB(255, 255, 255); -const COLORREF CLR_BTN_BLACK = RGB(0, 0, 0); -const COLORREF CLR_BTN_DGREY = RGB(128, 128, 128); -const COLORREF CLR_BTN_GREY = RGB(192, 192, 192); -const COLORREF CLR_BTN_LLGREY = RGB(223, 223, 223); - -const int BUTTON_IN = 0x01; -const int BUTTON_OUT = 0x02; -const int BUTTON_BLACK_BORDER = 0x04; - - -void InitColours(void) -{ -// text_colour = GetSysColor(COLOR_BTNTEXT); - text_colour = RGB(255,0,0); - - background_colour = GetSysColor(COLOR_BTNFACE); - disabled_background_colour = background_colour; - light = GetSysColor(COLOR_3DLIGHT); - highlight = GetSysColor(COLOR_BTNHIGHLIGHT); - shadow = GetSysColor(COLOR_BTNSHADOW); - dark_shadow = GetSysColor(COLOR_3DDKSHADOW); -} - -static void FillSolidRect(HDC hDC, int x, int y, int cx, int cy, COLORREF clr) -{ - RECT rect; - - SetBkColor(hDC, clr); - rect.left = x; - rect.top = y; - rect.right = x + cx; - rect.bottom = y + cy; - ExtTextOut(hDC, 0, 0, ETO_OPAQUE, &rect, NULL, 0, NULL); -} - -void Draw3dRect(HDC hDC, int x, int y, int cx, int cy, COLORREF clrTopLeft, COLORREF clrBottomRight) -{ - FillSolidRect(hDC, x, y, cx - 1, 1, clrTopLeft); - FillSolidRect(hDC, x, y, 1, cy - 1, clrTopLeft); - FillSolidRect(hDC, x + cx, y, -1, cy, clrBottomRight); - FillSolidRect(hDC, x, y + cy, cx, -1, clrBottomRight); -} - - -void DrawFilledRect(HDC hdc, LPRECT r, COLORREF colour) -{ - HBRUSH hBrush; - - hBrush = CreateSolidBrush(colour); - FillRect(hdc, r, hBrush); -} - -void DrawLine(HDC hdc, long sx, long sy, long ex, long ey, COLORREF colour) -{ - HPEN new_pen; - HPEN old_pen; - - new_pen = CreatePen(PS_SOLID, 1, colour); - old_pen = SelectObject(hdc, &new_pen); - MoveToEx(hdc, sx, sy, NULL); - LineTo(hdc, ex, ey); - SelectObject(hdc, old_pen); - DeleteObject(new_pen); -} - -void DrawFrame(HDC hdc, RECT r, int state) -{ - COLORREF colour; - - if (state & BUTTON_BLACK_BORDER) { - colour = CLR_BTN_BLACK; - DrawLine(hdc, r.left, r.top, r.right, r.top, colour); // Across top - DrawLine(hdc, r.left, r.top, r.left, r.bottom, colour); // Down left - DrawLine(hdc, r.left, r.bottom - 1, r.right, r.bottom - 1, colour); // Across bottom - DrawLine(hdc, r.right - 1, r.top, r.right - 1, r.bottom, colour); // Down right - InflateRect(&r, -1, -1); - } - if (state & BUTTON_OUT) { - colour = highlight; - DrawLine(hdc, r.left, r.top, r.right, r.top, colour); // Across top - DrawLine(hdc, r.left, r.top, r.left, r.bottom, colour); // Down left - colour = dark_shadow; - DrawLine(hdc, r.left, r.bottom - 1, r.right, r.bottom - 1, colour); // Across bottom - DrawLine(hdc, r.right - 1, r.top, r.right - 1, r.bottom, colour); // Down right - InflateRect(&r, -1, -1); - colour = light; - DrawLine(hdc, r.left, r.top, r.right, r.top, colour); // Across top - DrawLine(hdc, r.left, r.top, r.left, r.bottom, colour); // Down left - colour = shadow; - DrawLine(hdc, r.left, r.bottom - 1, r.right, r.bottom - 1, colour); // Across bottom - DrawLine(hdc, r.right - 1, r.top, r.right - 1, r.bottom, colour); // Down right - } - if (state & BUTTON_IN) { - colour = dark_shadow; - DrawLine(hdc, r.left, r.top, r.right, r.top, colour); // Across top - DrawLine(hdc, r.left, r.top, r.left, r.bottom, colour); // Down left - DrawLine(hdc, r.left, r.bottom - 1, r.right, r.bottom - 1, colour); // Across bottom - DrawLine(hdc, r.right - 1, r.top, r.right - 1, r.bottom, colour); // Down right - InflateRect(&r, -1, -1); - colour = shadow; - DrawLine(hdc, r.left, r.top, r.right, r.top, colour); // Across top - DrawLine(hdc, r.left, r.top, r.left, r.bottom, colour); // Down left - DrawLine(hdc, r.left, r.bottom - 1, r.right, r.bottom - 1, colour); // Across bottom - DrawLine(hdc, r.right - 1, r.top, r.right - 1, r.bottom, colour); // Down right - } -} - -void DrawButtonText(HDC hdc, LPRECT r, LPCTSTR Buf, COLORREF text_colour) -{ - COLORREF previous_colour; - - previous_colour = SetTextColor(hdc, text_colour); - SetBkMode(hdc, TRANSPARENT); - DrawText(hdc, Buf, _tcslen(Buf), r, DT_CENTER | DT_VCENTER | DT_SINGLELINE); - SetTextColor(hdc, previous_colour); -} - -#define bufSize 512 - -void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) -{ - HDC hdc; - RECT focus_rect, button_rect, offset_button_rect; - UINT state; - TCHAR buffer[bufSize]; - - hdc = lpDrawItemStruct->hDC; - state = lpDrawItemStruct->itemState; - - CopyRect(&focus_rect, &lpDrawItemStruct->rcItem); - CopyRect(&button_rect, &lpDrawItemStruct->rcItem); - - // Set the focus rectangle to just past the border decoration - focus_rect.left += 4; - focus_rect.right -= 4; - focus_rect.top += 4; - focus_rect.bottom -= 4; - - // Retrieve the button's caption - GetWindowText(lpDrawItemStruct->hwndItem, buffer, bufSize); - - if (state & ODS_DISABLED) { - DrawFilledRect(hdc, &button_rect, disabled_background_colour); - } else { - DrawFilledRect(hdc, &button_rect, background_colour); - } - - if (state & ODS_SELECTED) { - DrawFrame(hdc, button_rect, BUTTON_IN); - } else { - if ((state & ODS_DEFAULT) || (state & ODS_FOCUS)) { - DrawFrame(hdc, button_rect, BUTTON_OUT | BUTTON_BLACK_BORDER); - } else { - DrawFrame(hdc, button_rect, BUTTON_OUT); - } - } - - if (state & ODS_DISABLED) { - offset_button_rect = button_rect; - OffsetRect(&offset_button_rect, 1, 1); - DrawButtonText(hdc, &offset_button_rect, buffer, CLR_BTN_WHITE); - DrawButtonText(hdc, &button_rect, buffer, CLR_BTN_DGREY); - } else { - if (lpDrawItemStruct->CtlID >= ID_RED_START && lpDrawItemStruct->CtlID <= ID_RED_FINISH) { - DrawButtonText(hdc, &button_rect, buffer, RGB(255,0,0)); - } else - if (lpDrawItemStruct->CtlID >= ID_PURPLE_START && lpDrawItemStruct->CtlID <= ID_PURPLE_FINISH) { - DrawButtonText(hdc, &button_rect, buffer, RGB(0,128,128)); - } else - if (lpDrawItemStruct->CtlID >= ID_BLUE_START && lpDrawItemStruct->CtlID <= ID_BLUE_FINISH) { - DrawButtonText(hdc, &button_rect, buffer, RGB(0,0,255)); - } else { - DrawButtonText(hdc, &button_rect, buffer, text_colour); - } - } - - if (state & ODS_FOCUS) { - DrawFocusRect(lpDrawItemStruct->hDC, (LPRECT)&focus_rect); - } -} diff --git a/rosapps/calc/button.h b/rosapps/calc/button.h deleted file mode 100644 index a0ff5dc62b0..00000000000 --- a/rosapps/calc/button.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * ReactOS calc - * - * button.h - * - * Copyright (C) 2002 Robert Dickenson - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef __BUTTON_H__ -#define __BUTTON_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - - -void InitColours(void); -void Draw3dRect(HDC hDC, int x, int y, int cx, int cy, COLORREF clrTopLeft, COLORREF clrBottomRight); -void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); - - -#ifdef __cplusplus -}; -#endif - -#endif // __BUTTON_H__ diff --git a/rosapps/calc/calc.rc b/rosapps/calc/calc.rc index 2ef1a7628fc..27069ea06d3 100644 --- a/rosapps/calc/calc.rc +++ b/rosapps/calc/calc.rc @@ -1,388 +1,6 @@ +/* Do not Make changes here */ + #include #include -//Microsoft Developer Studio generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#define APSTUDIO_HIDDEN_SYMBOLS -#include "windows.h" -#undef APSTUDIO_HIDDEN_SYMBOLS -#include "resource.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (Australia) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENA) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_AUS -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDR_CALC_STANDARD MENU DISCARDABLE -BEGIN - POPUP "&Edit" - BEGIN - MENUITEM "&Copy\tCtrl+C", ID_EDIT_COPY - MENUITEM "&Paste\tCtrl+V", ID_EDIT_PASTE - END - POPUP "&View" - BEGIN - MENUITEM "S&tandard", ID_VIEW_STANDARD, CHECKED - MENUITEM "&Scientific", ID_VIEW_SCIENTIFIC - MENUITEM SEPARATOR - MENUITEM "D&igit grouping", ID_VIEW_DIGIT_GROUPING - END - POPUP "&Help" - BEGIN - MENUITEM "&Help Topics", ID_HELP_TOPICS - MENUITEM SEPARATOR - MENUITEM "&About Calculator", ID_HELP_ABOUT - END -END - -IDR_CALC_SCIENTIFIC MENU DISCARDABLE -BEGIN - POPUP "&Edit" - BEGIN - MENUITEM "&Copy\tCtrl+C", ID_EDIT_COPY - MENUITEM "&Paste\tCtrl+V", ID_EDIT_PASTE - END - POPUP "&View" - BEGIN - MENUITEM "S&tandard", ID_VIEW_STANDARD - MENUITEM "&Scientific", ID_VIEW_SCIENTIFIC, CHECKED - MENUITEM SEPARATOR - MENUITEM "&Hex\tF5", ID_VIEW_HEX - MENUITEM "&Decimal\tF6", ID_VIEW_DECIMAL - MENUITEM "&Octal\tF7", ID_VIEW_OCTAL - MENUITEM "&Binary\tF8", ID_VIEW_BINARY - MENUITEM SEPARATOR - MENUITEM "D&egrees\tF2", ID_VIEW_DEGREES - MENUITEM "&Radians\tF3", ID_VIEW_RADIANS - MENUITEM "&Grads\tF4", ID_VIEW_GRADS - MENUITEM SEPARATOR - MENUITEM "D&igit grouping", ID_VIEW_DIGIT_GROUPING - END - POPUP "&Help" - BEGIN - MENUITEM "&Help Topics", ID_HELP_TOPICS - MENUITEM SEPARATOR - MENUITEM "&About Scientific Calculator", ID_HELP_ABOUT - END -END - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE DISCARDABLE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -3 TEXTINCLUDE DISCARDABLE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_STANDARD DIALOG DISCARDABLE 0, 0, 170, 126 -STYLE DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | - WS_SYSMENU -CAPTION "ReactOS Calculator" -MENU IDR_CALC_STANDARD -FONT 8, "MS Sans Serif" -BEGIN - CONTROL "M+",IDC_MPLUS,"Button",BS_OWNERDRAW,5,106, - 23,16 - CONTROL "MS",IDC_MS,"Button",BS_OWNERDRAW,5,85,23, - 16 - CONTROL "MR",IDC_MR,"Button",BS_OWNERDRAW,5,65,23, - 16 - CONTROL "MC",IDC_MC,"Button",BS_OWNERDRAW,5,45,23, - 16 - CONTROL "0",IDC_0,"Button",BS_OWNERDRAW,37,106,23, - 16 - CONTROL "1",IDC_1,"Button",BS_OWNERDRAW,37,85,23,16 - CONTROL "4",IDC_4,"Button",BS_OWNERDRAW,37,65,23,16 - CONTROL "7",IDC_7,"Button",BS_OWNERDRAW,37,45,23,16 - CONTROL "+/-",IDC_PLUSMINUS,"Button",BS_OWNERDRAW, - 63,106,23,16 - CONTROL "2",IDC_2,"Button",BS_OWNERDRAW,63,85,23,16 - CONTROL "5",IDC_5,"Button",BS_OWNERDRAW,63,65,23,16 - CONTROL "8",IDC_8,"Button",BS_OWNERDRAW,63,45,23,16 - CONTROL ".",IDC_DECPOINT,"Button",BS_OWNERDRAW,89, - 106,23,16 - CONTROL "3",IDC_3,"Button",BS_OWNERDRAW,89,85,23,16 - CONTROL "6",IDC_6,"Button",BS_OWNERDRAW,89,65,23,16 - CONTROL "9",IDC_9,"Button",BS_OWNERDRAW,89,45,23,16 - CONTROL "+",IDC_PLUS,"Button",BS_OWNERDRAW,115,106, - 23,16 - CONTROL "-",IDC_MINUS,"Button",BS_OWNERDRAW,115,85, - 23,16 - CONTROL "*",IDC_MULTIPLY,"Button",BS_OWNERDRAW,115, - 65,23,16 - CONTROL "/",IDC_DIVIDE,"Button",BS_OWNERDRAW,115,45, - 23,16 - CONTROL "=",IDC_EQUALS,"Button",BS_OWNERDRAW,142, - 106,23,16 - CONTROL "1/x",IDC_INVERT,"Button",BS_OWNERDRAW,142, - 85,23,16 - CONTROL "%",IDC_PERCENT,"Button",BS_OWNERDRAW,142, - 65,23,16 - CONTROL "sqrt",IDC_SQRT,"Button",BS_OWNERDRAW,142, - 45,23,16 - CONTROL "C",IDC_CLEAR,"Button",BS_OWNERDRAW,126,23, - 39,16 - CONTROL "CE",IDC_CE,"Button",BS_OWNERDRAW,83,23,39, - 16 - CONTROL "Backspace",IDC_BSPACE,"Button",BS_OWNERDRAW,38,23,41,16 - CTEXT "M",IDC_MEMTEXT,7,23,19,16,SS_CENTERIMAGE | SS_SUNKEN - EDITTEXT IDC_RESULT,7,0,157,15,ES_RIGHT | ES_AUTOHSCROLL -END - -IDD_SCIENTIFIC DIALOG DISCARDABLE 0, 0, 313, 161 -STYLE DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Scientific Calculator" -MENU IDR_CALC_SCIENTIFIC -FONT 8, "MS Sans Serif" -BEGIN - CONTROL "M+",IDC_MPLUS,"Button",BS_OWNERDRAW,122, - 121,23,16 - CONTROL "MS",IDC_MS,"Button",BS_OWNERDRAW,122,101, - 23,16 - CONTROL "MR",IDC_MR,"Button",BS_OWNERDRAW,122,81,23, - 16 - CONTROL "MC",IDC_MC,"Button",BS_OWNERDRAW,122,61,23, - 16 - CONTROL "0",IDC_0,"Button",BS_OWNERDRAW,156,121,23, - 16 - CONTROL "1",IDC_1,"Button",BS_OWNERDRAW,156,101,23, - 16 - CONTROL "4",IDC_4,"Button",BS_OWNERDRAW,156,81,23, - 16 - CONTROL "7",IDC_7,"Button",BS_OWNERDRAW,156,61,23, - 16 - CONTROL "+/-",IDC_PLUSMINUS,"Button",BS_OWNERDRAW, - 182,121,23,16 - CONTROL "2",IDC_2,"Button",BS_OWNERDRAW,182,101,23, - 16 - CONTROL "5",IDC_5,"Button",BS_OWNERDRAW,182,81,23, - 16 - CONTROL "8",IDC_8,"Button",BS_OWNERDRAW,182,61,23, - 16 - CONTROL ".",IDC_DECPOINT,"Button",BS_OWNERDRAW,208, - 121,23,16 - CONTROL "3",IDC_3,"Button",BS_OWNERDRAW,208,101,23, - 16 - CONTROL "6",IDC_6,"Button",BS_OWNERDRAW,208,81,23, - 16 - CONTROL "9",IDC_9,"Button",BS_OWNERDRAW,208,61,23, - 16 - CONTROL "+",IDC_PLUS,"Button",BS_OWNERDRAW,234,121, - 23,16 - CONTROL "-",IDC_MINUS,"Button",BS_OWNERDRAW,234,101, - 23,16 - CONTROL "*",IDC_MULTIPLY,"Button",BS_OWNERDRAW,234, - 81,23,16 - CONTROL "/",IDC_DIVIDE,"Button",BS_OWNERDRAW,234,61, - 23,16 - CONTROL "=",IDC_EQUALS,"Button",BS_OWNERDRAW,260, - 121,23,16 - CONTROL "Lsh",IDC_LSH,"Button",BS_OWNERDRAW,260,101, - 23,16 - CONTROL "Or",IDC_OR,"Button",BS_OWNERDRAW,260,81,23, - 16 - CONTROL "Mod",IDC_MOD,"Button",BS_OWNERDRAW,260,61, - 23,16 - CONTROL "C",IDC_CLEAR,"Button",BS_OWNERDRAW,268,38, - 41,16 - CONTROL "CE",IDC_CE,"Button",BS_OWNERDRAW,224,38,40, - 16 - CONTROL "Backspace",IDC_BSPACE,"Button",BS_OWNERDRAW,178,38,42,16 - CTEXT "M",IDC_MEMTEXT,123,38,19,16,SS_CENTERIMAGE | SS_SUNKEN - CONTROL "Int",IDC_INT,"Button",BS_OWNERDRAW,286,121, - 23,16 - CONTROL "Not",IDC_NOT,"Button",BS_OWNERDRAW,286,101, - 23,16 - CONTROL "Xor",IDC_XOR,"Button",BS_OWNERDRAW,286,81, - 23,16 - CONTROL "And",IDC_AND,"Button",BS_OWNERDRAW,286,61, - 23,16 - CONTROL "pi",IDC_PI,"Button",BS_OWNERDRAW,122,142, - 23,16 - CONTROL "A",IDC_A,"Button",BS_OWNERDRAW,156,142,23, - 16 - CONTROL "B",IDC_B,"Button",BS_OWNERDRAW,182,142,23, - 16 - CONTROL "C",IDC_C,"Button",BS_OWNERDRAW,208,142,23, - 16 - CONTROL "D",IDC_D,"Button",BS_OWNERDRAW,234,142,23, - 16 - CONTROL "E",IDC_E,"Button",BS_OWNERDRAW,260,142,23, - 16 - CONTROL "F",IDC_F,"Button",BS_OWNERDRAW,286,142,23, - 16 - CONTROL "cos",IDC_COS,"Button",BS_OWNERDRAW,37,121, - 23,16 - CONTROL "sin",IDC_SIN,"Button",BS_OWNERDRAW,37,101, - 23,16 - CONTROL "dms",IDC_DMS,"Button",BS_OWNERDRAW,37,81, - 23,16 - CONTROL "F-E",IDC_FE,"Button",BS_OWNERDRAW,37,61,23, - 16 - CONTROL "x^3",IDC_CUBE,"Button",BS_OWNERDRAW,63,121, - 23,16 - CONTROL "x^y",IDC_POWER,"Button",BS_OWNERDRAW,63, - 101,23,16 - CONTROL "Exp",IDC_EXP,"Button",BS_OWNERDRAW,63,81, - 23,16 - CONTROL "(",IDC_OPENBKT,"Button",BS_OWNERDRAW,63,61, - 23,16 - CONTROL "n!",IDC_BANG,"Button",BS_OWNERDRAW,89,121, - 23,16 - CONTROL "log",IDC_LOG,"Button",BS_OWNERDRAW,89,101, - 23,16 - CONTROL "ln",IDC_LN,"Button",BS_OWNERDRAW,89,81,23, - 16 - CONTROL ")",IDC_CLOSEBK,"Button",BS_OWNERDRAW,89,61, - 23,16 - CONTROL "tan",IDC_TAN,"Button",BS_OWNERDRAW,37,142, - 23,16 - CONTROL "x^2",IDC_SQUARE,"Button",BS_OWNERDRAW,63, - 142,23,16 - CONTROL "1/x",IDC_INVERT,"Button",BS_OWNERDRAW,89, - 142,23,16 - CONTROL "s",IDC_S,"Button",BS_OWNERDRAW,4,121,23,16 - CONTROL "Sum",IDC_SUM,"Button",BS_OWNERDRAW,4,101, - 23,16 - CONTROL "Ave",IDC_AVE,"Button",BS_OWNERDRAW,4,81,23, - 16 - CONTROL "Sta",IDC_STA,"Button",BS_OWNERDRAW,4,61,23, - 16 - CONTROL "Dat",IDC_DAT,"Button",BS_OWNERDRAW,4,142, - 23,16 - CTEXT "9",IDC_BKTTEXT,91,38,19,16,SS_CENTERIMAGE | SS_SUNKEN - GROUPBOX "",IDC_INVHYP,6,34,80,22,WS_GROUP - CONTROL "Inv",IDC_INV,"Button",BS_AUTOCHECKBOX,9,42,26,10 - CONTROL "Hyp",IDC_HYP,"Button",BS_AUTOCHECKBOX,47,41,29,10 - GROUPBOX "",IDC_BASE,6,13,141,22,WS_GROUP - CONTROL "Hex",IDC_HEX,"Button",BS_AUTORADIOBUTTON,8,21,29,10 - CONTROL "Dec",IDC_DEC,"Button",BS_AUTORADIOBUTTON,42,21,29,10 - CONTROL "Oct",IDC_OCT,"Button",BS_AUTORADIOBUTTON,76,21,27,10 - CONTROL "Bin",IDC_BIN,"Button",BS_AUTORADIOBUTTON,109,21,26,10 - GROUPBOX "",IDC_UNITS,150,13,160,22,WS_GROUP - CONTROL "Degrees",IDC_DEGREES,"Button",BS_AUTORADIOBUTTON,152,21, - 43,10 - CONTROL "Radians",IDC_RADIANS,"Button",BS_AUTORADIOBUTTON,204,21, - 42,10 - CONTROL "Grads",IDC_GRADS,"Button",BS_AUTORADIOBUTTON,255,21,35, - 10 - EDITTEXT IDC_RESULT,6,0,303,15,ES_RIGHT | ES_AUTOHSCROLL -END - - -#ifndef _MAC -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -(1) VERSIONINFO - FILEVERSION 0,0,19,147 - PRODUCTVERSION 0,0,19,0 - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x40004L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "Comments", "Absolutely no warranties whatsoever - Use at your own risk\0" - VALUE "CompanyName", "ReactOS Development Team\0" - VALUE "FileDescription", "ReactOS Calculator by Robert Dickenson\0" - VALUE "FileVersion", "1, 0, 0, 1\0" - VALUE "InternalName", "calc\0" - VALUE "LegalCopyright", "Copyright © 2002 Robert Dickenson\0" - VALUE "LegalTrademarks", "\0" - VALUE "OriginalFilename", "calc.exe\0" - VALUE "PrivateBuild", "\0" - VALUE "ProductName", "ReactOS Operating System\0" - VALUE "ProductVersion", "0.0.19\0" - VALUE "SpecialBuild", "Non-versioned Development Beta Release\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0xc09, 1200 - END -END - -#endif // !_MAC - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE DISCARDABLE -BEGIN - IDS_APP_TITLE "ReactOS Calculator" - IDS_APP_REG_KEY "\\Calculator" - IDS_APP_REG_PATH "Software\\ReactWare" -END - -#endif // English (Australia) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - +#include "rsrc.rc" diff --git a/rosapps/calc/dialog.c b/rosapps/calc/dialog.c new file mode 100644 index 00000000000..b658d0db116 --- /dev/null +++ b/rosapps/calc/dialog.c @@ -0,0 +1,93 @@ +/* + * WineCalc (dialog.c) + * + * Copyright 2003 James Briggs + * + * 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 +#include "dialog.h" +#include "resource.h" +#include "winecalc.h" + +extern HINSTANCE hInstance; + +BOOL CALLBACK AboutDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + HDC hdc; + PAINTSTRUCT ps; + + switch( uMsg ) { + + case WM_INITDIALOG: + SendMessage (hDlg, WM_SETFONT, (UINT)GetStockObject(DEFAULT_GUI_FONT), TRUE); + return TRUE; + + case WM_COMMAND: + switch(LOWORD(wParam)) { + case IDOK: + EndDialog( hDlg, 0 ); + return TRUE; + } + break; + + case WM_PAINT: + { + HDC hMemDC; + HFONT hFont; + HFONT hFontOrg; + + char c1[CALC_BUF_SIZE]; + char c2[CALC_BUF_SIZE]; + char c3[CALC_BUF_SIZE]; + char c4[CALC_BUF_SIZE]; + char c5[CALC_BUF_SIZE]; + + hdc = BeginPaint( hDlg, &ps ); + + hMemDC = CreateCompatibleDC( hdc ); + + LoadString( hInstance, IDS_COPYRIGHT1, c1, sizeof(c1)); + LoadString( hInstance, IDS_COPYRIGHT2, c2, sizeof(c2)); + LoadString( hInstance, IDS_COPYRIGHT3, c3, sizeof(c3)); + LoadString( hInstance, IDS_COPYRIGHT4, c4, sizeof(c4)); + LoadString( hInstance, IDS_COPYRIGHT5, c5, sizeof(c5)); + + hFont = GetStockObject(DEFAULT_GUI_FONT); + hFontOrg = SelectObject(hdc, hFont); + + SetBkMode(hdc, TRANSPARENT); + + TextOut(hdc, 10, 10, c1, strlen(c1)); + TextOut(hdc, 10, 35, c2, strlen(c2)); + TextOut(hdc, 10, 50, c3, strlen(c3)); + TextOut(hdc, 10, 75, c4, strlen(c4)); + TextOut(hdc, 10, 90, c5, strlen(c5)); + + SelectObject(hdc, hFontOrg); + + DeleteDC( hMemDC ); + EndPaint( hDlg, &ps ); + + return 0; + } + case WM_CLOSE: + EndDialog( hDlg, TRUE ); + return 0; + } + return FALSE; +} + diff --git a/rosapps/calc/dialog.h b/rosapps/calc/dialog.h new file mode 100644 index 00000000000..a588259e6c0 --- /dev/null +++ b/rosapps/calc/dialog.h @@ -0,0 +1,24 @@ +/* + * WineCalc (dialog.h) + * + * Copyright 2003 James Briggs + * + * 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 + */ + +BOOL CALLBACK AboutDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); + + + diff --git a/rosapps/calc/main.c b/rosapps/calc/main.c deleted file mode 100644 index 56602eb8093..00000000000 --- a/rosapps/calc/main.c +++ /dev/null @@ -1,266 +0,0 @@ -/* - * ReactOS calc - * - * calc.c - * - * Copyright (C) 2002 Robert Dickenson - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers -#include -#include -#include - -#include "main.h" -#include "button.h" -#include "settings.h" - - -// Global Variables: -HINSTANCE hInst; -HWND hDlgWnd; -TCHAR szTitle[MAX_LOADSTRING]; -CALC_TYPES CalcType; -HACCEL hAccel; - -BOOL bDigitGrouping = FALSE; - -/*TODO: Figure out why we are copying MFC map style programming. -** This pattern is difficult to maintain. -*/ -#define BEGIN_CMD_MAP(a) switch(##a) { -#define CMD_MAP_ENTRY(a, b) case a: b(); break; -#define END_CMD_MAP(a) } - - -BOOL OnCreate(HWND hWnd) -{ - HMENU hMenu; - HMENU hViewMenu; - - hMenu = GetMenu(hDlgWnd); - hViewMenu = GetSubMenu(hMenu, ID_MENU_VIEW); - if (bDigitGrouping) { - CheckMenuItem(hViewMenu, ID_VIEW_DIGIT_GROUPING, MF_BYCOMMAND|MF_CHECKED); - } - - //SendMessage(hDlgWnd, WM_SETICON, ICON_BIG, (LPARAM)LoadIcon(hInst, MAKEINTRESOURCE(IDI_CALC))); - - // Initialize the Windows Common Controls DLL - //InitCommonControls(); - - return TRUE; -} - -void OnEditCopy(void) -{ - SendMessage(GetDlgItem(hDlgWnd, IDC_RESULT), WM_COMMAND, MAKELONG(ID_EDIT_COPY, 0), 0); -} - -void OnEditPaste(void) -{ - SendMessage(GetDlgItem(hDlgWnd, IDC_RESULT), WM_COMMAND, MAKELONG(ID_EDIT_PASTE, 0), 0); -} - -void OnViewStandard(void) -{ - CalcType = STANDARD; - DestroyWindow(hDlgWnd); -} - -void OnViewScientific(void) -{ - CalcType = SCIENTIFIC; - DestroyWindow(hDlgWnd); -} - -void OnViewDigitGrouping(void) -{ - HMENU hMenu = GetMenu(hDlgWnd); - HMENU hViewMenu = GetSubMenu(hMenu, ID_MENU_VIEW); - bDigitGrouping = !bDigitGrouping; - if (bDigitGrouping) { - CheckMenuItem(hViewMenu, ID_VIEW_DIGIT_GROUPING, MF_BYCOMMAND|MF_CHECKED); - } else { - CheckMenuItem(hViewMenu, ID_VIEW_DIGIT_GROUPING, MF_BYCOMMAND|MF_UNCHECKED); - } -} - -void OnViewHex(void) -{ -} - -void OnViewDecimal(void) -{ -} - -void OnViewOctal(void) -{ -} - -void OnViewBinary(void) -{ -} - -void OnViewDegrees(void) -{ -} - -void OnViewRadians(void) -{ -} - -void OnViewGrads(void) -{ -} - -void OnHelpTopics(void) -{ - WinHelp(hDlgWnd, _T("calc"), HELP_CONTENTS, 0); -} - -void OnHelpAbout(void) -{ - ShellAbout(hDlgWnd, _T("ReactOS Calculator"), _T(""), LoadIcon(hInst, MAKEINTRESOURCE(IDI_CALC))); -} - -void OnButtonClick(int ButtonID) -{ -} -// Message handler for dialog box. -LRESULT CALLBACK CalcWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch (message) { - case WM_INITDIALOG: - hDlgWnd = hDlg; - InitColours(); - return OnCreate(hDlg); - - case WM_DRAWITEM: - DrawItem((LPDRAWITEMSTRUCT)lParam); - return TRUE; - - case WM_COMMAND: - if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { - EndDialog(hDlg, LOWORD(wParam)); - return TRUE; - } - - if (HIWORD(wParam) == BN_CLICKED) { - switch (LOWORD(wParam)) { - OnButtonClick(LOWORD(wParam)); - //case IDC_OWNERDRAW: -// // application-defined processing -// break; - } - } - - //BEGIN_CMD_MAP( LOWORD(wParam) ) - switch (LOWORD(wParam)) - { - CMD_MAP_ENTRY(ID_EDIT_COPY, OnEditCopy) - CMD_MAP_ENTRY(ID_EDIT_PASTE, OnEditPaste) - CMD_MAP_ENTRY(ID_VIEW_STANDARD, OnViewStandard) - CMD_MAP_ENTRY(ID_VIEW_SCIENTIFIC, OnViewScientific) - CMD_MAP_ENTRY(ID_VIEW_DIGIT_GROUPING, OnViewDigitGrouping) - CMD_MAP_ENTRY(ID_VIEW_HEX, OnViewHex) - CMD_MAP_ENTRY(ID_VIEW_DECIMAL, OnViewDecimal) - CMD_MAP_ENTRY(ID_VIEW_OCTAL, OnViewOctal) - CMD_MAP_ENTRY(ID_VIEW_BINARY, OnViewBinary) - CMD_MAP_ENTRY(ID_VIEW_DEGREES, OnViewDegrees) - CMD_MAP_ENTRY(ID_VIEW_RADIANS, OnViewRadians) - CMD_MAP_ENTRY(ID_VIEW_GRADS, OnViewGrads) - CMD_MAP_ENTRY(ID_HELP_TOPICS, OnHelpTopics) - CMD_MAP_ENTRY(ID_HELP_ABOUT, OnHelpAbout) - } - //END_CMD_MAP(0) - break; -/* - case WM_KEYUP: - case WM_KEYDOWN: - { - MSG msg; - msg.hwnd = hDlg; - msg.message = message; - msg.wParam = wParam; - msg.lParam = lParam; -// msg.time; -// msg.pt; - if (TranslateAccelerator(hDlg, hAccel, &msg)) return 0; - } - break; - */ - case WM_NOTIFY: - { - int idctrl; - LPNMHDR pnmh; - idctrl = (int)wParam; - pnmh = (LPNMHDR)lParam; -/* - if ((pnmh->hwndFrom == hTabWnd) && - (pnmh->idFrom == IDC_TAB) && - (pnmh->code == TCN_SELCHANGE)) - { - _OnTabWndSelChange(); - } - */ - } - break; - - case WM_DESTROY: - WinHelp(hDlgWnd, _T("regedit"), HELP_QUIT, 0); - return DefWindowProc(hDlg, message, wParam, lParam); - } - return 0; -} - -int APIENTRY WinMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpCmdLine, - int nCmdShow) -{ - CALC_TYPES CurrentCalcType; - - // Initialize global variables - hInst = hInstance; - LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); - - // Load our settings from the registry - LoadSettings(); - - hAccel = LoadAccelerators(hInstance, (LPCTSTR)IDR_ACCELERATOR); - - do { - CurrentCalcType = CalcType; - switch (CalcType) { - case HP42S: - break; - case SCIENTIFIC: - DialogBox(hInst, (LPCTSTR)IDD_SCIENTIFIC, NULL, (DLGPROC)CalcWndProc); - break; - case STANDARD: - default: - DialogBox(hInst, (LPCTSTR)IDD_STANDARD, NULL, (DLGPROC)CalcWndProc); - break; - } - } while (CalcType != CurrentCalcType); - - // Save our settings to the registry - SaveSettings(); - return 0; -} - diff --git a/rosapps/calc/main.h b/rosapps/calc/main.h deleted file mode 100644 index a5cd366fa4a..00000000000 --- a/rosapps/calc/main.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * ReactOS calc - * - * main.h - * - * Copyright (C) 2002 Robert Dickenson - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef __MAIN_H__ -#define __MAIN_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - - -#include "resource.h" - - -#define MAX_LOADSTRING 100 - -typedef enum _CALC_TYPES { STANDARD, SCIENTIFIC, HP42S, OTHER } CALC_TYPES; - -extern HINSTANCE hInst; -extern HWND hDlgWnd; -extern TCHAR szTitle[]; -extern CALC_TYPES CalcType; - - -#ifdef __cplusplus -}; -#endif - -#endif // __MAIN_H__ diff --git a/rosapps/calc/makefile b/rosapps/calc/makefile index 75dcaa63476..db10c265268 100644 --- a/rosapps/calc/makefile +++ b/rosapps/calc/makefile @@ -6,25 +6,15 @@ PATH_TO_TOP = ../../reactos -WINE_MODE = yes - -WINE_RC = calc - TARGET_TYPE = program TARGET_APPTYPE = windows TARGET_NAME = calc -WINE_INCLUDE = ./ +TARGET_CFLAGS = -D__USE_W32API -D_WIN32_IE=0x0501 -TARGET_CFLAGS = -D__USE_W32API - -#TARGET_CFLAGS = -I$(TEST_ROOT) -DDBG -DUNICODE -D_UNICODE - -BASE_CFLAGS = -D_WIN32_IE=0x0400 - -RCFLAGS = -D_WIN32_IE=0x0400 +TARGET_RCFLAGS = -D__USE_W32API -D_WIN32_IE=0x0501 TARGET_SDKLIBS = \ kernel32.a \ @@ -34,9 +24,9 @@ TARGET_SDKLIBS = \ TARGET_GCCLIBS = comctl32 TARGET_OBJECTS = \ - settings.o \ - button.o \ - main.o + dialog.o \ + stats.o \ + winecalc.o include $(PATH_TO_TOP)/rules.mak diff --git a/rosapps/calc/resource.h b/rosapps/calc/resource.h index 4ff8f6c49c5..9938d36fd97 100644 --- a/rosapps/calc/resource.h +++ b/rosapps/calc/resource.h @@ -1,130 +1,68 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Developer Studio generated include file. -// Used by calc.rc -// -#define ID_MENU_EDIT 0 -#define ID_MENU_VIEW 1 -#define ID_MENU_HELP 2 -#define IDI_CALC 100 -#define IDD_STANDARD 101 -#define IDD_SCIENTIFIC 102 -#define IDR_CALC_STANDARD 103 -#define IDR_CALC_SCIENTIFIC 104 -#define IDS_APP_TITLE 105 -#define IDR_ACCELERATOR 106 -#define IDS_APP_REG_KEY 107 -#define IDS_APP_REG_PATH 108 +/* + * WineCalc (resource.h) + * + * Copyright 2003 James Briggs + * + * 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 + */ -#define ID_EDIT_COPY 0xE122 -#define ID_EDIT_PASTE 0xE125 +/* menus */ -#define ID_BLUE_START 1000 -#define IDC_0 1000 -#define IDC_1 1001 -#define IDC_3 1002 -#define IDC_2 1003 -#define IDC_4 1004 -#define IDC_5 1005 -#define IDC_6 1006 -#define IDC_7 1007 -#define IDC_8 1008 -#define IDC_9 1009 -#define IDC_A 1010 -#define IDC_B 1011 -#define IDC_C 1012 -#define IDC_D 1013 -#define IDC_E 1014 -#define IDC_F 1015 -#define IDC_PLUSMINUS 1020 -#define IDC_DECPOINT 1021 -#define IDC_PERCENT 1022 -#define IDC_SQRT 1023 -#define IDC_PI 1024 -#define IDC_S 1025 -#define IDC_SUM 1026 -#define IDC_AVE 1027 -#define IDC_STA 1028 -#define IDC_DAT 1029 -#define ID_BLUE_FINISH 1029 +#define IDM_COPY 1001 +#define IDM_PASTE 1002 +#define IDM_MODE_STANDARD 1003 +#define IDM_MODE_SCIENTIFIC 1004 +#define IDM_DIGIT_GROUPING 1005 +#define IDM_HELP_TOPICS 1006 +#define IDM_ABOUT 1007 +#define IDM_SEPARATOR1 1008 +#define IDM_SEPARATOR2 1009 +#define IDM_SEPARATOR3 1010 +#define IDM_WHATS_THIS 1011 -#define ID_RED_START 1036 -#define IDC_PLUS 1036 -#define IDC_MINUS 1037 -#define IDC_MULTIPLY 1038 -#define IDC_DIVIDE 1039 -#define IDC_MPLUS 1040 -#define IDC_MS 1041 -#define IDC_MR 1042 -#define IDC_MC 1043 -#define IDC_EQUALS 1046 -#define IDC_LSH 1047 -#define IDC_OR 1048 -#define IDC_MOD 1049 -#define IDC_CLEAR 1050 -#define IDC_CE 1051 -#define IDC_BSPACE 1052 -#define IDC_INT 1053 -#define IDC_NOT 1054 -#define IDC_XOR 1055 -#define IDC_AND 1056 -#define ID_RED_FINISH 1056 +/* strings */ -#define ID_PURPLE_START 1057 -#define IDC_COS 1058 -#define IDC_SIN 1059 -#define IDC_DMS 1060 -#define IDC_FE 1061 -#define IDC_CUBE 1062 -#define IDC_POWER 1063 -#define IDC_EXP 1064 -#define IDC_OPENBKT 1065 -#define IDC_BANG 1066 -#define IDC_LOG 1067 -#define IDC_LN 1068 -#define IDC_CLOSEBK 1069 -#define IDC_TAN 1070 -#define IDC_SQUARE 1071 -#define IDC_INVERT 1072 -#define ID_PURPLE_FINISH 1072 +#define IDS_APPNAME 1100 -#define IDC_INV 1078 -#define IDC_HYP 1079 -#define IDC_HEX 1080 -#define IDC_DEC 1081 -#define IDC_OCT 1082 -#define IDC_BIN 1083 -#define IDC_DEGREES 1084 -#define IDC_RADIANS 1085 -#define IDC_GRADS 1086 -#define IDC_RESULT 1087 +#define IDS_BTN_BACKSPACE 1101 +#define IDS_BTN_CLEAR_ENTRY 1102 +#define IDS_BTN_CLEAR_ALL 1103 +#define IDS_BTN_MEM_CLEAR 1104 +#define IDS_BTN_MEM_RECALL 1105 +#define IDS_BTN_MEM_STORE 1106 +#define IDS_BTN_MEM_PLUS 1107 +#define IDS_BTN_MEM_STATUS_M 1108 +#define IDS_BTN_SQRT 1109 -#define IDC_MEMTEXT 1090 -#define IDC_UNITS 1091 -#define IDC_BASE 1092 -#define IDC_INVHYP 1093 -#define IDC_BKTTEXT 1094 +#define IDS_ERR_INVALID_INPUT 1120 +#define IDS_ERR_DIVIDE_BY_ZERO 1121 +#define IDS_ERR_UNDEFINED 1122 -#define ID_VIEW_STANDARD 40003 -#define ID_VIEW_SCIENTIFIC 40004 -#define ID_VIEW_DIGIT_GROUPING 40005 -#define ID_VIEW_HEX 40006 -#define ID_VIEW_DECIMAL 40007 -#define ID_VIEW_OCTAL 40008 -#define ID_VIEW_BINARY 40009 -#define ID_VIEW_DEGREES 40010 -#define ID_VIEW_RADIANS 40011 -#define ID_VIEW_GRADS 40012 -#define ID_HELP_TOPICS 40013 -#define ID_HELP_ABOUT 40014 +#define IDS_COPYRIGHT1 1130 +#define IDS_COPYRIGHT2 1131 +#define IDS_COPYRIGHT3 1132 +#define IDS_COPYRIGHT4 1133 +#define IDS_COPYRIGHT5 1134 +/* keys */ -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 109 -#define _APS_NEXT_COMMAND_VALUE 40015 -#define _APS_NEXT_CONTROL_VALUE 1095 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif +#define IDV_HELP 103 + +/* stats dialog */ + +#define ID_STATS_RET 3000 +#define ID_STATS_LOAD 3001 +#define ID_STATS_CD 3002 +#define ID_STATS_CAD 3003 diff --git a/rosapps/calc/rsrc.rc b/rosapps/calc/rsrc.rc new file mode 100644 index 00000000000..53f73bfffb5 --- /dev/null +++ b/rosapps/calc/rsrc.rc @@ -0,0 +1,33 @@ +/* + * WineCalc (rsrc.rc) + * + * Copyright 2003 James Briggs + * + * 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 +#include "resource.h" + +#include "En.rc" +#include "Es.rc" +#include "Fr.rc" +#include "It.rc" +#include "Nl.rc" +#include "Pt.rc" +#include "Ru.rc" +#include "Si.rc" + +LANGUAGE LANG_NEUTRAL,SUBLANG_NEUTRAL diff --git a/rosapps/calc/settings.c b/rosapps/calc/settings.c deleted file mode 100644 index 2827643336b..00000000000 --- a/rosapps/calc/settings.c +++ /dev/null @@ -1,115 +0,0 @@ -/* - * ReactOS calc - * - * settings.c - * - * Copyright (C) 2002 Robert Dickenson - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers -#include -#include -#include -#define ASSERT assert - -#include "main.h" -#include "settings.h" - - -BOOL CheckResult(LONG error) -{ - if (error != ERROR_SUCCESS) { - PTSTR msg; - if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, - 0, error, MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), (PTSTR)&msg, 0, NULL)) - MessageBox(NULL, msg, szTitle, MB_ICONERROR | MB_OK); - else - MessageBox(NULL, _T("Error"), szTitle, MB_ICONERROR | MB_OK); - LocalFree(msg); - return FALSE; - } - return TRUE; -} - -static BOOL CreateRegistryPath(LPTSTR szRegPath, int nMaxLen) -{ - LPTSTR pRegPath = szRegPath; - - // Initialise registry path string from application PATH and KEY resources - int nLength = LoadString(hInst, IDS_APP_REG_PATH, szRegPath, nMaxLen); - nLength += LoadString(hInst, IDS_APP_REG_KEY, szRegPath + nLength, nMaxLen - nLength); - ASSERT(nLength < (nMaxLen - 1)); - szRegPath[nLength] = _T('\\'); - - // walk the registry path string creating the tree if required - while ((pRegPath = _tcschr(pRegPath, _T('\\')))) { - LONG result; - HKEY hKey = NULL; - *pRegPath = _T('\0'); - // Open (or create) the key - result = RegCreateKeyEx(HKEY_CURRENT_USER, szRegPath, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL); - if (!CheckResult(result)) return FALSE; - RegCloseKey(hKey); - *pRegPath = _T('\\'); - pRegPath = pRegPath + 1; - } - szRegPath[nLength] = _T('\0'); - return TRUE; -} - -void LoadSettings(void) -{ - TCHAR szRegPath[MAX_LOADSTRING]; - - HKEY hKey; - DWORD dwSize; - LONG result; - - if (!CreateRegistryPath(szRegPath, MAX_LOADSTRING)) return; - - // Open the key - result = RegOpenKeyEx(HKEY_CURRENT_USER, szRegPath, 0, KEY_READ, &hKey); - if (!CheckResult(result)) return; - - // Read the settings - dwSize = sizeof(CALC_TYPES); - result = RegQueryValueEx(hKey, _T("Preferences"), NULL, NULL, (LPBYTE)&CalcType, &dwSize); - - // Close the key - RegCloseKey(hKey); -} - -void SaveSettings(void) -{ - TCHAR szRegPath[MAX_LOADSTRING]; - HKEY hKey = NULL; - LONG result; - - if (!CreateRegistryPath(szRegPath, MAX_LOADSTRING)) return; - - // Open the key - result = RegOpenKeyEx(HKEY_CURRENT_USER, szRegPath, 0, KEY_WRITE, &hKey); - if (!CheckResult(result)) return; - - // Save the settings - result = RegSetValueEx(hKey, _T("Preferences"), 0, REG_DWORD, (LPBYTE)&CalcType, sizeof(CALC_TYPES)); - if (!CheckResult(result)) goto abort; - -abort: - // Close the key - RegCloseKey(hKey); -} diff --git a/rosapps/calc/settings.h b/rosapps/calc/settings.h deleted file mode 100644 index c062130c425..00000000000 --- a/rosapps/calc/settings.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * ReactOS calc - * - * settings.h - * - * Copyright (C) 2002 Robert Dickenson - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef __SETTINGS_H__ -#define __SETTINGS_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - - -BOOL CheckResult(LONG error); -void LoadSettings(void); -void SaveSettings(void); - - -#ifdef __cplusplus -}; -#endif - -#endif // __SETTINGS_H__ diff --git a/rosapps/calc/stats.c b/rosapps/calc/stats.c new file mode 100644 index 00000000000..cb6cb60c97e --- /dev/null +++ b/rosapps/calc/stats.c @@ -0,0 +1,131 @@ +/* + * WineCalc (stats.c) + * + * Copyright 2003 James Briggs + * + * 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 // sprintf + +#include + +#include "stats.h" +#include "resource.h" +#include "winecalc.h" + + HWND hWndListBox; + + extern CALC calc; + extern HWND hWndDlgStats; + +BOOL CALLBACK StatsDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + HDC hdc; + PAINTSTRUCT ps; + + + switch( uMsg ) { + + case WM_INITDIALOG: + hWndListBox = CreateWindow( + "LISTBOX", // pointer to registered class name + "Listbox", // pointer to window name + WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_BORDER | LBS_NOINTEGRALHEIGHT, // window style + 6, // horizontal position of window + 6, // vertical position of window + 208, // window width + 66, // window height + hDlg, // handle to parent or owner window + NULL, // handle to menu or child-window identifier + NULL, // handle to application instance + NULL // pointer to window-creation data + ); + + ShowWindow(hWndListBox, SW_SHOW); + + SendMessage (hWndListBox, WM_SETFONT, (UINT)GetStockObject(DEFAULT_GUI_FONT), TRUE); + + // SetFocus(hWndDlgStats); + + return TRUE; + + case WM_COMMAND: + switch( LOWORD( wParam ) ) { + + case ID_STATS_RET: + SetFocus(GetParent(hDlg)); + return 0; + + case ID_STATS_LOAD: + { + int i; + + i = SendMessage(hWndListBox, LB_GETCURSEL, 0, 0); + SendMessage(hWndListBox, LB_GETTEXT, i, (LPARAM)calc.buffer); + calc_buffer_display(&calc); + } + return 0; + + case ID_STATS_CD: + { + int i; + + i = SendMessage(hWndListBox, LB_GETCURSEL, 0, 0); + SendMessage(hWndListBox, LB_DELETESTRING, i, 0); + InvalidateRect(hDlg,NULL,TRUE); + UpdateWindow(hDlg); + } + return 0; + + case ID_STATS_CAD: + SendMessage(hWndListBox, LB_RESETCONTENT, 0, 0); + InvalidateRect(hDlg,NULL,TRUE); + UpdateWindow(hDlg); + return 0; + } + break; + + case WM_PAINT: + { + char s[CALC_BUF_SIZE]; + int lb_count; + HFONT hFont; + HFONT hFontOrg; + + hdc = BeginPaint( hDlg, &ps ); + hFont = GetStockObject(DEFAULT_GUI_FONT); + hFontOrg = SelectObject(hdc, hFont); + + lb_count = SendMessage(hWndListBox, LB_GETCOUNT, 0, 0); + sprintf(s, "n=%d", lb_count); + + SetBkMode(hdc, TRANSPARENT); + TextOut(hdc, 98, 121, s, strlen(s)); + SelectObject(hdc, hFontOrg); + EndPaint( hDlg, &ps ); + + return 0; + } + case WM_CLOSE: + hWndDlgStats = 0; // invalidate stats dialog + SendMessage(GetParent(hDlg), WM_CHAR, '\x13', 1); // disable stats related calculator buttons + DestroyWindow( hDlg ); + + return 0; + } + return FALSE; +} + diff --git a/rosapps/calc/stats.h b/rosapps/calc/stats.h new file mode 100644 index 00000000000..8ce6135ba39 --- /dev/null +++ b/rosapps/calc/stats.h @@ -0,0 +1,24 @@ +/* + * WineCalc (stats.h) + * + * Copyright 2003 James Briggs + * + * 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 + */ + +BOOL CALLBACK StatsDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); + + + diff --git a/rosapps/calc/winecalc.c b/rosapps/calc/winecalc.c new file mode 100644 index 00000000000..cc046a59fc9 --- /dev/null +++ b/rosapps/calc/winecalc.c @@ -0,0 +1,3785 @@ +/* + * WineCalc (winecalc.c) + * + * Copyright 2003 James Briggs + * + * 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 // sprintf +#include + +#include +// #include + +#include "winecalc.h" +#include "dialog.h" +#include "stats.h" +#include "resource.h" + +// lame M$ math library doesn't support hyp functions +//#ifdef _MSC_VER +#define atanh(X) atan(X) +#define asinh(X) asin(X) +#define acosh(X) acos(X) +//#endif + +// How winecalc works +// +// 1. In the original calculator, numbers are "extended precision". +// We emulate with calcfloat (calcfloat floating point) for now. +// Note that recent M$ compilers 5.0 and later do not implement double float, +// and do not support 80-bit numbers. Max width is 64-bits. +// +// 2. 4 temp areas: +// +// i) current edit buffer value for keystrokes +// ii) computed value area for last computation +// iii) memory area for MR, MC, MS, M+ +// iv) formatted display buffer +// +// 3. Memory Store works off current buffer, not value +// +// 4. display limit is 32 numbers plus 10 commas plus one period = 43 characters +// +// 5. original calc is better called SciCalc and saves settings in win.ini: +// +// [SciCalc] +// layout=1 (0 = scientific mode, 1 = basic mode) +// UseSep=1 (0 = no digits separator, 1 = enable digits separator) +// +// 6. Window Menus +// +// The menus know their own states, so we don't need to track them +// When switching to Standard Calculator Mode, number base is changed to Decimal and Trig Mode to Degrees, +// but Word Size Mode is unchanged +// +// 7. It would be nice to add command line parsing for batch files +// + +// various display error messages + +static char err_invalid [CALC_BUF_SIZE]; +static char err_divide_by_zero [CALC_BUF_SIZE]; +static char err_undefined [CALC_BUF_SIZE]; + +// calculator state is kept here + +CALC calc; + +static RECT rFiller; + +static int keys[CALC_NS_COUNT]['f'+1]; // note: sparse array + +// map from button press to calc[] index +// 0, ... 9, A, B, C, D, E, F,FE,DMS,SIN,COS,TAN,EXP, PI +static const int h[] = { + 0, 0, 33, 34, 21, 22, 23, 10, 11, 12, 54, 55, 56 ,57, 58 ,59, 6, 17, 28, 39, 50, 18, 53 }; + +// enable status of various buttons on sci mode depending on number base +static const int btn_toggle[CALC_NS_COUNT][TOGGLE_COUNT] = +// 0, ... 9, A, B, C, D, E, F,FE,DMS,SIN,COS,TAN,EXP,PI +{ + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0 } +}; + +static int hms[] = { 64, 65, 66 }; +static int hws[] = { 69, 70, 71, 72 }; + +static int sta[] = { 16, 27, 38, 49 }; + +static HMENU menus[3]; + +static char appname[40]; + +static int debug; + +int parse(int wParam, int lParam); + +HWND hWndDlgStats; + +extern HWND hWndListBox; + +HINSTANCE hInstance; + +int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdline, int cmdshow ) +{ + MSG msg; + WNDCLASS wc; + HWND hWnd; + HACCEL haccel; + + char s[CALC_BUF_SIZE]; + int r; + + hInstance = hInst; + + r = GetProfileString("SciCalc", + "layout", + "0", + s, + CALC_BUF_SIZE + ); + + calc.sciMode = atoi(s); + + if (calc.sciMode != 0 && + calc.sciMode != 1) + calc.sciMode = 1; // Standard Mode + + r = GetProfileString("SciCalc", + "UseSep", + "0", + s, + CALC_BUF_SIZE + ); + + calc.digitGrouping = atoi(s); + + if (calc.digitGrouping != 0 && + calc.digitGrouping != 1) + calc.digitGrouping = 1; + + calc.new = 1; // initialize struct values + + if (!LoadString( hInst, IDS_APPNAME, appname, sizeof(appname))) + exit(1); + if (!LoadString( hInst, IDS_ERR_INVALID_INPUT, err_invalid, sizeof(err_invalid))) + exit(1); + if (!LoadString( hInst, IDS_ERR_DIVIDE_BY_ZERO, err_divide_by_zero, sizeof(err_divide_by_zero))) + exit(1); + if (!LoadString( hInst, IDS_ERR_UNDEFINED, err_undefined, sizeof(err_undefined))) + exit(1); + + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.lpfnWndProc = MainProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = hInst; + wc.hIcon = LoadIcon( hInst, appname ); + wc.hCursor = LoadCursor( NULL, IDI_APPLICATION ); + wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1); + wc.lpszMenuName = NULL; + wc.lpszClassName = appname; + + if (!RegisterClass(&wc)) exit(1); + + hWnd = CreateWindow( appname, + appname, + WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX, + CW_USEDEFAULT, + CW_USEDEFAULT, + calc.sciMode ? CALC_STANDARD_WIDTH : CALC_SCIENTIFIC_WIDTH, + calc.sciMode ? CALC_STANDARD_HEIGHT : CALC_SCIENTIFIC_HEIGHT, + NULL, + NULL, + hInst, + NULL ); + + if (!hWnd) + exit(1); + + ShowWindow( hWnd, cmdshow ); + UpdateWindow( hWnd ); + + if (!(haccel = LoadAccelerators(hInst, "MAIN_MENU"))) + exit(1); + + while( GetMessage(&msg, NULL, 0, 0) ) { + if (hWndDlgStats == 0 || !IsDialogMessage(hWndDlgStats, &msg)) { + if (!TranslateAccelerator( hWnd, haccel, &msg )) { + TranslateMessage( &msg ); + DispatchMessage( &msg ); + } + } + } + + return msg.wParam; +} + +LRESULT WINAPI MainProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + HDC hdc; + PAINTSTRUCT ps; + + switch (msg) { + + case WM_CREATE: + calc.hInst = ((LPCREATESTRUCT) lParam)->hInstance; + calc.hWnd = hWnd; + + InitLuts(); + InitCalc( &calc ); + InitMenus(calc.hInst); + + if (calc.sciMode) + SetMenu(hWnd, menus[MENU_STD]); + else + SetMenu(hWnd, menus[MENU_SCIMS]); + + calc_buffer_display(&calc); + + return 0; + + case WM_PAINT: + { + HDC hMemDC; + + hdc = BeginPaint( hWnd, &ps ); + hMemDC = CreateCompatibleDC( hdc ); + + DrawCalc( hdc, hMemDC, &ps, &calc ); + + DeleteDC( hMemDC ); + EndPaint( hWnd, &ps ); + + return 0; + } + + case WM_MOVE: + calc.pos.x = (unsigned) LOWORD(lParam); + calc.pos.y = (unsigned) HIWORD(lParam); + return 0; + + case WM_DESTROY: + { + int r; + char s[CALC_BUF_SIZE]; + + sprintf(s, "%d", calc.sciMode); + r = WriteProfileString("SciCalc", "layout", s); + + sprintf(s, "%d", calc.digitGrouping); + r = WriteProfileString("SciCalc", "UseSep", s); + } + + DestroyCalc( &calc ); + PostQuitMessage( 0 ); + return 0; + + case WM_KEYDOWN: + switch (wParam) { + + case VK_F1: + calc.next = 1; + MessageBox(hWnd, "No Help Available", "Windows Help", MB_OK); + return 0; + + case VK_F2: // DWORD + + calc.next = 1; + if (!calc.sciMode) { + if (calc.numBase == NBASE_DECIMAL) + SendMessage(hWnd, WM_COMMAND, ID_CALC_MS_DEGREES, lParam); + else + SendMessage(hWnd, WM_COMMAND, ID_CALC_WS_DWORD, lParam); + } + return 0; + + case VK_F3: // WORD + + calc.next = 1; + if (!calc.sciMode) { + if (calc.numBase == NBASE_DECIMAL) + SendMessage(hWnd, WM_COMMAND, ID_CALC_MS_RADIANS, lParam); + else + SendMessage(hWnd, WM_COMMAND, ID_CALC_WS_WORD, lParam); + } + return 0; + + case VK_F4: // Byte + + // Grad + calc.next = 1; + if (!calc.sciMode) { + if (calc.numBase == NBASE_DECIMAL) + SendMessage(hWnd, WM_COMMAND, ID_CALC_MS_GRADS, lParam); + else + SendMessage(hWnd, WM_COMMAND, ID_CALC_WS_BYTE, lParam); + } + return 0; + + case VK_F5: // Hex + + calc.next = 1; + if (!calc.sciMode) + SendMessage(hWnd, WM_COMMAND, ID_CALC_NS_HEX, lParam); + return 0; + + case VK_F6: // Decimal + + calc.next = 1; + if (!calc.sciMode) + SendMessage(hWnd, WM_COMMAND, ID_CALC_NS_DEC, lParam); + return 0; + + case VK_F7: // Octal + + calc.next = 1; + if (!calc.sciMode) + SendMessage(hWnd, WM_COMMAND, ID_CALC_NS_OCT, lParam); + return 0; + + case VK_F8: // Binary + + calc.next = 1; + if (!calc.sciMode) + SendMessage(hWnd, WM_COMMAND, ID_CALC_NS_BIN, lParam); + return 0; + + case VK_F12: // QWORD + + calc.next = 1; + if (!calc.sciMode) + SendMessage(hWnd, WM_COMMAND, ID_CALC_WS_QWORD, lParam); + return 0; + + case VK_F9: // +/- + + if (!calc.sciMode) + SendMessage(hWnd, WM_CHAR, 'Z', lParam); + return 0; + + case VK_INSERT: // Dat + calc.next = 1; + SendMessage(hWndListBox, LB_INSERTSTRING, -1, (LPARAM)calc.buffer); + InvalidateRect(hWndDlgStats, NULL, TRUE); // update list count at bottom edge of dialog + UpdateWindow(hWndDlgStats); + return 0; + + case VK_DELETE: + + calc.next = 1; + calc.buffer[0] = '\0'; + calc_buffer_display(&calc); + return 0; + + default: + break; + } + + return 0; + + case WM_CHAR: + if (debug) + show_debug(&calc, "Start WM_CHAR", wParam, lParam); + + switch (wParam) { + + case '\x13': // Ctrl+S Sta Statistics + + if (hWndDlgStats) { // Statistics Box already displayed, focus but don't create another one + // SetFocus(hWndDlgStats); + // SendMessage(hWndDlgStats, WM_SETFOCUS, 0, 0); + } + else { + int i; + + if (lParam == 1) { + for (i=0;i<4;i++) + EnableWindow((HWND)calc.cb[sta[i]].hBtn, FALSE); + } + else { + for (i=0;i<4;i++) + EnableWindow((HWND)calc.cb[sta[i]].hBtn, TRUE); + + hWndDlgStats = CreateDialog( // modeless dialog + calc.hInst, // handle to application instance + "DLG_STATS", // identifies dialog box template name + hWnd, // handle to owner window + StatsDlgProc); // pointer to dialog box procedure + + if (!hWndDlgStats) + exit(1); + + SendMessage(hWndDlgStats, WM_SETFOCUS, 0, 0); + } + } + + break; + + case '\x01': // Ctrl+A Ave Statistics + case '\x04': // Ctrl+D s Standard Deviation Statistics + case '\x14': // Ctrl+T Sum Statistics + { + int i; + int n; + + char s[CALC_BUF_SIZE]; + double val = 0L; + double avg = 0L; + double total = 0L; + double x[1024]; + + // This is all lame. Here we are querying the list control for items and calculating the total. + // We should have an array of intermediate results to work with to avoid roundoff errors, etc. + + n = SendMessage(hWndListBox, LB_GETCOUNT, 0, 0); + + for (i=0;i= '0' && c <= '9') || + (c >= 'a' && c <= 'f') || + (c >= 'A' && c <= 'F'))) { + + SendMessage(hWnd, WM_CHAR, c, lParam); + } + else if ((calc.numBase == NBASE_DECIMAL) && + (c >= '0' && c <= '9')) { + SendMessage(hWnd, WM_CHAR, c, lParam); + } + else if ((calc.numBase == NBASE_OCTAL) && + (c >= '0' && c <= '7')) { + SendMessage(hWnd, WM_CHAR, c, lParam); + } + else if ((calc.numBase == NBASE_BINARY) && + (c == '0' || c == '1')) { + SendMessage(hWnd, WM_CHAR, c, lParam); + } + else if (c == '.' || c == ',' || + c == 'e' || c == 'E' || + c == '+' || c == '-') { + SendMessage(hWnd, WM_CHAR, c, lParam); + } + else if (c == ' ' || // eat harmless trash here + c == ';' || + c == ':') { + ; // noop + } + else { // extra spicy trash gets noticed + + MessageBeep(0); // uh, beeps can get annoying. maybe rate limit. + } + } + } + } + } + } + + break; + default: + { + int ret = parse(wParam, lParam); + } + } // switch WM_CHAR + + calc_buffer_display(&calc); + return 0; + + case WM_COMMAND: + switch(LOWORD(wParam)) { + + case IDM_COPY: + SendMessage(hWnd, WM_CHAR, '\x03', lParam); + return 0; + + case IDM_PASTE: + SendMessage(hWnd, WM_CHAR, '\x16', lParam); + return 0; + + case IDM_MODE_STANDARD: + if (!calc.sciMode) { + int i; + RECT lpRect; + + calc.sciMode = 1; + calc.trigMode = TRIGMODE_DEGREES; + calc.numBase = NBASE_DECIMAL; + + EnableWindow(hWnd, FALSE); + + + for (i=1;ihInst; + HFONT hFont = GetStockObject(DEFAULT_GUI_FONT); + + calc->trigMode = TRIGMODE_DEGREES; + calc->numBase = NBASE_DECIMAL; + calc->init = 1; + + if (calc->new) { + calc->new = 0; + calc->value = 0; + calc->memory = 0; + calc->displayMode = 0; + calc->buffer[0] = '\0'; + strcpy(calc->display, "0."); + + calc->err = 0; + calc->next = '\0'; + + calc->wordSize = WORDSIZE_QWORD; + calc->invMode = 0; + calc->hypMode = 0; + } + + if (calc->sciMode) { + calc->numButtons = CALC_BUTTONS_STANDARD; + + // Row 1 (top) + + skipx = MARGIN_LEFT; + skipy = CALC_STANDARD_MARGIN_TOP + CALC_EDIT_HEIGHT; + + calc->cb[0].id = 0; + strcpy(calc->cb[0].label,"FILLER"); + calc->cb[0].color = CALC_COLOR_BLUE; + calc->cb[0].r.left = skipx + 4; + calc->cb[0].r.top = skipy + 2; + calc->cb[0].r.right = skipx + SZ_FILLER_X - 2; + calc->cb[0].r.bottom = skipy + SZ_FILLER_Y - 2; + calc->cb[0].enable = 1; + + skipx = SZ_FILLER_X + MARGIN_STANDARD_BIG_X + 11; + + calc->cb[1].id = ID_CALC_BACKSPACE; + LoadString( hInst, IDS_BTN_BACKSPACE, calc->cb[1].label, sizeof(calc->cb[1].label)); + calc->cb[1].color = CALC_COLOR_RED; + calc->cb[1].r.left = skipx; + calc->cb[1].r.top = skipy; + calc->cb[1].r.right = SZ_BIGBTN_X; + calc->cb[1].r.bottom = SZ_BIGBTN_Y; + calc->cb[1].enable = 1; + + skipx += SZ_BIGBTN_X + MARGIN_SMALL_X; + + calc->cb[2].id = ID_CALC_CLEAR_ENTRY; + LoadString( hInst, IDS_BTN_CLEAR_ENTRY, calc->cb[2].label, sizeof(calc->cb[2].label)); + calc->cb[2].color = CALC_COLOR_RED; + calc->cb[2].r.left = skipx; + calc->cb[2].r.top = skipy; + calc->cb[2].r.right = SZ_BIGBTN_X; + calc->cb[2].r.bottom = SZ_BIGBTN_Y; + calc->cb[2].enable = 1; + + skipx += SZ_BIGBTN_X + MARGIN_SMALL_X; + + calc->cb[3].id = ID_CALC_CLEAR_ALL; + LoadString( hInst, IDS_BTN_CLEAR_ALL, calc->cb[3].label, sizeof(calc->cb[3].label)); + calc->cb[3].color = CALC_COLOR_RED; + calc->cb[3].r.left = skipx; + calc->cb[3].r.top = skipy; + calc->cb[3].r.right = SZ_BIGBTN_X; + calc->cb[3].r.bottom = SZ_BIGBTN_Y; + calc->cb[3].enable = 1; + + // Row 2 + + skipx = MARGIN_LEFT; + skipy += SZ_BIGBTN_Y + MARGIN_BIG_Y; + + calc->cb[4].id = ID_CALC_MEM_CLEAR; + LoadString( hInst, IDS_BTN_MEM_CLEAR, calc->cb[4].label, sizeof(calc->cb[4].label)); + calc->cb[4].color = CALC_COLOR_RED; + calc->cb[4].r.left = skipx; + calc->cb[4].r.top = skipy; + calc->cb[4].r.right = SZ_MEDBTN_X; + calc->cb[4].r.bottom = SZ_MEDBTN_Y; + calc->cb[4].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_STANDARD_BIG_X; + + calc->cb[5].id = ID_CALC_SEVEN; + strcpy(calc->cb[5].label,"7"); + calc->cb[5].color = CALC_COLOR_BLUE; + calc->cb[5].r.left = skipx; + calc->cb[5].r.top = skipy; + calc->cb[5].r.right = SZ_MEDBTN_X; + calc->cb[5].r.bottom = SZ_MEDBTN_Y; + calc->cb[5].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[6].id = ID_CALC_EIGHT; + strcpy(calc->cb[6].label,"8"); + calc->cb[6].color = CALC_COLOR_BLUE; + calc->cb[6].r.left = skipx; + calc->cb[6].r.top = skipy; + calc->cb[6].r.right = SZ_MEDBTN_X; + calc->cb[6].r.bottom = SZ_MEDBTN_Y; + calc->cb[6].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[7].id = ID_CALC_NINE; + strcpy(calc->cb[7].label,"9"); + calc->cb[7].color = CALC_COLOR_BLUE; + calc->cb[7].r.left = skipx; + calc->cb[7].r.top = skipy; + calc->cb[7].r.right = SZ_MEDBTN_X; + calc->cb[7].r.bottom = SZ_MEDBTN_Y; + calc->cb[7].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[8].id = ID_CALC_DIVIDE; + strcpy(calc->cb[8].label,"/"); + calc->cb[8].color = CALC_COLOR_RED; + calc->cb[8].r.left = skipx; + calc->cb[8].r.top = skipy; + calc->cb[8].r.right = SZ_MEDBTN_X; + calc->cb[8].r.bottom = SZ_MEDBTN_Y; + calc->cb[8].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[9].id = ID_CALC_SQRT; + LoadString( hInst, IDS_BTN_SQRT, calc->cb[9].label, sizeof(calc->cb[9].label)); + calc->cb[9].color = CALC_COLOR_BLUE; + calc->cb[9].r.left = skipx; + calc->cb[9].r.top = skipy; + calc->cb[9].r.right = SZ_MEDBTN_X; + calc->cb[9].r.bottom = SZ_MEDBTN_Y; + calc->cb[9].enable = 1; + + // Row 3 + + skipx = MARGIN_LEFT; + skipy += SZ_MEDBTN_Y + MARGIN_SMALL_Y; + + calc->cb[10].id = ID_CALC_MEM_RECALL; + LoadString( hInst, IDS_BTN_MEM_RECALL, calc->cb[10].label, sizeof(calc->cb[10].label)); + calc->cb[10].color = CALC_COLOR_RED; + calc->cb[10].r.left = skipx; + calc->cb[10].r.top = skipy; + calc->cb[10].r.right = SZ_MEDBTN_X; + calc->cb[10].r.bottom = SZ_MEDBTN_Y; + calc->cb[10].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_STANDARD_BIG_X; + + calc->cb[11].id = ID_CALC_FOUR; + strcpy(calc->cb[11].label,"4"); + calc->cb[11].color = CALC_COLOR_BLUE; + calc->cb[11].r.left = skipx; + calc->cb[11].r.top = skipy; + calc->cb[11].r.right = SZ_MEDBTN_X; + calc->cb[11].r.bottom = SZ_MEDBTN_Y; + calc->cb[11].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[12].id = ID_CALC_FIVE; + strcpy(calc->cb[12].label,"5"); + calc->cb[12].color = CALC_COLOR_BLUE; + calc->cb[12].r.left = skipx; + calc->cb[12].r.top = skipy; + calc->cb[12].r.right = SZ_MEDBTN_X; + calc->cb[12].r.bottom = SZ_MEDBTN_Y; + calc->cb[12].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[13].id = ID_CALC_SIX; + strcpy(calc->cb[13].label,"6"); + calc->cb[13].color = CALC_COLOR_BLUE; + calc->cb[13].r.left = skipx; + calc->cb[13].r.top = skipy; + calc->cb[13].r.right = SZ_MEDBTN_X; + calc->cb[13].r.bottom = SZ_MEDBTN_Y; + calc->cb[13].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[14].id = ID_CALC_MULTIPLY; + strcpy(calc->cb[14].label,"*"); + calc->cb[14].color = CALC_COLOR_RED; + calc->cb[14].r.left = skipx; + calc->cb[14].r.top = skipy; + calc->cb[14].r.right = SZ_MEDBTN_X; + calc->cb[14].r.bottom = SZ_MEDBTN_Y; + calc->cb[14].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[15].id = ID_CALC_PERCENT; + strcpy(calc->cb[15].label,"%"); + calc->cb[15].color = CALC_COLOR_BLUE; + calc->cb[15].r.left = skipx; + calc->cb[15].r.top = skipy; + calc->cb[15].r.right = SZ_MEDBTN_X; + calc->cb[15].r.bottom = SZ_MEDBTN_Y; + calc->cb[15].enable = 1; + + // Row 4 + + skipx = MARGIN_LEFT; + skipy += SZ_MEDBTN_Y + MARGIN_SMALL_Y; + + calc->cb[16].id = ID_CALC_MEM_STORE; + LoadString( hInst, IDS_BTN_MEM_STORE, calc->cb[16].label, sizeof(calc->cb[16].label)); + calc->cb[16].color = CALC_COLOR_RED; + calc->cb[16].r.left = skipx; + calc->cb[16].r.top = skipy; + calc->cb[16].r.right = SZ_MEDBTN_X; + calc->cb[16].r.bottom = SZ_MEDBTN_Y; + calc->cb[16].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_STANDARD_BIG_X; + + calc->cb[17].id = ID_CALC_ONE; + strcpy(calc->cb[17].label,"1"); + calc->cb[17].color = CALC_COLOR_BLUE; + calc->cb[17].r.left = skipx; + calc->cb[17].r.top = skipy; + calc->cb[17].r.right = SZ_MEDBTN_X; + calc->cb[17].r.bottom = SZ_MEDBTN_Y; + calc->cb[17].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[18].id = ID_CALC_TWO; + strcpy(calc->cb[18].label,"2"); + calc->cb[18].color = CALC_COLOR_BLUE; + calc->cb[18].r.left = skipx; + calc->cb[18].r.top = skipy; + calc->cb[18].r.right = SZ_MEDBTN_X; + calc->cb[18].r.bottom = SZ_MEDBTN_Y; + calc->cb[18].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[19].id = ID_CALC_THREE; + strcpy(calc->cb[19].label,"3"); + calc->cb[19].color = CALC_COLOR_BLUE; + calc->cb[19].r.left = skipx; + calc->cb[19].r.top = skipy; + calc->cb[19].r.right = SZ_MEDBTN_X; + calc->cb[19].r.bottom = SZ_MEDBTN_Y; + calc->cb[19].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[20].id = ID_CALC_MINUS; + strcpy(calc->cb[20].label,"-"); + calc->cb[20].color = CALC_COLOR_RED; + calc->cb[20].r.left = skipx; + calc->cb[20].r.top = skipy; + calc->cb[20].r.right = SZ_MEDBTN_X; + calc->cb[20].r.bottom = SZ_MEDBTN_Y; + calc->cb[20].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[21].id = ID_CALC_RECIPROCAL; + strcpy(calc->cb[21].label,"1/x"); + calc->cb[21].color = CALC_COLOR_RED; + calc->cb[21].r.left = skipx; + calc->cb[21].r.top = skipy; + calc->cb[21].r.right = SZ_MEDBTN_X; + calc->cb[21].r.bottom = SZ_MEDBTN_Y; + calc->cb[21].enable = 1; + + // Row 5 (bottom) + + skipx = MARGIN_LEFT; + skipy += SZ_MEDBTN_Y + MARGIN_SMALL_Y; + + calc->cb[22].id = ID_CALC_MEM_PLUS; + LoadString( hInst, IDS_BTN_MEM_PLUS, calc->cb[22].label, sizeof(calc->cb[22].label)); + calc->cb[22].color = CALC_COLOR_RED; + calc->cb[22].r.left = skipx; + calc->cb[22].r.top = skipy; + calc->cb[22].r.right = SZ_MEDBTN_X; + calc->cb[22].r.bottom = SZ_MEDBTN_Y; + calc->cb[22].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_STANDARD_BIG_X; + + calc->cb[23].id = ID_CALC_ZERO; + strcpy(calc->cb[23].label,"0"); + calc->cb[23].color = CALC_COLOR_BLUE; + calc->cb[23].r.left = skipx; + calc->cb[23].r.top = skipy; + calc->cb[23].r.right = SZ_MEDBTN_X; + calc->cb[23].r.bottom = SZ_MEDBTN_Y; + calc->cb[23].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[24].id = ID_CALC_SIGN; + strcpy(calc->cb[24].label,"+/-"); + calc->cb[24].color = CALC_COLOR_RED; + calc->cb[24].r.left = skipx; + calc->cb[24].r.top = skipy; + calc->cb[24].r.right = SZ_MEDBTN_X; + calc->cb[24].r.bottom = SZ_MEDBTN_Y; + calc->cb[24].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[25].id = ID_CALC_DECIMAL; + strcpy(calc->cb[25].label,"."); + calc->cb[25].color = CALC_COLOR_BLUE; + calc->cb[25].r.left = skipx; + calc->cb[25].r.top = skipy; + calc->cb[25].r.right = SZ_MEDBTN_X; + calc->cb[25].r.bottom = SZ_MEDBTN_Y; + calc->cb[25].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[26].id = ID_CALC_PLUS; + strcpy(calc->cb[26].label,"+"); + calc->cb[26].color = CALC_COLOR_RED; + calc->cb[26].r.left = skipx; + calc->cb[26].r.top = skipy; + calc->cb[26].r.right = SZ_MEDBTN_X; + calc->cb[26].r.bottom = SZ_MEDBTN_Y; + calc->cb[26].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[27].id = ID_CALC_EQUALS; + strcpy(calc->cb[27].label,"="); + calc->cb[27].color = CALC_COLOR_RED; + calc->cb[27].r.left = skipx; + calc->cb[27].r.top = skipy; + calc->cb[27].r.right = SZ_MEDBTN_X; + calc->cb[27].r.bottom = SZ_MEDBTN_Y; + calc->cb[27].enable = 1; + } + else { + calc->numButtons = CALC_BUTTONS_SCIENTIFIC; + + // Row 1 (top) + + skipx = MARGIN_LEFT; + skipy = CALC_SCIENTIFIC_MARGIN_TOP + CALC_EDIT_HEIGHT - 1; + + calc->cb[0].id = 0; + strcpy(calc->cb[0].label,"FILLER"); + calc->cb[0].color = CALC_COLOR_BLUE; + calc->cb[0].r.left = skipx + 4 * SZ_MEDBTN_X + 2 * SZ_SPACER_X + 2 * MARGIN_SMALL_X + 12; + calc->cb[0].r.top = skipy; + calc->cb[0].r.right = skipx + 4 * SZ_MEDBTN_X + 2 * SZ_SPACER_X + 2 * MARGIN_SMALL_X + SZ_FILLER_X + 4; + calc->cb[0].r.bottom = skipy + SZ_FILLER_Y - 6; + calc->cb[0].enable = 1; + + calc->cb[1].id = 0; + strcpy(calc->cb[1].label,"FILLER"); + calc->cb[1].color = CALC_COLOR_BLUE; + calc->cb[1].r.left = skipx + 3 * SZ_MEDBTN_X + SZ_SPACER_X + 2 * MARGIN_SMALL_X + 8; + calc->cb[1].r.top = skipy; + calc->cb[1].r.right = skipx + 3 * SZ_MEDBTN_X + SZ_SPACER_X + 2 * MARGIN_SMALL_X + SZ_FILLER_X + 0; + calc->cb[1].r.bottom = skipy + SZ_FILLER_Y - 6; + calc->cb[1].enable = 1; + + skipx += SZ_FILLER_X + MARGIN_SMALL_X; + + skipx = MARGIN_BIG_X; + + calc->cb[2].id = ID_CALC_BACKSPACE; + LoadString( hInst, IDS_BTN_BACKSPACE, calc->cb[2].label, sizeof(calc->cb[2].label)); + calc->cb[2].color = CALC_COLOR_RED; + calc->cb[2].r.left = skipx; + calc->cb[2].r.top = skipy; + calc->cb[2].r.right = SZ_BIGBTN_X; + calc->cb[2].r.bottom = SZ_BIGBTN_Y; + calc->cb[2].enable = 1; + + skipx += SZ_BIGBTN_X + MARGIN_SMALL_X; + + calc->cb[3].id = ID_CALC_CLEAR_ENTRY; + LoadString( hInst, IDS_BTN_CLEAR_ENTRY, calc->cb[3].label, sizeof(calc->cb[3].label)); + calc->cb[3].color = CALC_COLOR_RED; + calc->cb[3].r.left = skipx; + calc->cb[3].r.top = skipy; + calc->cb[3].r.right = SZ_BIGBTN_X; + calc->cb[3].r.bottom = SZ_BIGBTN_Y; + calc->cb[3].enable = 1; + + skipx += SZ_BIGBTN_X + MARGIN_SMALL_X; + + calc->cb[4].id = ID_CALC_CLEAR_ALL; + LoadString( hInst, IDS_BTN_CLEAR_ALL, calc->cb[4].label, sizeof(calc->cb[4].label)); + calc->cb[4].color = CALC_COLOR_RED; + calc->cb[4].r.left = skipx; + calc->cb[4].r.top = skipy; + calc->cb[4].r.right = SZ_BIGBTN_X; + calc->cb[4].r.bottom = SZ_BIGBTN_Y; + calc->cb[4].enable = 1; + + // Row 2 + + skipx = MARGIN_LEFT; + skipy += SZ_MEDBTN_Y + MARGIN_SMALL_Y; + + calc->cb[5].id = ID_CALC_STA; + strcpy(calc->cb[5].label,"Sta"); + calc->cb[5].color = CALC_COLOR_GRAY; + calc->cb[5].r.left = skipx; + calc->cb[5].r.top = skipy; + calc->cb[5].r.right = SZ_MEDBTN_X; + calc->cb[5].r.bottom = SZ_MEDBTN_Y; + calc->cb[5].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[6].id = ID_CALC_FE; + strcpy(calc->cb[6].label,"F-E"); + calc->cb[6].color = CALC_COLOR_MAGENTA; + calc->cb[6].r.left = skipx; + calc->cb[6].r.top = skipy; + calc->cb[6].r.right = SZ_MEDBTN_X; + calc->cb[6].r.bottom = SZ_MEDBTN_Y; + calc->cb[6].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[7].id = ID_CALC_LEFTPAREN; + strcpy(calc->cb[7].label,"("); + calc->cb[7].color = CALC_COLOR_MAGENTA; + calc->cb[7].r.left = skipx; + calc->cb[7].r.top = skipy; + calc->cb[7].r.right = SZ_MEDBTN_X; + calc->cb[7].r.bottom = SZ_MEDBTN_Y; + calc->cb[7].enable = 0; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[8].id = ID_CALC_RIGHTPAREN; + strcpy(calc->cb[8].label,")"); + calc->cb[8].color = CALC_COLOR_MAGENTA; + calc->cb[8].r.left = skipx; + calc->cb[8].r.top = skipy; + calc->cb[8].r.right = SZ_MEDBTN_X; + calc->cb[8].r.bottom = SZ_MEDBTN_Y; + calc->cb[8].enable = 0; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[9].id = ID_CALC_MEM_CLEAR; + LoadString( hInst, IDS_BTN_MEM_CLEAR, calc->cb[9].label, sizeof(calc->cb[9].label)); + calc->cb[9].color = CALC_COLOR_RED; + calc->cb[9].r.left = skipx; + calc->cb[9].r.top = skipy; + calc->cb[9].r.right = SZ_MEDBTN_X; + calc->cb[9].r.bottom = SZ_MEDBTN_Y; + calc->cb[9].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[10].id = ID_CALC_SEVEN; + strcpy(calc->cb[10].label,"7"); + calc->cb[10].color = CALC_COLOR_BLUE; + calc->cb[10].r.left = skipx; + calc->cb[10].r.top = skipy; + calc->cb[10].r.right = SZ_MEDBTN_X; + calc->cb[10].r.bottom = SZ_MEDBTN_Y; + calc->cb[10].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[11].id = ID_CALC_EIGHT; + strcpy(calc->cb[11].label,"8"); + calc->cb[11].color = CALC_COLOR_BLUE; + calc->cb[11].r.left = skipx; + calc->cb[11].r.top = skipy; + calc->cb[11].r.right = SZ_MEDBTN_X; + calc->cb[11].r.bottom = SZ_MEDBTN_Y; + calc->cb[11].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[12].id = ID_CALC_NINE; + strcpy(calc->cb[12].label,"9"); + calc->cb[12].color = CALC_COLOR_BLUE; + calc->cb[12].r.left = skipx; + calc->cb[12].r.top = skipy; + calc->cb[12].r.right = SZ_MEDBTN_X; + calc->cb[12].r.bottom = SZ_MEDBTN_Y; + calc->cb[12].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[13].id = ID_CALC_DIVIDE; + strcpy(calc->cb[13].label,"/"); + calc->cb[13].color = CALC_COLOR_RED; + calc->cb[13].r.left = skipx; + calc->cb[13].r.top = skipy; + calc->cb[13].r.right = SZ_MEDBTN_X; + calc->cb[13].r.bottom = SZ_MEDBTN_Y; + calc->cb[13].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[14].id = ID_CALC_MOD; + strcpy(calc->cb[14].label,"Mod"); + calc->cb[14].color = CALC_COLOR_RED; + calc->cb[14].r.left = skipx; + calc->cb[14].r.top = skipy; + calc->cb[14].r.right = SZ_MEDBTN_X; + calc->cb[14].r.bottom = SZ_MEDBTN_Y; + calc->cb[14].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[15].id = ID_CALC_AND; + strcpy(calc->cb[15].label,"And"); + calc->cb[15].color = CALC_COLOR_RED; + calc->cb[15].r.left = skipx; + calc->cb[15].r.top = skipy; + calc->cb[15].r.right = SZ_MEDBTN_X; + calc->cb[15].r.bottom = SZ_MEDBTN_Y; + calc->cb[15].enable = 1; + + // Row 3 + + skipx = MARGIN_LEFT; + skipy += SZ_MEDBTN_Y + MARGIN_SMALL_Y; + + calc->cb[16].id = ID_CALC_AVE; + strcpy(calc->cb[16].label,"Ave"); + calc->cb[16].color = CALC_COLOR_GRAY; + calc->cb[16].r.left = skipx; + calc->cb[16].r.top = skipy; + calc->cb[16].r.right = SZ_MEDBTN_X; + calc->cb[16].r.bottom = SZ_MEDBTN_Y; + calc->cb[16].enable = 0; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[17].id = ID_CALC_DMS; + strcpy(calc->cb[17].label,"dms"); + calc->cb[17].color = CALC_COLOR_MAGENTA; + calc->cb[17].r.left = skipx; + calc->cb[17].r.top = skipy; + calc->cb[17].r.right = SZ_MEDBTN_X; + calc->cb[17].r.bottom = SZ_MEDBTN_Y; + calc->cb[17].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[18].id = ID_CALC_EXP; + strcpy(calc->cb[18].label,"Exp"); + calc->cb[18].color = CALC_COLOR_MAGENTA; + calc->cb[18].r.left = skipx; + calc->cb[18].r.top = skipy; + calc->cb[18].r.right = SZ_MEDBTN_X; + calc->cb[18].r.bottom = SZ_MEDBTN_Y; + calc->cb[18].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[19].id = ID_CALC_LN; + strcpy(calc->cb[19].label,"ln"); + calc->cb[19].color = CALC_COLOR_MAGENTA; + calc->cb[19].r.left = skipx; + calc->cb[19].r.top = skipy; + calc->cb[19].r.right = SZ_MEDBTN_X; + calc->cb[19].r.bottom = SZ_MEDBTN_Y; + calc->cb[19].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[20].id = ID_CALC_MEM_RECALL; + strcpy(calc->cb[20].label,"MR"); + calc->cb[20].color = CALC_COLOR_RED; + calc->cb[20].r.left = skipx; + calc->cb[20].r.top = skipy; + calc->cb[20].r.right = SZ_MEDBTN_X; + calc->cb[20].r.bottom = SZ_MEDBTN_Y; + calc->cb[20].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[21].id = ID_CALC_FOUR; + strcpy(calc->cb[21].label,"4"); + calc->cb[21].color = CALC_COLOR_BLUE; + calc->cb[21].r.left = skipx; + calc->cb[21].r.top = skipy; + calc->cb[21].r.right = SZ_MEDBTN_X; + calc->cb[21].r.bottom = SZ_MEDBTN_Y; + calc->cb[21].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[22].id = ID_CALC_FIVE; + strcpy(calc->cb[22].label,"5"); + calc->cb[22].color = CALC_COLOR_BLUE; + calc->cb[22].r.left = skipx; + calc->cb[22].r.top = skipy; + calc->cb[22].r.right = SZ_MEDBTN_X; + calc->cb[22].r.bottom = SZ_MEDBTN_Y; + calc->cb[22].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[23].id = ID_CALC_SIX; + strcpy(calc->cb[23].label,"6"); + calc->cb[23].color = CALC_COLOR_BLUE; + calc->cb[23].r.left = skipx; + calc->cb[23].r.top = skipy; + calc->cb[23].r.right = SZ_MEDBTN_X; + calc->cb[23].r.bottom = SZ_MEDBTN_Y; + calc->cb[23].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[24].id = ID_CALC_MULTIPLY; + strcpy(calc->cb[24].label,"*"); + calc->cb[24].color = CALC_COLOR_RED; + calc->cb[24].r.left = skipx; + calc->cb[24].r.top = skipy; + calc->cb[24].r.right = SZ_MEDBTN_X; + calc->cb[24].r.bottom = SZ_MEDBTN_Y; + calc->cb[24].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[25].id = ID_CALC_OR; + strcpy(calc->cb[25].label,"Or"); + calc->cb[25].color = CALC_COLOR_RED; + calc->cb[25].r.left = skipx; + calc->cb[25].r.top = skipy; + calc->cb[25].r.right = SZ_MEDBTN_X; + calc->cb[25].r.bottom = SZ_MEDBTN_Y; + calc->cb[25].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[26].id = ID_CALC_XOR; + strcpy(calc->cb[26].label,"Xor"); + calc->cb[26].color = CALC_COLOR_RED; + calc->cb[26].r.left = skipx; + calc->cb[26].r.top = skipy; + calc->cb[26].r.right = SZ_MEDBTN_X; + calc->cb[26].r.bottom = SZ_MEDBTN_Y; + calc->cb[26].enable = 1; + + // Row 4 + + skipx = MARGIN_LEFT; + skipy += SZ_MEDBTN_Y + MARGIN_SMALL_Y; + + calc->cb[27].id = ID_CALC_SUM; + strcpy(calc->cb[27].label,"Sum"); + calc->cb[27].color = CALC_COLOR_GRAY; + calc->cb[27].r.left = skipx ; + calc->cb[27].r.top = skipy; + calc->cb[27].r.right = SZ_MEDBTN_X; + calc->cb[27].r.bottom = SZ_MEDBTN_Y; + calc->cb[27].enable = 0; + + skipx += MARGIN_SMALL_X + SZ_MEDBTN_X + SZ_SPACER_X; + + calc->cb[28].id = ID_CALC_SIN; + strcpy(calc->cb[28].label,"sin"); + calc->cb[28].color = CALC_COLOR_MAGENTA; + calc->cb[28].r.left = skipx; + calc->cb[28].r.top = skipy; + calc->cb[28].r.right = SZ_MEDBTN_X; + calc->cb[28].r.bottom = SZ_MEDBTN_Y; + calc->cb[28].enable = 1; + + skipx += MARGIN_SMALL_X + SZ_MEDBTN_X; + + calc->cb[29].id = ID_CALC_POWER ; + strcpy(calc->cb[29].label,"x^y"); + calc->cb[29].color = CALC_COLOR_MAGENTA; + calc->cb[29].r.left = skipx; + calc->cb[29].r.top = skipy; + calc->cb[29].r.right = SZ_MEDBTN_X; + calc->cb[29].r.bottom = SZ_MEDBTN_Y; + calc->cb[29].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[30].id = ID_CALC_LOG10; + strcpy(calc->cb[30].label,"log"); + calc->cb[30].color = CALC_COLOR_MAGENTA; + calc->cb[30].r.left = skipx; + calc->cb[30].r.top = skipy; + calc->cb[30].r.right = SZ_MEDBTN_X; + calc->cb[30].r.bottom = SZ_MEDBTN_Y; + calc->cb[30].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[31].id = ID_CALC_MEM_STORE; + LoadString( hInst, IDS_BTN_MEM_STORE, calc->cb[31].label, sizeof(calc->cb[31].label)); + calc->cb[31].color = CALC_COLOR_RED; + calc->cb[31].r.left = skipx; + calc->cb[31].r.top = skipy; + calc->cb[31].r.right = SZ_MEDBTN_X; + calc->cb[31].r.bottom = SZ_MEDBTN_Y; + calc->cb[31].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[32].id = ID_CALC_ONE; + strcpy(calc->cb[32].label,"1"); + calc->cb[32].color = CALC_COLOR_BLUE; + calc->cb[32].r.left = skipx; + calc->cb[32].r.top = skipy; + calc->cb[32].r.right = SZ_MEDBTN_X; + calc->cb[32].r.bottom = SZ_MEDBTN_Y; + calc->cb[32].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[33].id = ID_CALC_TWO; + strcpy(calc->cb[33].label,"2"); + calc->cb[33].color = CALC_COLOR_BLUE; + calc->cb[33].r.left = skipx; + calc->cb[33].r.top = skipy; + calc->cb[33].r.right = SZ_MEDBTN_X; + calc->cb[33].r.bottom = SZ_MEDBTN_Y; + calc->cb[33].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[34].id = ID_CALC_THREE; + strcpy(calc->cb[34].label,"3"); + calc->cb[34].color = CALC_COLOR_BLUE; + calc->cb[34].r.left = skipx; + calc->cb[34].r.top = skipy; + calc->cb[34].r.right = SZ_MEDBTN_X; + calc->cb[34].r.bottom = SZ_MEDBTN_Y; + calc->cb[34].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[35].id = ID_CALC_MINUS; + strcpy(calc->cb[35].label,"-"); + calc->cb[35].color = CALC_COLOR_RED; + calc->cb[35].r.left = skipx; + calc->cb[35].r.top = skipy; + calc->cb[35].r.right = SZ_MEDBTN_X; + calc->cb[35].r.bottom = SZ_MEDBTN_Y; + calc->cb[35].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[36].id = ID_CALC_LSH; + strcpy(calc->cb[36].label,"Lsh"); + calc->cb[36].color = CALC_COLOR_RED; + calc->cb[36].r.left = skipx; + calc->cb[36].r.top = skipy; + calc->cb[36].r.right = SZ_MEDBTN_X; + calc->cb[36].r.bottom = SZ_MEDBTN_Y; + calc->cb[36].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[37].id = ID_CALC_NOT; + strcpy(calc->cb[37].label,"Not"); + calc->cb[37].color = CALC_COLOR_RED; + calc->cb[37].r.left = skipx; + calc->cb[37].r.top = skipy; + calc->cb[37].r.right = SZ_MEDBTN_X; + calc->cb[37].r.bottom = SZ_MEDBTN_Y; + calc->cb[37].enable = 1; + + // Row 5 (bottom) + + skipx = MARGIN_LEFT; + skipy += SZ_MEDBTN_Y + MARGIN_SMALL_Y; + + calc->cb[38].id = ID_CALC_S; + strcpy(calc->cb[38].label,"s"); + calc->cb[38].color = CALC_COLOR_GRAY; + calc->cb[38].r.left = skipx; + calc->cb[38].r.top = skipy; + calc->cb[38].r.right = SZ_MEDBTN_X; + calc->cb[38].r.bottom = SZ_MEDBTN_Y; + calc->cb[38].enable = 0; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[39].id = ID_CALC_COS; + strcpy(calc->cb[39].label,"cos"); + calc->cb[39].color = CALC_COLOR_MAGENTA; + calc->cb[39].r.left = skipx; + calc->cb[39].r.top = skipy; + calc->cb[39].r.right = SZ_MEDBTN_X; + calc->cb[39].r.bottom = SZ_MEDBTN_Y; + calc->cb[39].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[40].id = ID_CALC_CUBE; + strcpy(calc->cb[40].label,"x^3"); + calc->cb[40].color = CALC_COLOR_MAGENTA; + calc->cb[40].r.left = skipx; + calc->cb[40].r.top = skipy; + calc->cb[40].r.right = SZ_MEDBTN_X; + calc->cb[40].r.bottom = SZ_MEDBTN_Y; + calc->cb[40].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[41].id = ID_CALC_FACTORIAL; + strcpy(calc->cb[41].label,"n!"); + calc->cb[41].color = CALC_COLOR_MAGENTA; + calc->cb[41].r.left = skipx; + calc->cb[41].r.top = skipy; + calc->cb[41].r.right = SZ_MEDBTN_X; + calc->cb[41].r.bottom = SZ_MEDBTN_Y; + calc->cb[41].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[42].id = ID_CALC_MEM_PLUS; + LoadString( hInst, IDS_BTN_MEM_PLUS, calc->cb[42].label, sizeof(calc->cb[42].label)); + calc->cb[42].color = CALC_COLOR_RED; + calc->cb[42].r.left = skipx; + calc->cb[42].r.top = skipy; + calc->cb[42].r.right = SZ_MEDBTN_X; + calc->cb[42].r.bottom = SZ_MEDBTN_Y; + calc->cb[42].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[43].id = ID_CALC_ZERO; + strcpy(calc->cb[43].label,"0"); + calc->cb[43].color = CALC_COLOR_BLUE; + calc->cb[43].r.left = skipx; + calc->cb[43].r.top = skipy; + calc->cb[43].r.right = SZ_MEDBTN_X; + calc->cb[43].r.bottom = SZ_MEDBTN_Y; + calc->cb[43].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[44].id = ID_CALC_SIGN; + strcpy(calc->cb[44].label,"+/-"); + calc->cb[44].color = CALC_COLOR_RED; + calc->cb[44].r.left = skipx; + calc->cb[44].r.top = skipy; + calc->cb[44].r.right = SZ_MEDBTN_X; + calc->cb[44].r.bottom = SZ_MEDBTN_Y; + calc->cb[44].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[45].id = ID_CALC_DECIMAL; + strcpy(calc->cb[45].label,"."); + calc->cb[45].color = CALC_COLOR_BLUE; + calc->cb[45].r.left = skipx; + calc->cb[45].r.top = skipy; + calc->cb[45].r.right = SZ_MEDBTN_X; + calc->cb[45].r.bottom = SZ_MEDBTN_Y; + calc->cb[45].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[46].id = ID_CALC_PLUS; + strcpy(calc->cb[46].label,"+"); + calc->cb[46].color = CALC_COLOR_RED; + calc->cb[46].r.left = skipx; + calc->cb[46].r.top = skipy; + calc->cb[46].r.right = SZ_MEDBTN_X; + calc->cb[46].r.bottom = SZ_MEDBTN_Y; + calc->cb[46].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[47].id = ID_CALC_EQUALS; + strcpy(calc->cb[47].label,"="); + calc->cb[47].color = CALC_COLOR_RED; + calc->cb[47].r.left = skipx; + calc->cb[47].r.top = skipy; + calc->cb[47].r.right = SZ_MEDBTN_X; + calc->cb[47].r.bottom = SZ_MEDBTN_Y; + calc->cb[47].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[48].id = ID_CALC_INT; + strcpy(calc->cb[48].label,"Int"); + calc->cb[48].color = CALC_COLOR_RED; + calc->cb[48].r.left = skipx; + calc->cb[48].r.top = skipy; + calc->cb[48].r.right = SZ_MEDBTN_X; + calc->cb[48].r.bottom = SZ_MEDBTN_Y; + calc->cb[48].enable = 1; + + + // Row 6 + + skipx = MARGIN_LEFT; + skipy += SZ_MEDBTN_Y + MARGIN_SMALL_Y; + + calc->cb[49].id = ID_CALC_DAT; + strcpy(calc->cb[49].label,"Dat"); + calc->cb[49].color = CALC_COLOR_GRAY; + calc->cb[49].r.left = skipx; + calc->cb[49].r.top = skipy; + calc->cb[49].r.right = SZ_MEDBTN_X; + calc->cb[49].r.bottom = SZ_MEDBTN_Y; + calc->cb[49].enable = 0; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[50].id = ID_CALC_TAN; + strcpy(calc->cb[50].label,"tan"); + calc->cb[50].color = CALC_COLOR_MAGENTA; + calc->cb[50].r.left = skipx; + calc->cb[50].r.top = skipy; + calc->cb[50].r.right = SZ_MEDBTN_X; + calc->cb[50].r.bottom = SZ_MEDBTN_Y; + calc->cb[50].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[51].id = ID_CALC_SQUARE; + strcpy(calc->cb[51].label,"x^2"); + calc->cb[51].color = CALC_COLOR_MAGENTA; + calc->cb[51].r.left = skipx; + calc->cb[51].r.top = skipy; + calc->cb[51].r.right = SZ_MEDBTN_X; + calc->cb[51].r.bottom = SZ_MEDBTN_Y; + calc->cb[51].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[52].id = ID_CALC_RECIPROCAL; + strcpy(calc->cb[52].label,"1/x"); + calc->cb[52].color = CALC_COLOR_MAGENTA; + calc->cb[52].r.left = skipx; + calc->cb[52].r.top = skipy; + calc->cb[52].r.right = SZ_MEDBTN_X; + calc->cb[52].r.bottom = SZ_MEDBTN_Y; + calc->cb[52].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[53].id = ID_CALC_PI; + strcpy(calc->cb[53].label,"pi"); + calc->cb[53].color = CALC_COLOR_BLUE; + calc->cb[53].r.left = skipx; + calc->cb[53].r.top = skipy; + calc->cb[53].r.right = SZ_MEDBTN_X; + calc->cb[53].r.bottom = SZ_MEDBTN_Y; + calc->cb[53].enable = 1; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X + SZ_SPACER_X; + + calc->cb[54].id = ID_CALC_A; + strcpy(calc->cb[54].label,"A"); + calc->cb[54].color = CALC_COLOR_GRAY; + calc->cb[54].r.left = skipx; + calc->cb[54].r.top = skipy; + calc->cb[54].r.right = SZ_MEDBTN_X; + calc->cb[54].r.bottom = SZ_MEDBTN_Y; + calc->cb[54].enable = 0; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[55].id = ID_CALC_B; + strcpy(calc->cb[55].label,"B"); + calc->cb[55].color = CALC_COLOR_GRAY; + calc->cb[55].r.left = skipx; + calc->cb[55].r.top = skipy; + calc->cb[55].r.right = SZ_MEDBTN_X; + calc->cb[55].r.bottom = SZ_MEDBTN_Y; + calc->cb[55].enable = 0; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[56].id = ID_CALC_C; + strcpy(calc->cb[56].label,"C"); + calc->cb[56].color = CALC_COLOR_GRAY; + calc->cb[56].r.left = skipx; + calc->cb[56].r.top = skipy; + calc->cb[56].r.right = SZ_MEDBTN_X; + calc->cb[56].r.bottom = SZ_MEDBTN_Y; + calc->cb[56].enable = 0; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[57].id = ID_CALC_D; + strcpy(calc->cb[57].label,"D"); + calc->cb[57].color = CALC_COLOR_GRAY; + calc->cb[57].r.left = skipx; + calc->cb[57].r.top = skipy; + calc->cb[57].r.right = SZ_MEDBTN_X; + calc->cb[57].r.bottom = SZ_MEDBTN_Y; + calc->cb[57].enable = 0; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[58].id = ID_CALC_E; + strcpy(calc->cb[58].label,"E"); + calc->cb[58].color = CALC_COLOR_GRAY; + calc->cb[58].r.left = skipx; + calc->cb[58].r.top = skipy; + calc->cb[58].r.right = SZ_MEDBTN_X; + calc->cb[58].r.bottom = SZ_MEDBTN_Y; + calc->cb[58].enable = 0; + + skipx += SZ_MEDBTN_X + MARGIN_SMALL_X; + + calc->cb[59].id = ID_CALC_F; + strcpy(calc->cb[59].label,"F"); + calc->cb[59].color = CALC_COLOR_GRAY; + calc->cb[59].r.left = skipx; + calc->cb[59].r.top = skipy; + calc->cb[59].r.right = SZ_MEDBTN_X; + calc->cb[59].r.bottom = SZ_MEDBTN_Y; + calc->cb[59].enable = 0; + + // Buttons + + calc->cb[60].id = ID_CALC_NS_HEX; + strcpy(calc->cb[60].label,"Hex"); + calc->cb[60].color = CALC_COLOR_GRAY; + calc->cb[60].r.left = CALC_NS_HEX_LEFT; + calc->cb[60].r.top = CALC_NS_HEX_TOP; + calc->cb[60].r.right = SZ_RADIO_NS_X; + calc->cb[60].r.bottom = SZ_RADIO_NS_Y; + calc->cb[60].enable = 1; + + calc->cb[61].id = ID_CALC_NS_DEC; + strcpy(calc->cb[61].label,"Dec"); + calc->cb[61].color = CALC_COLOR_GRAY; + calc->cb[61].r.left = CALC_NS_DEC_LEFT; + calc->cb[61].r.top = CALC_NS_DEC_TOP; + calc->cb[61].r.right = SZ_RADIO_NS_X; + calc->cb[61].r.bottom = SZ_RADIO_NS_Y; + calc->cb[61].enable = 1; + + calc->cb[62].id = ID_CALC_NS_OCT; + strcpy(calc->cb[62].label,"Oct"); + calc->cb[62].color = CALC_COLOR_GRAY; + calc->cb[62].r.left = CALC_NS_OCT_LEFT; + calc->cb[62].r.top = CALC_NS_OCT_TOP; + calc->cb[62].r.right = SZ_RADIO_NS_X; + calc->cb[62].r.bottom = SZ_RADIO_NS_Y; + calc->cb[62].enable = 1; + + calc->cb[63].id = ID_CALC_NS_BIN; + strcpy(calc->cb[63].label,"Bin"); + calc->cb[63].color = CALC_COLOR_GRAY; + calc->cb[63].r.left = CALC_NS_BIN_LEFT; + calc->cb[63].r.top = CALC_NS_BIN_TOP; + calc->cb[63].r.right = SZ_RADIO_NS_X; + calc->cb[63].r.bottom = SZ_RADIO_NS_Y; + calc->cb[63].enable = 1; + + calc->cb[64].id = ID_CALC_MS_DEGREES; + strcpy(calc->cb[64].label,"Degrees"); + calc->cb[64].color = CALC_COLOR_GRAY; + calc->cb[64].r.left = CALC_MS_DEGREES_LEFT; + calc->cb[64].r.top = CALC_MS_DEGREES_TOP; + calc->cb[64].r.right = SZ_RADIO_MS_X; + calc->cb[64].r.bottom = SZ_RADIO_MS_Y; + calc->cb[64].enable = 1; + + calc->cb[65].id = ID_CALC_MS_RADIANS; + strcpy(calc->cb[65].label,"Radians"); + calc->cb[65].color = CALC_COLOR_GRAY; + calc->cb[65].r.left = CALC_MS_RADIANS_LEFT; + calc->cb[65].r.top = CALC_MS_RADIANS_TOP; + calc->cb[65].r.right = SZ_RADIO_MS_X; + calc->cb[65].r.bottom = SZ_RADIO_MS_Y; + calc->cb[65].enable = 1; + + calc->cb[66].id = ID_CALC_MS_GRADS; + strcpy(calc->cb[66].label,"Grads"); + calc->cb[66].color = CALC_COLOR_GRAY; + calc->cb[66].r.left = CALC_MS_GRADS_LEFT; + calc->cb[66].r.top = CALC_MS_GRADS_TOP; + calc->cb[66].r.right = SZ_RADIO_MS_X; + calc->cb[66].r.bottom = SZ_RADIO_MS_Y; + calc->cb[66].enable = 1; + + calc->cb[67].id = ID_CALC_CB_INV; + strcpy(calc->cb[67].label,"Inv"); + calc->cb[67].color = CALC_COLOR_GRAY; + calc->cb[67].r.left = CALC_CB_INV_LEFT; + calc->cb[67].r.top = CALC_CB_INV_TOP; + calc->cb[67].r.right = SZ_RADIO_CB_X; + calc->cb[67].r.bottom = SZ_RADIO_CB_Y; + calc->cb[67].enable = 1; + + calc->cb[68].id = ID_CALC_CB_HYP; + strcpy(calc->cb[68].label,"Hyp"); + calc->cb[68].color = CALC_COLOR_GRAY; + calc->cb[68].r.left = CALC_CB_HYP_LEFT; + calc->cb[68].r.top = CALC_CB_HYP_TOP; + calc->cb[68].r.right = SZ_RADIO_CB_X; + calc->cb[68].r.bottom = SZ_RADIO_CB_Y; + calc->cb[68].enable = 1; + + calc->cb[69].id = ID_CALC_WS_QWORD; + strcpy(calc->cb[69].label,"Qword"); + calc->cb[69].color = CALC_COLOR_GRAY; + calc->cb[69].r.left = CALC_WS_QWORD_LEFT; + calc->cb[69].r.top = CALC_WS_QWORD_TOP; + calc->cb[69].r.right = SZ_RADIO_WS_X; + calc->cb[69].r.bottom = SZ_RADIO_WS_Y; + calc->cb[69].enable = 1; + + calc->cb[70].id = ID_CALC_WS_DWORD; + strcpy(calc->cb[70].label,"Dword"); + calc->cb[70].color = CALC_COLOR_GRAY; + calc->cb[70].r.left = CALC_WS_DWORD_LEFT; + calc->cb[70].r.top = CALC_WS_DWORD_TOP; + calc->cb[70].r.right = SZ_RADIO_WS_X; + calc->cb[70].r.bottom = SZ_RADIO_WS_Y; + calc->cb[70].enable = 1; + + calc->cb[71].id = ID_CALC_WS_WORD; + strcpy(calc->cb[71].label,"Word"); + calc->cb[71].color = CALC_COLOR_GRAY; + calc->cb[71].r.left = CALC_WS_WORD_LEFT; + calc->cb[71].r.top = CALC_WS_WORD_TOP; + calc->cb[71].r.right = SZ_RADIO_WS_X; + calc->cb[71].r.bottom = SZ_RADIO_WS_Y; + calc->cb[71].enable = 1; + + calc->cb[72].id = ID_CALC_WS_BYTE; + strcpy(calc->cb[72].label,"Byte"); + calc->cb[72].color = CALC_COLOR_GRAY; + calc->cb[72].r.left = CALC_WS_BYTE_LEFT; + calc->cb[72].r.top = CALC_WS_BYTE_TOP; + calc->cb[72].r.right = SZ_RADIO_WS_X; + calc->cb[72].r.bottom = SZ_RADIO_WS_Y; + calc->cb[72].enable = 1; + } + + // preload clip region for filler squares + + if (calc->sciMode) { + n = 1; + + rFiller.left = calc->cb[0].r.left; + rFiller.top = calc->cb[0].r.top; + rFiller.right = calc->cb[0].r.right; + rFiller.bottom = calc->cb[0].r.bottom; + } + else { + n = 2; + + rFiller.left = calc->cb[1].r.left; + rFiller.top = calc->cb[1].r.top; + rFiller.right = calc->cb[0].r.right; + rFiller.bottom = calc->cb[0].r.bottom; + } + + top_button = calc->numButtons - 1; + if (!calc->sciMode) + top_button -= CALC_NS_COUNT + CALC_MS_COUNT + CALC_CB_COUNT + CALC_WS_COUNT; + + for (; n <= top_button; n++) { + ; + + calc->cb[n].hBtn = CreateWindow( + "BUTTON", + calc->cb[n].label, + WS_VISIBLE | WS_CHILD | WS_BORDER | BS_CENTER | BS_VCENTER | BS_TEXT | + (calc->cb[n].enable ? 0 : WS_DISABLED), // BS_FLAT + calc->cb[n].r.left, + calc->cb[n].r.top, + calc->cb[n].r.right, + calc->cb[n].r.bottom, + calc->hWnd, + (HMENU)calc->cb[n].id, + calc->hInst, + NULL + ); + + if (!calc->cb[n].hBtn) + exit(1); + + SendMessage(calc->cb[n].hBtn, WM_SETFONT, (WPARAM)hFont, TRUE); + } + + if (!calc->sciMode) { + top_button += CALC_NS_COUNT; + for (; n<=top_button; n++) { + int j = ID_CALC_NS_HEX + n - top_button + CALC_NS_COUNT - 1; + calc->cb[n].hBtn = CreateWindow( + "BUTTON", + calc->cb[n].label, + WS_VISIBLE | WS_CHILD | BS_LEFT | BS_VCENTER | BS_TEXT | BS_RADIOBUTTON, + CALC_NS_OFFSET_X + calc->cb[n].r.left, + CALC_NS_OFFSET_Y + calc->cb[n].r.top, + calc->cb[n].r.right, + calc->cb[n].r.bottom, + calc->hWnd, + (HMENU)(j), + calc->hInst, + NULL + ); + + if (!calc->cb[n].hBtn) + exit(1); + + SendMessage(calc->cb[n].hBtn, WM_SETFONT, (WPARAM)hFont, TRUE); + } + + top_button += CALC_MS_COUNT; + + for (; n<=top_button; n++) { + calc->cb[n].hBtn = CreateWindow( + "BUTTON", + calc->cb[n].label, + WS_VISIBLE | WS_CHILD | BS_LEFT | BS_VCENTER | BS_TEXT | BS_RADIOBUTTON, + CALC_MS_OFFSET_X + calc->cb[n].r.left, + CALC_MS_OFFSET_Y + calc->cb[n].r.top, + calc->cb[n].r.right, + calc->cb[n].r.bottom, + calc->hWnd, + (HMENU)(ID_CALC_MS_DEGREES + n - top_button + CALC_MS_COUNT - 1), + calc->hInst, + NULL + ); + + if (!calc->cb[n].hBtn) + exit(1); + + SendMessage(calc->cb[n].hBtn, WM_SETFONT, (WPARAM)hFont, TRUE); + } + + top_button += CALC_CB_COUNT; + + for (; n<=top_button; n++) { + calc->cb[n].hBtn = CreateWindow( + "BUTTON", + calc->cb[n].label, + WS_VISIBLE | WS_CHILD | BS_LEFT | BS_VCENTER | BS_TEXT | BS_CHECKBOX, + CALC_CB_OFFSET_X + calc->cb[n].r.left, + CALC_CB_OFFSET_Y + calc->cb[n].r.top, + calc->cb[n].r.right, + calc->cb[n].r.bottom, + calc->hWnd, + (HMENU)(ID_CALC_CB_INV + n - top_button + CALC_CB_COUNT - 1), + calc->hInst, + NULL + ); + + if (!calc->cb[n].hBtn) + exit(1); + + SendMessage(calc->cb[n].hBtn, WM_SETFONT, (WPARAM)hFont, TRUE); + } + + top_button += CALC_WS_COUNT; + + for (; n<=top_button; n++) { + calc->cb[n].hBtn = CreateWindow( + "BUTTON", + calc->cb[n].label, + WS_CHILD | BS_LEFT | BS_VCENTER | BS_TEXT | BS_RADIOBUTTON, + CALC_WS_OFFSET_X + calc->cb[n].r.left, + CALC_WS_OFFSET_Y + calc->cb[n].r.top, + calc->cb[n].r.right, + calc->cb[n].r.bottom, + calc->hWnd, + (HMENU)(ID_CALC_WS_QWORD + n - top_button + CALC_WS_COUNT - 1), + calc->hInst, + NULL + ); + + if (!calc->cb[n].hBtn) + exit(1); + + EnableWindow(calc->cb[n].hBtn, FALSE); + SendMessage(calc->cb[n].hBtn, WM_SETFONT, (WPARAM)hFont, TRUE); + } + + // set sci defaults + + SendMessage(calc->cb[61].hBtn, BM_SETCHECK, 1, 0); // decimal + SendMessage(calc->cb[64].hBtn, BM_SETCHECK, 1, 0); // degrees + SendMessage(calc->cb[69].hBtn, BM_SETCHECK, 1, 0); // qword + } +} + +void DrawCalcRect (HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, CALC *calc, int object) +{ + POINT pt; + HPEN hPenGray; + HPEN hPenBlack; + HPEN hPenWhite; + HPEN hPenOrg; + + int WDISPLAY_LEFT; + int WDISPLAY_TOP; + int WDISPLAY_RIGHT; + int WDISPLAY_BOTTOM; + + if (!calc->sciMode) { + WDISPLAY_LEFT = WDISPLAY_SCIENTIFIC_LEFT; + WDISPLAY_TOP = WDISPLAY_SCIENTIFIC_TOP; + WDISPLAY_RIGHT = WDISPLAY_SCIENTIFIC_RIGHT; + WDISPLAY_BOTTOM = WDISPLAY_SCIENTIFIC_BOTTOM; + } + else { + WDISPLAY_LEFT = WDISPLAY_STANDARD_LEFT; + WDISPLAY_TOP = WDISPLAY_STANDARD_TOP; + WDISPLAY_RIGHT = WDISPLAY_STANDARD_RIGHT; + WDISPLAY_BOTTOM = WDISPLAY_STANDARD_BOTTOM; + } + + // never delete the active pen! + + // Gray Pen + + hPenGray = CreatePen(PS_SOLID, 1, RGB(CALC_GRAY,CALC_GRAY,CALC_GRAY)); + hPenBlack = CreatePen(PS_SOLID, 1, RGB(0,0,0)); + hPenWhite = CreatePen(PS_SOLID, 1, RGB(255,255,255)); + + hPenOrg = SelectObject(hdc, hPenGray); + + MoveToEx(hdc, + calc->cb[object].r.left, + calc->cb[object].r.bottom, + &pt); + + LineTo(hdc, calc->cb[object].r.left, calc->cb[object].r.top); + LineTo(hdc, calc->cb[object].r.right, calc->cb[object].r.top); + + // Black Pen + + SelectObject(hdc, hPenBlack); + + MoveToEx(hdc, + calc->cb[object].r.right-2, + calc->cb[object].r.top+1, + &pt); + + LineTo(hdc, calc->cb[object].r.left+1, calc->cb[object].r.top+1); + LineTo(hdc, calc->cb[object].r.left+1, calc->cb[object].r.bottom-1); + + SelectObject(hdc, hPenBlack); + + MoveToEx(hdc, + WDISPLAY_LEFT - 1, + WDISPLAY_BOTTOM, + &pt); + + LineTo(hdc, WDISPLAY_LEFT - 1, WDISPLAY_TOP - 1); + LineTo(hdc, WDISPLAY_RIGHT + 1, WDISPLAY_TOP - 1); + + SelectObject(hdc, hPenGray); + + MoveToEx(hdc, + WDISPLAY_RIGHT + 1, + WDISPLAY_TOP - 2, + &pt); + + LineTo(hdc, WDISPLAY_LEFT - 2, WDISPLAY_TOP - 2); + LineTo(hdc, WDISPLAY_LEFT - 2, WDISPLAY_BOTTOM + 1); + + // White Pen + + SelectObject(hdc, hPenWhite); + + MoveToEx(hdc, + calc->cb[object].r.left, + calc->cb[object].r.bottom, + &pt); + + LineTo(hdc, calc->cb[object].r.right, calc->cb[object].r.bottom); + LineTo(hdc, calc->cb[object].r.right, calc->cb[object].r.top); + + SelectObject(hdc, hPenOrg); + DeleteObject(hPenGray); + DeleteObject(hPenBlack); + DeleteObject(hPenWhite); +} + +void DrawCalcRectSci(HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, CALC *calc, RECT *r) +{ + POINT pt; + HPEN hPen; + HPEN hPenOrg; + + // never delete the active pen! + + // White Pen + + hPen = CreatePen(PS_SOLID, 1, RGB(255,255,255)); + hPenOrg = SelectObject(hdc, hPen); + + MoveToEx(hdc, + r->left + 1, + r->bottom + 1, + &pt); + + LineTo(hdc, r->left + 1, r->top + 1); + LineTo(hdc, r->right + 1, r->top + 1); + LineTo(hdc, r->right + 1, r->bottom + 1); + LineTo(hdc, r->left + 1, r->bottom + 1); + + SelectObject(hdc, hPenOrg); + DeleteObject(hPen); + + // Black Pen + + hPen = CreatePen(PS_SOLID, 1, RGB(CALC_GRAY,CALC_GRAY,CALC_GRAY)); + hPenOrg = SelectObject(hdc, hPen); + + MoveToEx(hdc, + r->left, + r->bottom, + &pt); + + LineTo(hdc, r->left, r->top); + LineTo(hdc, r->right, r->top); + LineTo(hdc, r->right, r->bottom); + LineTo(hdc, r->left, r->bottom); + + SelectObject(hdc, hPenOrg); + DeleteObject(hPen); +} + +static RECT scirect1 = { + WDISPLAY_SCIENTIFIC_LEFT - 2, + WDISPLAY_SCIENTIFIC_TOP + 25, + WDISPLAY_SCIENTIFIC_LEFT + 202, + WDISPLAY_SCIENTIFIC_TOP + 51 +}; + +static RECT scirect2 = { + WDISPLAY_SCIENTIFIC_LEFT + 205, + WDISPLAY_SCIENTIFIC_TOP + 25, + WDISPLAY_SCIENTIFIC_RIGHT, + WDISPLAY_SCIENTIFIC_TOP + 51 +}; + +static RECT scirect3 = { + WDISPLAY_SCIENTIFIC_LEFT - 2, + WDISPLAY_SCIENTIFIC_TOP + 57, + WDISPLAY_SCIENTIFIC_LEFT + 102, + WDISPLAY_SCIENTIFIC_TOP + 81 +}; + +void DrawCalc (HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, CALC *calc) +{ + char s[CALC_BUF_SIZE]; + + scirect1.right = calc->cb[0].r.right + 2; + scirect2.left = calc->cb[0].r.right + 5; + scirect3.right = calc->cb[1].r.left - 10; + + DrawCalcRect (hdc, hMemDC, ps, calc, 0); + + if (!calc->sciMode) { + DrawCalcRect (hdc, hMemDC, ps, calc, 1); + DrawCalcRectSci(hdc, hMemDC, ps, calc, &scirect1); + DrawCalcRectSci(hdc, hMemDC, ps, calc, &scirect2); + DrawCalcRectSci(hdc, hMemDC, ps, calc, &scirect3); + } + + LoadString(calc->hInst, IDS_BTN_MEM_STATUS_M, s, sizeof(s)); + + DrawCalcText(hdc, hMemDC, ps, calc, 0, s); +} + +void DrawCalcText (HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, CALC *calc, int object, char *s) +{ + POINT pt; + HFONT hFont; + HFONT hFontOrg; + HPEN hPen; + HPEN hPenOrg; + + char s2[CALC_BUF_SIZE]; + + int WDISPLAY_LEFT; + int WDISPLAY_TOP; + int WDISPLAY_RIGHT; + int WDISPLAY_BOTTOM; + + if (!calc->sciMode) { + WDISPLAY_LEFT = WDISPLAY_SCIENTIFIC_LEFT; + WDISPLAY_TOP = WDISPLAY_SCIENTIFIC_TOP; + WDISPLAY_RIGHT = WDISPLAY_SCIENTIFIC_RIGHT; + WDISPLAY_BOTTOM = WDISPLAY_SCIENTIFIC_BOTTOM; + } + else { + WDISPLAY_LEFT = WDISPLAY_STANDARD_LEFT; + WDISPLAY_TOP = WDISPLAY_STANDARD_TOP; + WDISPLAY_RIGHT = WDISPLAY_STANDARD_RIGHT; + WDISPLAY_BOTTOM = WDISPLAY_STANDARD_BOTTOM; + } + + // DEFAULT_GUI_FONT is Tahoma on 2000 and XP? + // SYSTEM_FONT is MS Sans Serif? + + hFont = GetStockObject(DEFAULT_GUI_FONT); + + hFontOrg = SelectObject(hdc, hFont); + + if (calc->memory) { + SetBkMode(hdc, TRANSPARENT); + + TextOut(hdc, + calc->cb[object].r.left + 9, + calc->cb[object].r.top + 7, + s, + strlen(s) + ); + + SetBkMode(hdc, OPAQUE); + } + + if (calc->paren) { + sprintf(s2, "(=%d",calc->paren); + + SetBkMode(hdc, TRANSPARENT); + + SetTextAlign(hdc, TA_CENTER); + + TextOut(hdc, + calc->cb[object+1].r.left + 13, + calc->cb[object+1].r.top + 6, + s2, + strlen(s2) + ); + + SetBkMode(hdc, OPAQUE); + } + + hPen = CreatePen(PS_SOLID, 1, RGB(255,255,255)); + hPenOrg = SelectObject(hdc, hPen); + + MoveToEx(hdc, + WDISPLAY_LEFT - 1, + WDISPLAY_BOTTOM + 1, + &pt + ); + + LineTo(hdc, WDISPLAY_RIGHT + 1, WDISPLAY_BOTTOM + 1); + LineTo(hdc, WDISPLAY_RIGHT + 1, WDISPLAY_TOP - 2); + + Rectangle(hdc, WDISPLAY_LEFT, WDISPLAY_TOP, WDISPLAY_RIGHT, WDISPLAY_BOTTOM); + + SelectObject(hdc, hPenOrg); + DeleteObject(hPen); + + SetBkMode(hdc, TRANSPARENT); + + SetTextAlign(hdc, TA_RIGHT); + + TextOut(hdc, + WDISPLAY_RIGHT - 4, + WDISPLAY_TOP + 1, + calc->display, + strlen(calc->display) + ); + + SelectObject(hdc, hFontOrg); +} + +void DestroyCalc (CALC *calc) +{ + int i; + + for (i=0;inumButtons;i++) + DestroyWindow(calc->cb[i].hBtn); +} + +void calc_buffer_format(CALC *calc) { + char *p; + int n; + int flag = 0; + int point = 0; + + // calc_buffer_format: enforce buffer content rules + // + // disallow more than one point (beep) + // remove leading zeros + // remove trailing zeros after point (sprintf can cause this) + // remove trailing points + // chop at 32 digits. Though there could also be a point, and 10 separator characters. + + p = calc->buffer; + while (*p) { + if (*p++ == '.') + point++; + } + + if (point > 1) { + calc->buffer[strlen(calc->buffer)-1] = '\0'; + MessageBeep(0); + } + + if (point) { + p = calc->buffer; + n = strlen(p) - 1; + while (*(p+n) && + *(p+n) != '.' && + *(p+n) == '0') { + calc->buffer[n] = '\0'; + n--; + } + } + + // remove leading zeros + + p = calc->buffer; + while (*p) { + if (*p != '0') + break; + p++; + } + + // remove trailing points + + n = strlen(p); + + while (n) { + if (*(p+n-1) == '.') { + if (flag) { + *(p + n) = '\0'; + } + else { + flag = 1; + } + n--; + } + else { + break; + } + } + + // if (!*p) + // strcpy(p, "0"); + + // chop at 32 digits + if (flag) + *(p+33) = '\0'; + else + *(p+32) = '\0'; + + n = 0; + while (*p) + *(calc->buffer + n++) = *(p++); + *(calc->buffer + n) = '\0'; +} + +void calc_buffer_display(CALC *calc) { + char *p; + char s[CALC_BUF_SIZE]; + char r[CALC_BUF_SIZE] = "0"; + int point=0; + calcfloat real; + + switch (calc->numBase) { + case NBASE_HEX: + real = calc_atof(calc->buffer, calc->numBase); + sprintf(calc->display, "%x", (long)real); + break; + + case NBASE_OCTAL: + sprintf(calc->display, "%o", calc->buffer); + break; + + case NBASE_BINARY: + sprintf(calc->display, "%x", calc->buffer); + break; + + case NBASE_DECIMAL: + calc_buffer_format(calc); + + if (calc->displayMode) { + if (!strcmp(calc->buffer, "0") || !calc->buffer[0]) { + strcpy(calc->display, "0.e+0"); + } + else { + int i = 0; + int lz = 0; + calcfloat r; + int exp = 0; + + r = calc_atof(calc->buffer, calc->numBase); + sprintf(s, FMT_DESC_EXP, r); + // remove leading zeros in exponent + p = s; + while (*p) { + if (*p == 'e') { // starting exponent parsing + + exp = 1; + } + else if (exp) { // inside exponent, and haven't seen a digit, so could be a leading zero + + if (*p == '0') + lz = 1; + } + + if (exp && (*p != 'e') && (*p != '0') && (*p != '+') && (*p != '-')) { + exp = 0; + lz = 0; + } + + if (!lz) + calc->display[i++] = *p; + + p++; + } + + if (calc->display[i-1] == '+') // all trailing zeros + + calc->display[i++] = '0'; + + calc->display[i] = 0; + } + } + else { + // calc_buffer_display: display buffer after formatting + // + // if digitGrouping, embed separators + // add point if missing + // display + + strcpy(s,calc->buffer); + p = s; + + while (*p) { + if (*p++ == '.') + point = 1; + } + + if (!*s) + strcpy(s, "0"); + + if (calc->digitGrouping) + calc_sep(s); + + if (!point && calc->numBase == NBASE_DECIMAL) + strcat(s, "."); + + if (*s == '.') { + strcat(r, s); + strcpy(calc->display, r); + } + else { + strcpy(calc->display, s); + } + } + } + InvalidateRect(calc->hWnd, NULL, FALSE); + UpdateWindow(calc->hWnd); +} + +char *calc_sep(char *s) +{ + char c; + char *p; + int n; + int x = 1; + int i = 0; + int point = 0; + char r[CALC_BUF_SIZE]; + + n = strlen(s); + + if (!*s) + return s; + + p = s; + + // need to handle leading minus sign! + + // see if there is a point character + + while (*p) { + if (*p++ == '.') { + point = p - s; + break; + } + } + + // if there is a point character, skip over decimal places + + if (point) { + i = n - point + 1; + n = point - 1; + strcpy(r, s); + strrev(r); + } + + // commify the integer part now + + while (c = *(s + --n)) { + r[i++] = c; + if (x++ % 3 == 0) + r[i++] = ','; + if (n == -1) + break; + } + + if (r[i-1] == ',') + r[--i] = '\0'; + else + r[i] = '\0'; + + strcpy(s, strrev(r)); + + return s; +} + +long factorial(long n) +{ + if (n <= 1L) + return 1L; + + return n * factorial(n - 1); +} + +void calc_setmenuitem_radio(HMENU hMenu, UINT id) +{ + MENUITEMINFO menuItem; + + menuItem.fMask = MIIM_FTYPE; + menuItem.fType = MFT_STRING | MFT_RADIOCHECK; + // menuItem.fState = MFS_ENABLED; + // menuItem.wID = id; + // menuItem.hSubMenu = NULL; + // menuItem.hbmpChecked = NULL; + // menuItem.hbmpUnchecked = NULL; + // menuItem.dwItemData = 0; + // menuItem.dwTypeData = "Hex\tF5"; + // menuItem.cch = sizeof("Hex\tF5"); + menuItem.cbSize = sizeof(MENUITEMINFO); + + SetMenuItemInfo(hMenu, id, FALSE, &menuItem); +} + +calcfloat calc_convert_to_radians(CALC *calc) +{ + calcfloat r = calc_atof(calc->buffer, calc->numBase); + + if (calc->trigMode == TRIGMODE_RADIANS) + return r; + if (calc->trigMode == TRIGMODE_DEGREES) + return r * CONST_PI / 180; + else if (calc->trigMode == TRIGMODE_GRADS) + return r * CONST_PI / 200; // 90 degrees == 100 grads + + return 0L; +} + +calcfloat calc_convert_from_radians(CALC *calc) +{ + calcfloat r = calc_atof(calc->buffer, calc->numBase); + + if (calc->trigMode == TRIGMODE_RADIANS) + return r; + if (calc->trigMode == TRIGMODE_DEGREES) + return r * 180 / CONST_PI; + else if (calc->trigMode == TRIGMODE_GRADS) + return r * 200 / CONST_PI; // 90 degrees == 100 grads + + return 0L; +} + +void show_debug(CALC *calc, char *title, long w, long l) +{ + char s[1024]; + + sprintf(s, + + "wParam = (%c) %d:%d, %x:%xh\n \ +lParam = %d:%d, %x:%x\n \ +value = %.32g\n \ +memory = %.32g\n \ +buffer = \"%s\"\n \ +display = \"%s\"\n \ +numBase = %d\n \ +trigMode = %d\n \ +wordSize = %d\n \ +invMode = %d\n \ +hypMode = %d\n \ +oper = (%c)\n", + + LOWORD(w), + LOWORD(w), + HIWORD(w), + LOWORD(w), + HIWORD(w), + LOWORD(l), + HIWORD(l), + LOWORD(l), + HIWORD(l), + calc->value, + calc->memory, + calc->buffer, + calc->display, + calc->numBase, + calc->trigMode, + calc->wordSize, + calc->invMode, + calc->hypMode, + calc->oper + ); + + MessageBox(calc->hWnd, s, title, MB_OK); +} + +calcfloat calc_atof(char *s, int base) +{ + // converts from another base to decimal calcfloat + + switch (base) { + case NBASE_DECIMAL: + return CALC_ATOF(s); + case NBASE_HEX: + return (calcfloat)strtol(s, NULL, 16); + case NBASE_OCTAL: + return (calcfloat)strtol(s, NULL, 8); + case NBASE_BINARY: + return (calcfloat)strtol(s, NULL, 2); + default: + break; + } + + return 0L; +} + +void calc_ftoa(CALC *calc, calcfloat r, char *buf) +{ + // converts from decimal calcfloat to another base + + switch (calc->numBase) { + case NBASE_DECIMAL: + sprintf(buf, FMT_DESC_FLOAT, r); + break; + case NBASE_HEX: + sprintf(buf, "%lX", (long)r); + break; + case NBASE_OCTAL: + sprintf(buf, "%lo", (long)r); + break; + case NBASE_BINARY: // 911 - need routine here + + break; + default: + break; + } +} + +int parse(int wParam, int lParam) +{ + switch (wParam) { + case '\b': // backspace + + if (calc.buffer[0]) + calc.buffer[strlen(calc.buffer)-1] = '\0'; + break; + + case '\x1b': // ESC + + calc.next = 1; + calc.buffer[0] = '\0'; + calc.value = 0; + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + { + char s22[CALC_BUF_SIZE]; + char w = (char)LOWORD(wParam); + + if (!keys[calc.numBase][w]) { + MessageBeep(0); + return 0; + } + + if (calc.next) { // user first digit indicates new buffer needed after previous UI event + calc.next = 0; + calc.buffer[0] = '\0'; + } + calc.newenter = 1; + + sprintf(s22,"%c", w); + strcat(calc.buffer, s22); + } + break; + + case '.': + case ',': // 911 - need to handle this, i18n + + if (calc.numBase == NBASE_DECIMAL) { + if (calc.next) { // first digit indicates new buffer needed after previous UI event + calc.next = 0; + calc.buffer[0] = '\0'; + } + + strcat(calc.buffer, "."); + } + else { + MessageBeep(0); + return 0; + } + break; + + case 'x': + case 'X': // exp, e(1)=2.718 + + if (calc.numBase == NBASE_DECIMAL) { + calc.next = 1; + calc.value = exp(calc_atof(calc.buffer, calc.numBase)); + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value); + } + else { + MessageBeep(0); + return 0; + } + break; + + case 'l': + case 'L': + calc.next = 1; + if (calc_atof(calc.buffer, calc.numBase) == 0.0L) { + strcpy(calc.buffer, err_invalid); + } + else { + calc.value = log10(calc_atof(calc.buffer, calc.numBase)); + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value); + } + break; + + case 'N': + case 'n': // ln is natural logarithm + + calc.next = 1; + if (calc_atof(calc.buffer, calc.numBase) == 0.0L) { + strcpy(calc.buffer, err_invalid); + } + else { + calc.value = log(calc_atof(calc.buffer, calc.numBase)); + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value); + } + break; + + case 'p': + case 'P': + if (calc.numBase == NBASE_DECIMAL) { + calc.next = 1; + sprintf(calc.buffer, FMT_DESC_FLOAT, CONST_PI); + } + else { + MessageBeep(0); + return 0; + } + break; + + case '\x0c': // Ctrl+L MC (only need to invalid rectangle if wasn't already zero, no need to update display) + + calc.next = 1; + if (calc.memory) { + calc.memory = 0.0; + InvalidateRect(calc.hWnd, &rFiller, TRUE); + UpdateWindow(calc.hWnd); + } + + return 0; + break; + + case '\x12': // Ctrl+R MR (value doesn't change, so no invalid rectangle. but display is updated.) + + calc.next = 1; + if (calc.memory != calc_atof(calc.buffer, calc.numBase)) + sprintf(calc.buffer,FMT_DESC_FLOAT,calc.memory); + else + return 0; + break; + + case '\x10': // Ctrl+P M+ (need to invalidate rectangle in many cases but not display) + + calc.next = 1; + InvalidateRect(calc.hWnd, &rFiller, TRUE); + calc.memory += calc_atof(calc.buffer, calc.numBase); + return 0; + break; + + case '\x0d': // Ctrl+M MS (only need to invalid rectangle if was zero and now not, + + // or was not zero and now is, not display) + calc.next = 1; + { + int x = GetKeyState(VK_CONTROL); + + if (x < 0 || lParam == NUMBER_OF_THE_BEAST) { + if ((!calc.memory && calc_atof(calc.buffer, calc.numBase)) || + (calc.memory && !calc_atof(calc.buffer, calc.numBase))) { + + calc.memory = calc_atof(calc.buffer, calc.numBase); + InvalidateRect(calc.hWnd, &rFiller, FALSE); + UpdateWindow(calc.hWnd); + } + else { + calc.memory = calc_atof(calc.buffer, calc.numBase); + } + } + return 0; + } + break; + + // fall through for Enter processing ... but there is a bug here in Ctrl+M vs. Return + case '=': + { + calcfloat r = calc.operand; + + if (calc.newenter) { + calc.newenter = 0; + calc.operand = calc_atof(calc.buffer, calc.numBase); + r = calc_atof(calc.buffer, calc.numBase); // convert buffer from whatever base to decimal real + } + + if (calc.oper == '+') { + calc.value += r; + } + else if (calc.oper == '-') { + calc.value -= r; + } + else if (calc.oper == '*') { + calc.value *= r; + } + else if (calc.oper == '%') { + calc.value = (long)calc.value % (long)r; + } + else if (calc.oper == '/') { + if (!calc_atof(calc.buffer, calc.numBase)) { + strcpy(calc.buffer, err_undefined); + calc.err = 1; + } + else { + calc.value /= r; + } + } + else if (calc.oper == '&') { + calc.value = (calcfloat)((long)calc.value & (long)r); + } + else if (calc.oper == '|') { + calc.value = (calcfloat)((long)calc.value | (long)r); + } + else if (calc.oper == '^') { + calc.value = (calcfloat)((long)calc.value ^ (long)r); + } + else if (calc.oper == 'y') { + calc.value = (calcfloat)pow(calc.value, r); + } + else if (calc.oper == '<') { + if (calc.invMode) + calc.value = (calcfloat)((long)calc.value >> (long)calc_atof(calc.buffer, calc.numBase)); + else + calc.value = (calcfloat)((long)calc.value << (long)calc_atof(calc.buffer, calc.numBase)); + } + else { // must have been a gratuitous user = + + calc.value = calc_atof(calc.buffer, calc.numBase); + } + + calc_ftoa(&calc, calc.value, calc.buffer); + + if (!calc.next) + // calc.value = r; + calc.next = 1; + } + break; + + case 'R': + case 'r': // 1/x + + calc.next = 1; + if (calc_atof(calc.buffer, calc.numBase) == 0) { + calc.err = 1; + strcpy(calc.buffer, err_divide_by_zero); + } + else { + calc.value = 1/calc_atof(calc.buffer, calc.numBase); + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); + } + break; + + case '@': // ^2 - sqrt in standard mode, squared in sci mode + + calc.next = 1; + calc.value = calc_atof(calc.buffer, calc.numBase); + + if (!calc.sciMode) + calc.value *= calc.value; + else + calc.value = sqrt(calc.value); + + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); + break; + + case '#': // ^3 + + calc.next = 1; + calc.value = calc_atof(calc.buffer, calc.numBase); + calc.value *= calc.value * calc.value; + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); + break; + + case 'Y': + case 'y': // x^y + + calc.next = 1; + calc.value = calc_atof(calc.buffer, calc.numBase); + calc.oper = 'y'; + calc.next = 1; + break; + + case '<': // Lsh + + calc.next = 1; + calc.value = calc_atof(calc.buffer, calc.numBase); + calc.oper = '<'; + calc.next = 1; + break; + + case ';': // INT + + calc.next = 1; + calc.value = (long)calc_atof(calc.buffer, calc.numBase); + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); + break; + + case '!': // factorial, need to use gamma function for reals t^(z-1)*e^t dt + + calc.next = 1; + calc.value = calc_atof(calc.buffer, calc.numBase); + calc.value = (calcfloat)factorial((long)calc.value); + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); + break; + + case '&': // bitwise and + + calc.oper = '&'; + calc.next = 1; + calc.value = calc_atof(calc.buffer, calc.numBase); + break; + + case '|': // bitwise or + + calc.oper = '|'; + calc.next = 1; + calc.value = calc_atof(calc.buffer, calc.numBase); + break; + + case '^': // bitwise xor + + calc.oper = '^'; + calc.next = 1; + calc.value = calc_atof(calc.buffer, calc.numBase); + break; + + case '~': // bitwise not + + calc.next = 1; + calc.value = ~ (long) calc_atof(calc.buffer, calc.numBase); + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); + break; + + case '+': + calc.operand = calc_atof(calc.buffer, calc.numBase); + calc.value += calc.operand; + calc_ftoa(&calc, calc.value, calc.buffer); + calc.oper = '+'; + calc.newenter = 1; + calc.next = 1; + break; + + case '-': + if (calc.init) { + calc.init = 0; + calc.operand = calc_atof(calc.buffer, calc.numBase); + calc.value = calc.operand; + } + else { + calc.value -= calc.operand; + calc_ftoa(&calc, calc.value, calc.buffer); + } + + calc.oper = '-'; + calc.newenter = 1; + calc.next = 1; + break; + + case '*': + if (calc.init) { + calc.init = 0; + calc.operand = calc_atof(calc.buffer, calc.numBase); + calc.value = calc.operand; + } + else { + calc.value *= calc.operand; + calc_ftoa(&calc, calc.value, calc.buffer); + } + calc.oper = '*'; + calc.newenter = 1; + calc.next = 1; + break; + + case '/': + if (calc.init) { + calc.init = 0; + calc.operand = calc_atof(calc.buffer, calc.numBase); + calc.value = calc.operand; + } + else { + calc.value /= calc.operand; + calc_ftoa(&calc, calc.value, calc.buffer); + } + calc.oper = '/'; + calc.newenter = 1; + calc.next = 1; + break; + + case '%': + if (!calc.sciMode) { + if (calc.init) { + calc.init = 0; + calc.operand = calc_atof(calc.buffer, calc.numBase); + calc.value = calc.operand; + } + else { + calc.value = (long)atof(calc.buffer) % (long)calc.operand; + calc_ftoa(&calc, calc.value, calc.buffer); + } + } + else { + calcfloat r; + r = calc_atof(calc.buffer, calc.numBase); + calc.next = 1; + sprintf(calc.buffer, FMT_DESC_FLOAT, r * calc.value / (calcfloat)100.0); + } + + calc.oper = '%'; + calc.newenter = 1; + calc.next = 1; + break; + + case 'O': // cos + + case 'o': + if (calc.numBase == NBASE_DECIMAL) { + + calcfloat r; + calc.next = 1; + r = calc_convert_to_radians(&calc); + if (calc.hypMode && calc.invMode) + calc.value = acosh(r); + else if (calc.invMode) + calc.value = acos(r); + else if (calc.hypMode) + calc.value = cosh(r); + else + calc.value = cos(calc_atof(calc.buffer, calc.numBase)); + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); + } + else { + MessageBeep(0); + return 0; + } + break; + + case 'S': // sin + + case 's': + if (calc.numBase == NBASE_DECIMAL) { + + calcfloat r = calc_convert_to_radians(&calc); + calc.next = 1; + if (calc.hypMode && calc.invMode) + calc.value = asinh(r); + else if (calc.invMode) + calc.value = asin(r); + else if (calc.hypMode) + calc.value = sinh(r); + else + calc.value = sin(r); + + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); + } + else { + MessageBeep(0); + return 0; + } + break; + + case 'T': // tan + + case 't': + if (calc.numBase == NBASE_DECIMAL) { + calcfloat r = calc_convert_to_radians(&calc); + calc.next = 1; + if (calc.hypMode && calc.invMode) + calc.value = atanh(r); + else if (calc.invMode) + calc.value = atan(r); + else if (calc.hypMode) + calc.value = tanh(r); + else + calc.value = tan(r); + + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); + } + else { + MessageBeep(0); + return 0; + } + break; + + case 'M': // dms = Degrees Minutes Seconds + + case 'm': + if (calc.numBase == NBASE_DECIMAL) { + calcfloat r2; + calcfloat r = calc_atof(calc.buffer, calc.numBase); + calc.next = 1; + r2 = r - (long)r; + + r = (long)r + r2 * 0.6; // multiply by 60 and divide by 100 + calc.value = r; + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); + } + else { + MessageBeep(0); + return 0; + } + break; + + case 'V': // toggle scientic notation like 1.e+2 or 100 + + case 'v': + calc.displayMode = !calc.displayMode; + break; + +// non-standard keystrokes ... + + case '?': + + calc.next = 1; + if (calc_atof(calc.buffer, calc.numBase) < 0) { + calc.err = 1; + strcpy(calc.buffer, err_invalid); + } + else { + calc.value = sqrt(calc_atof(calc.buffer, calc.numBase)); + sprintf(calc.buffer, FMT_DESC_FLOAT, calc.value ); + } + break; + + case 'Z': // +/- + + { + char s[CALC_BUF_SIZE] = "-"; + + if (!strcmp(calc.buffer, "0")) + return 0; + + if (calc.buffer[0] == '-') + strcpy(s, calc.buffer+1); + else + strcpy(s+1, calc.buffer); + + strcpy(calc.buffer, s); + } + break; + + case 'G': // debug mode + + case 'g': + calc.next = 1; + debug = !debug; + break; + + default: + MessageBeep(0); + return 0; + break; + } + + return 0; +} + +/* + case WM_CONTEXTMENU: // need to subclass control and just call WinHelp! + WinHelp((HWND) wParam, "c:/windows/help/calc.hlp", HELP_CONTEXTMENU, (DWORD)(LPVOID)2); + return 0; + } +*/ diff --git a/rosapps/calc/winecalc.h b/rosapps/calc/winecalc.h new file mode 100644 index 00000000000..9e19d639dc9 --- /dev/null +++ b/rosapps/calc/winecalc.h @@ -0,0 +1,364 @@ +/* + * WineCalc (winecalc.h) + * + * Copyright 2003 James Briggs + * + * 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 + */ + +////////////////////////////////////////////////////////////////// + +// numerics are defined here for easier porting + +typedef double calcfloat; +#define FMT_DESC_FLOAT "%.32g" +#define FMT_DESC_EXP "%.32e" + +#define CALC_ATOF(x) atof(x) + +#define CONST_PI 3.1415926535897932384626433832795 + +///////////////////////////////////////////////////////////////// + +#define CALC_BUF_SIZE 128 + +// statistics dialog dimensions + +#define CALC_STA_X 235 +#define CALC_STA_Y 180 + +// sentinel for differentiating Return from Ctrl+M events + +#define NUMBER_OF_THE_BEAST 666 + +#define CALC_COLOR_BLUE 0 +#define CALC_COLOR_RED 1 +#define CALC_COLOR_GRAY 2 +#define CALC_COLOR_MAGENTA 3 + +// gray hilite on rectangle owner-drawn controls RGB(CALC_GRAY, CALC_GRAY, CALC_GRAY) + +#define CALC_GRAY 132 + +// count of buttons needing special toggle states depending on number base + +#define TOGGLE_COUNT 23 + +// there are 3 window menus, standard, decimal measurement system and word size menus + +#define COUNT_MENUS 3 +#define MENU_STD 0 +#define MENU_SCIMS 1 +#define MENU_SCIWS 2 + +// count of buttons + +#define CALC_BUTTONS_STANDARD 28 +#define CALC_BUTTONS_SCIENTIFIC 73 + +// winecalc window outer dimensions + +#define CALC_STANDARD_WIDTH 260 +#define CALC_STANDARD_HEIGHT 252 +#define CALC_SCIENTIFIC_WIDTH 480 +#define CALC_SCIENTIFIC_HEIGHT 310 + +// winecalc private ids for events + +#define ID_CALC_ZERO 0 +#define ID_CALC_ONE 1 +#define ID_CALC_TWO 2 +#define ID_CALC_THREE 3 +#define ID_CALC_FOUR 4 +#define ID_CALC_FIVE 5 +#define ID_CALC_SIX 6 +#define ID_CALC_SEVEN 7 +#define ID_CALC_EIGHT 8 +#define ID_CALC_NINE 9 +#define ID_CALC_BACKSPACE 20 +#define ID_CALC_CLEAR_ENTRY 21 +#define ID_CALC_CLEAR_ALL 22 +#define ID_CALC_MEM_CLEAR 23 +#define ID_CALC_DIVIDE 24 +#define ID_CALC_SQRT 25 +#define ID_CALC_MEM_RECALL 26 +#define ID_CALC_MULTIPLY 27 +#define ID_CALC_PERCENT 28 +#define ID_CALC_MEM_STORE 29 +#define ID_CALC_MINUS 30 +#define ID_CALC_RECIPROCAL 31 +#define ID_CALC_MEM_PLUS 32 +#define ID_CALC_SIGN 33 +#define ID_CALC_DECIMAL 34 +#define ID_CALC_PLUS 35 +#define ID_CALC_EQUALS 36 +#define ID_CALC_STA 37 +#define ID_CALC_FE 38 +#define ID_CALC_LEFTPAREN 39 +#define ID_CALC_RIGHTPAREN 40 +#define ID_CALC_MOD 41 +#define ID_CALC_AND 42 +#define ID_CALC_OR 43 +#define ID_CALC_XOR 44 +#define ID_CALC_SUM 45 +#define ID_CALC_SIN 46 +#define ID_CALC_LOG10 47 +#define ID_CALC_LSH 48 +#define ID_CALC_NOT 49 +#define ID_CALC_S 50 +#define ID_CALC_COS 52 +#define ID_CALC_FACTORIAL 53 +#define ID_CALC_INT 54 +#define ID_CALC_DAT 55 +#define ID_CALC_TAN 56 +#define ID_CALC_SQUARE 57 +#define ID_CALC_A 58 +#define ID_CALC_B 59 +#define ID_CALC_C 60 +#define ID_CALC_D 61 +#define ID_CALC_E 62 +#define ID_CALC_F 63 +#define ID_CALC_AVE 64 +#define ID_CALC_DMS 65 +#define ID_CALC_EXP 66 +#define ID_CALC_LN 67 +#define ID_CALC_PI 68 +#define ID_CALC_CUBE 69 +#define ID_CALC_POWER 51 + +// Number System Radio Buttons + +#define CALC_NS_COUNT 4 +#define ID_CALC_NS_HEX 2000 +#define ID_CALC_NS_DEC 2001 +#define ID_CALC_NS_OCT 2002 +#define ID_CALC_NS_BIN 2003 + +#define NBASE_DECIMAL 0 +#define NBASE_BINARY 1 +#define NBASE_OCTAL 2 +#define NBASE_HEX 3 + +#define CALC_NS_OFFSET_X 15 +#define CALC_NS_OFFSET_Y 37 + +#define SZ_RADIO_NS_X 50 +#define SZ_RADIO_NS_Y 15 + +#define CALC_NS_HEX_LEFT 0 +#define CALC_NS_HEX_TOP 0 + +#define CALC_NS_DEC_LEFT 50 +#define CALC_NS_DEC_TOP 0 + +#define CALC_NS_OCT_LEFT 98 +#define CALC_NS_OCT_TOP 0 + +#define CALC_NS_BIN_LEFT 148 +#define CALC_NS_BIN_TOP 0 + +// Measurement System Radio Buttons + +#define CALC_MS_COUNT 3 +#define ID_CALC_MS_DEGREES 2010 +#define ID_CALC_MS_RADIANS 2011 +#define ID_CALC_MS_GRADS 2012 + +#define TRIGMODE_DEGREES 0 +#define TRIGMODE_RADIANS 1 +#define TRIGMODE_GRADS 2 + +#define CALC_MS_OFFSET_X 225 +#define CALC_MS_OFFSET_Y 37 + +#define SZ_RADIO_MS_X 75 +#define SZ_RADIO_MS_Y 15 + +#define CALC_MS_DEGREES_LEFT 0 +#define CALC_MS_DEGREES_TOP 0 + +#define CALC_MS_RADIANS_LEFT 82 +#define CALC_MS_RADIANS_TOP 0 + +#define CALC_MS_GRADS_LEFT 162 +#define CALC_MS_GRADS_TOP 0 + +// Inv and Hyp Checkboxes + +#define CALC_CB_COUNT 2 +#define ID_CALC_CB_INV 2020 +#define ID_CALC_CB_HYP 2021 + +#define WORDSIZE_BYTE 1 +#define WORDSIZE_WORD 2 +#define WORDSIZE_DWORD 4 +#define WORDSIZE_QWORD 8 + +#define CALC_CB_OFFSET_X 15 +#define CALC_CB_OFFSET_Y 58 + +#define CALC_CB_INV_LEFT 0 +#define CALC_CB_INV_TOP 10 + +#define SZ_RADIO_CB_X 50 +#define SZ_RADIO_CB_Y 14 + +#define CALC_CB_HYP_LEFT 58 +#define CALC_CB_HYP_TOP 10 + +// Word Size Radio Buttons + +#define CALC_WS_COUNT 4 +#define ID_CALC_WS_QWORD 2030 +#define ID_CALC_WS_DWORD 2031 +#define ID_CALC_WS_WORD 2032 +#define ID_CALC_WS_BYTE 2033 + +#define CALC_WS_OFFSET_X CALC_MS_OFFSET_X +#define CALC_WS_OFFSET_Y CALC_MS_OFFSET_Y + +#define CALC_WS_QWORD_LEFT 0 +#define CALC_WS_QWORD_TOP 0 + +#define CALC_WS_DWORD_LEFT 57 +#define CALC_WS_DWORD_TOP 0 + +#define CALC_WS_WORD_LEFT 120 +#define CALC_WS_WORD_TOP 0 + +#define CALC_WS_BYTE_LEFT 175 +#define CALC_WS_BYTE_TOP 0 + +#define SZ_RADIO_WS_X 50 +#define SZ_RADIO_WS_Y 15 + +// drawing offsets + +#define CALC_EDIT_HEIGHT 20 + +#define SZ_FILLER_X 32 +#define SZ_FILLER_Y 30 + +#define SZ_BIGBTN_X 62 +#define SZ_BIGBTN_Y 30 + +#define SZ_MEDBTN_X 36 +#define SZ_MEDBTN_Y 30 + +#define MARGIN_LEFT 7 +#define MARGIN_SMALL_X 3 +#define MARGIN_SMALL_Y 3 +#define MARGIN_BIG_X 274 +#define MARGIN_STANDARD_BIG_X 11 +#define MARGIN_BIG_Y 6 + +#define SZ_SPACER_X 11 + +// winecalc results display area + +#define WDISPLAY_STANDARD_LEFT MARGIN_LEFT + 4 +#define WDISPLAY_STANDARD_TOP 5 +#define WDISPLAY_STANDARD_RIGHT 244 +#define WDISPLAY_STANDARD_BOTTOM 24 +#define CALC_STANDARD_MARGIN_TOP 16 + +#define WDISPLAY_SCIENTIFIC_LEFT MARGIN_LEFT + 4 +#define WDISPLAY_SCIENTIFIC_TOP 5 +#define WDISPLAY_SCIENTIFIC_RIGHT 465 +#define WDISPLAY_SCIENTIFIC_BOTTOM 24 +#define CALC_SCIENTIFIC_MARGIN_TOP 44 + +typedef struct tagCalcBtn { + int id; // private id + HWND hBtn; // button child window handle + char label[80]; // text on buttonface + int color; // text color + RECT r; // location + int enable; // 1 = control enbabled, 0 = disabled +} +CALCBTN; + +typedef struct tagPos { + int x; + int y; +} +POS; + +typedef struct tagCalc { + HINSTANCE hInst; // this HINSTANCE + HWND hWnd; // main window's HWND + + POS pos; + int numButtons; // standard = 28, scientific = more + + char buffer [CALC_BUF_SIZE]; // current keyboard buffer + char display[CALC_BUF_SIZE]; // display buffer before output + + calcfloat value; // most recent computer value + calcfloat memory; // most recent stored memory value from display buffer + int paren; // current parentheses level + + int sciMode; // standard = 1, scientific = 0 + int displayMode; // 0 = float, 1 = scientific exponential notation like 1.0e+10 + + char oper; // most recent operator pushed + calcfloat operand; // most recent operand pushed + int newenter; // track multiple = + int next; // binary operation flag + int err; // errror status for divide by zero, infinity, etc. + int init; // starting buffer + + int digitGrouping; // no separators = 0, separators = 1 + + int trigMode; // degrees = 0, radians = 1, grads = 2 + int numBase; // 10 = decimal, 2 = binary, 8 = octal, 16 = hex + int wordSize; // 1 = byte, 2 = word, 4 = dword, 8 = qword + int invMode; // INV mode 0 = off, 1 = on + int hypMode; // HYP mode 0 = off, 1 = on + + int new; // first time 0 = false, 1 = true + CALCBTN cb[80]; // enough buttons for standard or scientific mode +} +CALC; + +BOOL CALLBACK AboutDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); +LRESULT WINAPI MainProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); + +void InitLuts(void); +void InitMenus(HINSTANCE hInst); + +void InitCalc (CALC *calc); +void DestroyCalc (CALC *calc); + +void calc_buffer_format(CALC *calc); +void calc_buffer_display(CALC *calc); +char *calc_sep(char *s); + +void DrawCalcText (HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, CALC *calc, int object, char *s); +void CalcRect (HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, CALC *calc, int object); +void DrawCalcRectSci(HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, CALC *calc, RECT *r); +void DrawCalc (HDC hdc, HDC hMemDC, PAINTSTRUCT *ps, CALC *calc); + +void calc_setmenuitem_radio(HMENU hMenu, UINT id); + +void show_debug(CALC *calc, char *title, long wParam, long lParam); + +calcfloat calc_atof(char *s, int base); +void calc_ftoa(CALC *calc, calcfloat r, char *buf); +long factorial(long n); + +calcfloat calc_convert_to_radians(CALC *calc); +calcfloat calc_convert_from_radians(CALC *calc); +