DIALOGS.C
上传用户:shijixite
上传日期:2007-01-03
资源大小:108k
文件大小:18k
源码类别:

输入法编程

开发平台:

Visual C++

  1. /**************************************************************************
  2. * dialogs.c -- dialog procedure support for uconvert
  3. *
  4. *         Steve Firebaugh
  5. *         Microsoft Developer Support
  6. *         Copyright (c) 1992-1997 Microsoft Corporation
  7. *
  8. **************************************************************************/
  9. #define UNICODE
  10. #include <windows.h>
  11. #include "uconvert.h"
  12. #include "install.h"
  13. /* Define affecting the positioning of child windows in dialog. */
  14. #define DLGBORDER    GetSystemMetrics (SM_CXFRAME)*2
  15. /***************************************************************************
  16. *    FUNCTION: ConversionOptionsProc
  17. *
  18. * Fill Dlg with state information on WM_INITDIALOG.
  19. *  Take it back down and change internal state on WM_COMMAND, IDOK.
  20. *
  21. * Global variables:
  22. *  gMBFlags
  23. *  gWCFlags
  24. *  glpDefaultChar
  25. *  glpUsedDefaultChar
  26. *
  27. ***************************************************************************/
  28. LRESULT CALLBACK ConversionOptionsProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  29. {
  30.   switch (message) {
  31.     /******************************************************************
  32.     *  WM_INITDIALOG
  33.     *
  34.     * Set radio buttons appropriately.
  35.     ******************************************************************/
  36.     case WM_INITDIALOG:
  37.       if (gMBFlags & MB_PRECOMPOSED)
  38.         SendDlgItemMessage (hwnd, DID_PRECOMPOSED, BM_SETCHECK, 1, 0);
  39.       if (gMBFlags & MB_COMPOSITE)
  40.         SendDlgItemMessage (hwnd, DID_COMPOSITE, BM_SETCHECK, 1, 0);
  41.       if (gMBFlags & MB_USEGLYPHCHARS)
  42.         SendDlgItemMessage (hwnd, DID_USEGLYPHCHARS, BM_SETCHECK, 1, 0);
  43.       if (gWCFlags & WC_COMPOSITECHECK)
  44.         SendDlgItemMessage (hwnd, DID_COMPOSITECHECK, BM_SETCHECK, 1, 0);
  45.       if (gWCFlags & WC_DISCARDNS)
  46.         SendDlgItemMessage (hwnd, DID_DISCARDNS, BM_SETCHECK, 1, 0);
  47.       if (gWCFlags & WC_SEPCHARS)
  48.         SendDlgItemMessage (hwnd, DID_SEPCHARS, BM_SETCHECK, 1, 0);
  49.       if (gWCFlags & WC_DEFAULTCHAR)
  50.         SendDlgItemMessage (hwnd, DID_DEFAULTCHAR, BM_SETCHECK, 1, 0);
  51.       SendDlgItemMessage (hwnd, DID_EFDEFAULTCHAR, EM_LIMITTEXT, 1, 0);
  52.       SetDlgItemTextA (hwnd, DID_EFDEFAULTCHAR, glpDefaultChar);
  53.       if (gUsedDefaultChar)
  54.         SendDlgItemMessage (hwnd, DID_USEDDEFAULTCHAR, BM_SETCHECK, 1, 0);
  55.       SetFocus (GetDlgItem (hwnd, IDOK));
  56.     return FALSE;
  57.     case WM_COMMAND:
  58.       switch (LOWORD (wParam)) {
  59.         case IDCANCEL:
  60.           EndDialog (hwnd, FALSE);
  61.         break;
  62.         /******************************************************************
  63.         *  WM_COMMAND, IDOK
  64.         *
  65.         * Get state from radio buttons and others.
  66.         ******************************************************************/
  67.         case IDOK: {
  68.           if (SendDlgItemMessage(hwnd, DID_PRECOMPOSED, BM_GETCHECK, 0,0))
  69.             gMBFlags |= MB_PRECOMPOSED;
  70.           else
  71.             gMBFlags &= ~MB_PRECOMPOSED;
  72.           if (SendDlgItemMessage(hwnd, DID_COMPOSITE, BM_GETCHECK, 0,0))
  73.             gMBFlags |= MB_COMPOSITE;
  74.           else
  75.             gMBFlags &= ~MB_COMPOSITE;
  76.           if (SendDlgItemMessage(hwnd, DID_USEGLYPHCHARS, BM_GETCHECK, 0,0))
  77.             gMBFlags |= MB_USEGLYPHCHARS;
  78.           else
  79.             gMBFlags &= ~MB_USEGLYPHCHARS;
  80.           if (SendDlgItemMessage(hwnd, DID_DISCARDNS, BM_GETCHECK, 0,0))
  81.             gWCFlags |= WC_DISCARDNS;
  82.           else
  83.             gWCFlags &= ~WC_DISCARDNS;
  84.           if (SendDlgItemMessage(hwnd, DID_COMPOSITECHECK, BM_GETCHECK, 0,0))
  85.             gWCFlags |= WC_COMPOSITECHECK;
  86.           else
  87.             gWCFlags &= ~WC_COMPOSITECHECK;
  88.           if (SendDlgItemMessage(hwnd, DID_SEPCHARS, BM_GETCHECK, 0,0))
  89.             gWCFlags |= WC_SEPCHARS;
  90.           else
  91.             gWCFlags &= ~WC_SEPCHARS;
  92.           if (SendDlgItemMessage(hwnd, DID_DEFAULTCHAR, BM_GETCHECK, 0,0))
  93.             gWCFlags |= WC_DEFAULTCHAR;
  94.           else
  95.             gWCFlags &= ~WC_DEFAULTCHAR;
  96.           GetDlgItemTextA (hwnd, DID_EFDEFAULTCHAR, glpDefaultChar, 2); // CHAR + NULL
  97.           EndDialog (hwnd, TRUE);
  98.         } break;
  99.         /******************************************************************
  100.         *  WM_COMMAND, DID_*
  101.         *
  102.         * Manage radio button pattern.
  103.         ******************************************************************/
  104.         case DID_PRECOMPOSED:
  105.           SendDlgItemMessage (hwnd, DID_PRECOMPOSED, BM_SETCHECK, TRUE, 0);
  106.           SendDlgItemMessage (hwnd, DID_COMPOSITE,   BM_SETCHECK, FALSE, 0);
  107.         break;
  108.         case DID_COMPOSITE:
  109.           SendDlgItemMessage (hwnd, DID_PRECOMPOSED, BM_SETCHECK, FALSE, 0);
  110.           SendDlgItemMessage (hwnd, DID_COMPOSITE,   BM_SETCHECK, TRUE, 0);
  111.         break;
  112.       }
  113.     break; /* end WM_COMMAND */
  114.     case WM_SYSCOMMAND:
  115.       if (LOWORD (wParam) == SC_CLOSE)
  116.           EndDialog (hwnd, FALSE);
  117.     break;
  118.   } /* end switch */
  119.   return FALSE;
  120. }
  121. /***************************************************************************
  122. *    FUNCTION: SourceOptionsProc
  123. *
  124. * Fill Dlg with state information on WM_INITDIALOG.
  125. *  Take it back down and change internal state on WM_COMMAND, IDOK.
  126. *
  127. * Global variables:
  128. *   gTypeSource
  129. *   giSourceCodePage
  130. *   giDestinationCodePage
  131. *
  132. ***************************************************************************/
  133. LRESULT CALLBACK SourceOptionsProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  134. {
  135. TCHAR buffer[50];
  136.   switch (message) {
  137.     /******************************************************************
  138.     *  WM_INITDIALOG
  139.     *
  140.     * Set radio buttons appropriately.
  141.     ******************************************************************/
  142.     case WM_INITDIALOG:
  143.       SetWindowText (hwnd, LoadResourceString(IDS_INTERPRET_SOURCE_AS));
  144.       ListInstalledTables (GetDlgItem (hwnd, DID_CODEPAGELIST),CB_ADDSTRING, TRUE);
  145.       if (gTypeSource == TYPEUNICODE)
  146.         SendDlgItemMessage (hwnd, DID_RBUNICODE, BM_SETCHECK, 1, 0);
  147.       /*
  148.        * if gTypeSource == TYPECODEPAGE, then see if it is one of the
  149.        *  standard radio buttons.  If so, check the right one.
  150.        *  if not, check, "other" and select correct entry in combobox.
  151.        */
  152.       else if (gTypeSource == TYPECODEPAGE) {
  153.         if (giSourceCodePage == GetACP())
  154.           SendDlgItemMessage (hwnd, DID_RBANSICP, BM_SETCHECK, 1, 0);
  155.         else if (giSourceCodePage == GetOEMCP())
  156.           SendDlgItemMessage (hwnd, DID_RBOEMCP, BM_SETCHECK, 1, 0);
  157.         else {
  158.           SendDlgItemMessage (hwnd, DID_RBOTHERCP, BM_SETCHECK, 1, 0);
  159.           wsprintf (buffer, TEXT("%d"), giSourceCodePage);
  160.           SendDlgItemMessage (hwnd, DID_CODEPAGELIST, CB_SELECTSTRING, 0, (LPARAM)buffer);
  161.         }
  162.       } else {
  163.         // OK to not be specified here.  Wait for user to make choice.
  164.       }
  165.       SetFocus (GetDlgItem (hwnd, IDOK));
  166.     return FALSE;
  167.     case WM_COMMAND:
  168.       switch (LOWORD (wParam)) {
  169.         case IDCANCEL:
  170.           EndDialog (hwnd, FALSE);
  171.         break;
  172.         /******************************************************************
  173.         *  WM_COMMAND, IDOK
  174.         *
  175.         * Get state from radio buttons and others.
  176.         ******************************************************************/
  177.         case IDOK: {
  178.           BOOL success;
  179.           if (SendDlgItemMessage(hwnd, DID_RBUNICODE, BM_GETCHECK, 0,0)) {
  180.             gTypeSource = TYPEUNICODE;
  181.           } else if (SendDlgItemMessage(hwnd, DID_RBANSICP, BM_GETCHECK, 0,0)) {
  182.             gTypeSource = TYPECODEPAGE;
  183.             giSourceCodePage=GetACP();
  184.           } else if (SendDlgItemMessage(hwnd, DID_RBOEMCP, BM_GETCHECK, 0,0)) {
  185.             gTypeSource = TYPECODEPAGE;
  186.             giSourceCodePage=GetOEMCP();
  187.           } else if (SendDlgItemMessage(hwnd, DID_RBOTHERCP, BM_GETCHECK, 0,0)) {
  188.             gTypeSource = TYPECODEPAGE;
  189.             giSourceCodePage=GetDlgItemInt (hwnd, DID_CODEPAGELIST, &success, FALSE);
  190.           } else
  191.             gTypeSource = TYPEUNKNOWN;
  192.           EndDialog (hwnd, TRUE);
  193.         } break;
  194.       }
  195.     break; /* end WM_COMMAND */
  196.     case WM_SYSCOMMAND:
  197.       if (LOWORD (wParam) == SC_CLOSE)
  198.           EndDialog (hwnd, FALSE);
  199.     break;
  200.   } /* end switch */
  201.   return FALSE;
  202. }
  203. /***************************************************************************
  204. *    FUNCTION: DestinationOptionsProc
  205. *
  206. * Fill Dlg with state information on WM_INITDIALOG.
  207. *  Take it back down and change internal state on WM_COMMAND, IDOK.
  208. *
  209. *
  210. * Global variables:
  211. *   gTypeSource
  212. *   giSourceCodePage
  213. *   giDestinationCodePage
  214. *
  215. ***************************************************************************/
  216. LRESULT CALLBACK DestinationOptionsProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  217. {
  218. TCHAR buffer[50];
  219.   switch (message) {
  220.     /******************************************************************
  221.     *  WM_INITDIALOG
  222.     *
  223.     * Set radio buttons appropriately.
  224.     ******************************************************************/
  225.     case WM_INITDIALOG:
  226.       SetWindowText (hwnd, LoadResourceString(IDS_CONVERT_DEST_TO));
  227.       ListInstalledTables (GetDlgItem (hwnd, DID_CODEPAGELIST),CB_ADDSTRING, TRUE);
  228.       /* if source is unicode, destination will be code page. */
  229.       if (gTypeSource == TYPEUNICODE) {
  230.         EnableWindow (GetDlgItem (hwnd, DID_RBUNICODE), FALSE);
  231.         if (giDestinationCodePage == GetACP())
  232.           SendDlgItemMessage (hwnd, DID_RBANSICP, BM_SETCHECK, 1, 0);
  233.         else if (giDestinationCodePage == GetOEMCP())
  234.           SendDlgItemMessage (hwnd, DID_RBOEMCP, BM_SETCHECK, 1, 0);
  235.         else {
  236.           SendDlgItemMessage (hwnd, DID_RBOTHERCP, BM_SETCHECK, 1, 0);
  237.           wsprintf (buffer, TEXT("%d"), giDestinationCodePage);
  238.           SendDlgItemMessage (hwnd, DID_CODEPAGELIST, CB_SELECTSTRING, 0, (LPARAM)buffer);
  239.         }
  240.       /* otherwise destination is unicode, so disable most of the checkboxes. */
  241.       } else if (gTypeSource == TYPECODEPAGE) {
  242.         SendDlgItemMessage (hwnd, DID_RBUNICODE, BM_SETCHECK, 1, 0);
  243.         EnableWindow (GetDlgItem (hwnd, DID_RBANSICP), FALSE);
  244.         EnableWindow (GetDlgItem (hwnd, DID_RBOEMCP), FALSE);
  245.         EnableWindow (GetDlgItem (hwnd, DID_RBOTHERCP), FALSE);
  246.         EnableWindow (GetDlgItem (hwnd, DID_CODEPAGELIST), FALSE);
  247.       } else {
  248.         EndDialog (hwnd, FALSE);  // shouldn't get here.
  249.       }
  250.       SetFocus (GetDlgItem (hwnd, IDOK));
  251.     return FALSE;
  252.     case WM_COMMAND:
  253.       switch (LOWORD (wParam)) {
  254.         case IDCANCEL:
  255.           EndDialog (hwnd, FALSE);
  256.         break;
  257.         /******************************************************************
  258.         *  WM_COMMAND, IDOK
  259.         *
  260.         * Get state from radio buttons and others.
  261.         ******************************************************************/
  262.         case IDOK: {
  263.           BOOL success;
  264.           if (SendDlgItemMessage(hwnd, DID_RBUNICODE, BM_GETCHECK, 0,0)) {
  265.             // Do nothing. gTypeSource already implies dest <-> unicode.
  266.           } else if (SendDlgItemMessage(hwnd, DID_RBANSICP, BM_GETCHECK, 0,0)) {
  267.             giDestinationCodePage=GetACP();
  268.           } else if (SendDlgItemMessage(hwnd, DID_RBOEMCP, BM_GETCHECK, 0,0)) {
  269.             giDestinationCodePage=GetOEMCP();
  270.           } else if (SendDlgItemMessage(hwnd, DID_RBOTHERCP, BM_GETCHECK, 0,0)) {
  271.             giDestinationCodePage=GetDlgItemInt (hwnd, DID_CODEPAGELIST, &success, FALSE);
  272.           }
  273.           EndDialog (hwnd, TRUE);
  274.         } break;
  275.       }
  276.     break; /* end WM_COMMAND */
  277.     case WM_SYSCOMMAND:
  278.       if (LOWORD (wParam) == SC_CLOSE)
  279.           EndDialog (hwnd, FALSE);
  280.     break;
  281.   } /* end switch */
  282.   return FALSE;
  283. }
  284. /***************************************************************************
  285. *    FUNCTION: ViewSourceProc
  286. *
  287. * Fill Text, Name, and Type information into the dialog.
  288. *  Set a proper font to display the text depending on what type it is.
  289. *
  290. ***************************************************************************/
  291. LRESULT CALLBACK ViewSourceProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  292. {
  293. RECT rect;
  294.   switch (message) {
  295.     /******************************************************************
  296.     *  WM_INITDIALOG
  297.     ******************************************************************/
  298.     case WM_INITDIALOG:
  299.       /* Text is unicode... use *W() variants of functions. */
  300.       if (gTypeSource == TYPEUNICODE) {
  301.         WCHAR buffer[MAX_PATH];
  302.         LOGFONTW logfont;
  303.         HFONT hFont;
  304.         SetWindowTextW (GetDlgItem (hwnd, DID_TEXT), (LPCWSTR)pSourceData);
  305.         GetWindowTextW (hwndName0, buffer, MAX_PATH);
  306.         SetWindowTextW (GetDlgItem (hwnd, DID_NAME), buffer);
  307.         GetWindowTextW (hwndCodePage0, buffer, MAX_PATH);
  308.         SetWindowTextW (GetDlgItem (hwnd, DID_TYPE), buffer);
  309.         GetObjectW (GetStockObject (SYSTEM_FONT), sizeof(LOGFONTW), &logfont);
  310.         logfont.lfCharSet = UNICODE_CHARSET;
  311.         lstrcpyW (logfont.lfFaceName, L"Lucida Sans Unicode");
  312.         hFont = CreateFontIndirectW (&logfont);
  313.         SendMessageW (GetDlgItem (hwnd, DID_TEXT), WM_SETFONT, (WPARAM) hFont, 0);
  314.       /* Text is codepage... use *A() variants of functions. */
  315.       } else {
  316.         char buffer[MAX_PATH];
  317.         LOGFONTA logfont;
  318.         HFONT hFont;
  319.         SetWindowTextA (GetDlgItem (hwnd, DID_TEXT), pSourceData);
  320.         GetWindowTextA (hwndName0, buffer, MAX_PATH);
  321.         SetWindowTextA (GetDlgItem (hwnd, DID_NAME), buffer);
  322.         GetWindowTextA (hwndCodePage0, buffer, MAX_PATH);
  323.         SetWindowTextA (GetDlgItem (hwnd, DID_TYPE), buffer);
  324.         GetObjectA (GetStockObject (SYSTEM_FONT), sizeof(LOGFONTA), &logfont);
  325.         logfont.lfCharSet = giSourceCodePage;
  326.         lstrcpyA (logfont.lfFaceName, "System");
  327.         hFont = CreateFontIndirectA (&logfont);
  328.         SendMessageA (GetDlgItem (hwnd, DID_TEXT), WM_SETFONT, (WPARAM) hFont, 0);
  329.       }
  330.       SetWindowText (hwnd, LoadResourceString(IDS_VIEW_SOURCE_TITLE));
  331.       GetClientRect (hwnd, &rect);
  332.       SendMessage (hwnd, WM_SIZE, 0,
  333.                  MAKELPARAM ((rect.right - rect.left), (rect.bottom - rect.top)));
  334.       return TRUE;
  335.     break;
  336.     case WM_SIZE: {
  337.       HWND hwndText;
  338.       hwndText = GetDlgItem (hwnd, DID_TEXT);
  339.       MoveWindow (hwndText, DLGBORDER, 60, (int) LOWORD(lParam) - 2*DLGBORDER,
  340.                                 (int) HIWORD(lParam) - 60 - DLGBORDER , TRUE);
  341.     }
  342.     case WM_COMMAND:
  343.       switch (LOWORD (wParam)) {
  344.         case IDCANCEL:
  345.         case IDOK:
  346.           EndDialog (hwnd, TRUE);
  347.       }
  348.     break; /* end WM_COMMAND */
  349.     case WM_SYSCOMMAND:
  350.       if (LOWORD (wParam) == SC_CLOSE)
  351.           EndDialog (hwnd, FALSE);
  352.     break;
  353.   } /* end switch */
  354.   return FALSE;
  355. }
  356. /***************************************************************************
  357. *    FUNCTION: ViewDestinationProc
  358. *
  359. * Fill Text, Name, and Type information into the dialog.
  360. *  Set a proper font to display the text depending on what type it is.
  361. *
  362. ***************************************************************************/
  363. LRESULT CALLBACK ViewDestinationProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  364. {
  365. RECT rect;
  366.   switch (message) {
  367.     /******************************************************************
  368.     *  WM_INITDIALOG
  369.     ******************************************************************/
  370.     case WM_INITDIALOG:
  371.       /* Destination text is unicode... use *W() variants of functions. */
  372.       if (gTypeSource != TYPEUNICODE) {
  373.         WCHAR buffer[MAX_PATH];
  374.         LOGFONTW logfont;
  375.         HFONT hFont;
  376.         SetWindowTextW (GetDlgItem (hwnd, DID_TEXT), (LPCWSTR)pDestinationData);
  377.         GetWindowTextW (hwndName1, buffer, MAX_PATH);
  378.         SetWindowTextW (GetDlgItem (hwnd, DID_NAME), buffer);
  379.         GetWindowTextW (hwndCodePage1, buffer, MAX_PATH);
  380.         SetWindowTextW (GetDlgItem (hwnd, DID_TYPE), buffer);
  381.         GetObjectW (GetStockObject (SYSTEM_FONT), sizeof(LOGFONTW), &logfont);
  382.         logfont.lfCharSet = UNICODE_CHARSET;
  383.         lstrcpyW (logfont.lfFaceName, L"Lucida Sans Unicode");
  384.         hFont = CreateFontIndirectW (&logfont);
  385.         SendMessageW (GetDlgItem (hwnd, DID_TEXT), WM_SETFONT, (WPARAM) hFont, 0);
  386.       /* Destination text is codepage... use *A() variants of functions. */
  387.       } else {
  388.         char buffer[MAX_PATH];
  389.         LOGFONTA logfont;
  390.         HFONT hFont;
  391.         SetWindowTextA (GetDlgItem (hwnd, DID_TEXT), pDestinationData);
  392.         GetWindowTextA (hwndName1, buffer, MAX_PATH);
  393.         SetWindowTextA (GetDlgItem (hwnd, DID_NAME), buffer);
  394.         GetWindowTextA (hwndCodePage1, buffer, MAX_PATH);
  395.         SetWindowTextA (GetDlgItem (hwnd, DID_TYPE), buffer);
  396.         GetObjectA (GetStockObject (SYSTEM_FONT), sizeof(LOGFONTA), &logfont);
  397.         logfont.lfCharSet = giDestinationCodePage;
  398.         lstrcpyA (logfont.lfFaceName, "System");
  399.         hFont = CreateFontIndirectA (&logfont);
  400.         SendMessageA (GetDlgItem (hwnd, DID_TEXT), WM_SETFONT, (WPARAM) hFont, 0);
  401.       }
  402.       SetWindowText (hwnd, LoadResourceString(IDS_VIEW_DEST_TITLE));
  403.       GetClientRect (hwnd, &rect);
  404.       SendMessage (hwnd, WM_SIZE, 0,
  405.                  MAKELPARAM ((rect.right - rect.left),(rect.bottom - rect.top)));
  406.       return TRUE;
  407.     break;
  408.     case WM_SIZE: {
  409.       HWND hwndText;
  410.       hwndText = GetDlgItem (hwnd, DID_TEXT);
  411.       MoveWindow (hwndText, DLGBORDER, 60, (int) LOWORD(lParam) - 2*DLGBORDER,
  412.                                 (int) HIWORD(lParam) - 60 - DLGBORDER , TRUE);
  413.     }
  414.     case WM_COMMAND:
  415.       switch (LOWORD (wParam)) {
  416.         case IDCANCEL:
  417.         case IDOK:
  418.           EndDialog (hwnd, TRUE);
  419.       }
  420.     break; /* end WM_COMMAND */
  421.     case WM_SYSCOMMAND:
  422.       if (LOWORD (wParam) == SC_CLOSE)
  423.           EndDialog (hwnd, FALSE);
  424.     break;
  425.   } /* end switch */
  426.   return FALSE;
  427. }