[CALC] Explicitly link against comctl32. Patch by Carlo Bramini. CORE-10727
[reactos.git] / reactos / base / applications / calc / winmain.c
index ca72f2a..3f49a54 100644 (file)
@@ -3,6 +3,8 @@
 #include <winbase.h>
 #include <wingdi.h>
 #include <winreg.h>
+#include <shellapi.h>
+#include <commctrl.h>
 
 #define HTMLHELP_PATH(_pt)  TEXT("%systemroot%\\Help\\calc.chm::") TEXT(_pt)
 
@@ -211,8 +213,8 @@ static const function_table_t function_table[] = {
     { IDC_BUTTON_DMS,  MODIFIER_INV,              1, rpn_dec2dms, rpn_dms2dec, NULL,     NULL      },
     { IDC_BUTTON_FE,   0,                         1, run_fe,      NULL,        NULL,     NULL      },
     { IDC_BUTTON_DAT,  0,                         1, run_dat_sta, NULL,        NULL,     NULL,     },
-    { IDC_BUTTON_MP,   MODIFIER_INV,              1, run_mp,      run_mm,      NULL,     NULL,     },
-    { IDC_BUTTON_MS,   MODIFIER_INV,              1, run_ms,      run_mw,      NULL,     NULL,     },
+    { IDC_BUTTON_MP,   MODIFIER_INV|NO_CHAIN,     1, run_mp,      run_mm,      NULL,     NULL,     },
+    { IDC_BUTTON_MS,   MODIFIER_INV|NO_CHAIN,     1, run_ms,      run_mw,      NULL,     NULL,     },
     { IDC_BUTTON_CANC, NO_CHAIN,                  0, run_canc,    NULL,        NULL,     NULL,     },
     { IDC_BUTTON_RIGHTPAR, NO_CHAIN,              1, run_rpar,    NULL,        NULL,     NULL,     },
     { IDC_BUTTON_LEFTPAR,  NO_CHAIN,              0, run_lpar,    NULL,        NULL,     NULL,     },
@@ -286,7 +288,7 @@ static void save_config(void)
     HKEY hKey;
     DWORD sepValue;
 
-    if (RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("SOFTWARE\\Microsoft\\Calc"), 0, KEY_ALL_ACCESS, &hKey) != ERROR_SUCCESS )
+    if (RegCreateKeyEx(HKEY_CURRENT_USER, TEXT("SOFTWARE\\Microsoft\\Calc"), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL) != ERROR_SUCCESS)
     {
         return;
     }
@@ -434,7 +436,7 @@ KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
 static void update_lcd_display(HWND hwnd)
 {
     /*
-     * muliply size of calc.buffer by 2 because it may
+     * multiply size of calc.buffer by 2 because it may
      * happen that separator is used between each digit.
      * Also added little additional space for dot and '\0'.
      */
@@ -932,15 +934,18 @@ static INT_PTR CALLBACK DlgStatProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
     return FALSE;
 }
 
-static WPARAM idm_2_idc(int idm)
+static BOOL idm_2_idc(int idm, WPARAM *pIdc)
 {
     int x;
 
     for (x=0; x<SIZEOF(upd); x++) {
         if (upd[x].idm == idm)
-            break;
+        {
+            *pIdc = (WPARAM)(upd[x].idc);
+            return TRUE;
+        }
     }
-    return (WPARAM)(upd[x].idc);
+    return FALSE;
 }
 
 static void CopyMemToClipboard(void *ptr)
@@ -1338,48 +1343,63 @@ static INT_PTR CALLBACK DlgMainProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
             SetFocus(GetDlgItem(hWnd, IDC_BUTTON_FOCUS));
         switch (LOWORD(wp)) {
         case IDM_HELP_ABOUT:
-            DialogBox(calc.hInstance,MAKEINTRESOURCE(IDD_DIALOG_ABOUT), hWnd, AboutDlgProc);
+        {
+            TCHAR infotitle[100];
+            TCHAR infotext[200];
+            LoadString(calc.hInstance, IDS_CALC_NAME, infotitle, SIZEOF(infotitle));
+            LoadString(calc.hInstance, IDS_AUTHOR, infotext, SIZEOF(infotext));
+            ShellAbout(hWnd, infotitle, infotext, (HICON)LoadIcon(calc.hInstance, MAKEINTRESOURCE(IDI_CALC_BIG)));
             return TRUE;
+        }
         case IDM_HELP_HELP:
 #ifndef DISABLE_HTMLHELP_SUPPORT
             HtmlHelp(hWnd, HTMLHELP_PATH("/general_information.htm"), HH_DISPLAY_TOPIC, (DWORD_PTR)NULL);
 #endif
             return TRUE;
         case IDM_VIEW_STANDARD:
-            calc.layout = CALC_LAYOUT_STANDARD;
-            calc.action = IDM_VIEW_STANDARD;
-            DestroyWindow(hWnd);
-            save_config();
-
-            CheckMenuRadioItem(GetMenu(hWnd),
-                               IDM_VIEW_STANDARD,
-                               IDM_VIEW_CONVERSION,
-                               IDM_VIEW_STANDARD,
-                               MF_BYCOMMAND);
+            if (calc.layout != CALC_LAYOUT_STANDARD)
+            {
+                calc.layout = CALC_LAYOUT_STANDARD;
+                calc.action = IDM_VIEW_STANDARD;
+                DestroyWindow(hWnd);
+                save_config();
+
+                CheckMenuRadioItem(GetMenu(hWnd),
+                    IDM_VIEW_STANDARD,
+                    IDM_VIEW_CONVERSION,
+                    IDM_VIEW_STANDARD,
+                    MF_BYCOMMAND);
+            }
             return TRUE;
         case IDM_VIEW_SCIENTIFIC:
-            calc.layout = CALC_LAYOUT_SCIENTIFIC;
-            calc.action = IDM_VIEW_SCIENTIFIC;
-            DestroyWindow(hWnd);
-            save_config();
-
-            CheckMenuRadioItem(GetMenu(hWnd),
-                               IDM_VIEW_STANDARD,
-                               IDM_VIEW_CONVERSION,
-                               IDM_VIEW_SCIENTIFIC,
-                               MF_BYCOMMAND);
+            if (calc.layout != CALC_LAYOUT_SCIENTIFIC)
+            {
+                calc.layout = CALC_LAYOUT_SCIENTIFIC;
+                calc.action = IDM_VIEW_SCIENTIFIC;
+                DestroyWindow(hWnd);
+                save_config();
+
+                CheckMenuRadioItem(GetMenu(hWnd),
+                    IDM_VIEW_STANDARD,
+                    IDM_VIEW_CONVERSION,
+                    IDM_VIEW_SCIENTIFIC,
+                    MF_BYCOMMAND);
+            }
             return TRUE;
         case IDM_VIEW_CONVERSION:
-            calc.layout = CALC_LAYOUT_CONVERSION;
-            calc.action = IDM_VIEW_CONVERSION;
-            DestroyWindow(hWnd);
-            save_config();
-
-            CheckMenuRadioItem(GetMenu(hWnd),
-                               IDM_VIEW_STANDARD,
-                               IDM_VIEW_CONVERSION,
-                               IDM_VIEW_CONVERSION,
-                               MF_BYCOMMAND);
+            if (calc.layout != CALC_LAYOUT_CONVERSION)
+            {
+                calc.layout = CALC_LAYOUT_CONVERSION;
+                calc.action = IDM_VIEW_CONVERSION;
+                DestroyWindow(hWnd);
+                save_config();
+
+                CheckMenuRadioItem(GetMenu(hWnd),
+                    IDM_VIEW_STANDARD,
+                    IDM_VIEW_CONVERSION,
+                    IDM_VIEW_CONVERSION,
+                    MF_BYCOMMAND);
+            }
             return TRUE;
         case IDM_VIEW_HEX:
         case IDM_VIEW_DEC:
@@ -1392,8 +1412,15 @@ static INT_PTR CALLBACK DlgMainProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
         case IDM_VIEW_DWORD:
         case IDM_VIEW_WORD:
         case IDM_VIEW_BYTE:
-            SendMessage(hWnd, WM_COMMAND, idm_2_idc(LOWORD(wp)), 0);
-            return TRUE;
+        {
+            WPARAM idc;
+            if(idm_2_idc(LOWORD(wp), &idc))
+            {
+                SendMessage(hWnd, WM_COMMAND, idc, 0);
+                return TRUE;
+            }
+            return FALSE;
+        }
         case IDM_EDIT_COPY:
             handle_copy_command(hWnd);
             return TRUE;
@@ -1759,6 +1786,8 @@ int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdL
     MSG msg;
     DWORD dwLayout;
 
+    InitCommonControls();
+
     calc.hInstance = hInstance;
 
     calc.x_coord = -1;