dialogs.c

来自「<Win2k系统编程>源码.次数为国人自编,内容丰富,还是不错的.」· C语言 代码 · 共 531 行 · 第 1/2 页

C
531
字号
/**************************************************************************\
* dialogs.c -- dialog procedure support for uconvert
*
*         Steve Firebaugh
*         Microsoft Developer Support
*         Copyright (c) 1992-1997 Microsoft Corporation
*
\**************************************************************************/
#define UNICODE


#include <windows.h>
#include "uconvert.h"
#include "install.h"


/* Define affecting the positioning of child windows in dialog. */
#define DLGBORDER    GetSystemMetrics (SM_CXFRAME)*2


/***************************************************************************\
*    FUNCTION: ConversionOptionsProc
*
* Fill Dlg with state information on WM_INITDIALOG.
*  Take it back down and change internal state on WM_COMMAND, IDOK.
*
* Global variables:
*  gMBFlags
*  gWCFlags
*  glpDefaultChar
*  glpUsedDefaultChar
*
\***************************************************************************/
LRESULT CALLBACK ConversionOptionsProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

  switch (message) {

    /******************************************************************\
    *  WM_INITDIALOG
    *
    * Set radio buttons appropriately.
    \******************************************************************/
    case WM_INITDIALOG:
      if (gMBFlags & MB_PRECOMPOSED)
        SendDlgItemMessage (hwnd, DID_PRECOMPOSED, BM_SETCHECK, 1, 0);

      if (gMBFlags & MB_COMPOSITE)
        SendDlgItemMessage (hwnd, DID_COMPOSITE, BM_SETCHECK, 1, 0);

      if (gMBFlags & MB_USEGLYPHCHARS)
        SendDlgItemMessage (hwnd, DID_USEGLYPHCHARS, BM_SETCHECK, 1, 0);

      if (gWCFlags & WC_COMPOSITECHECK)
        SendDlgItemMessage (hwnd, DID_COMPOSITECHECK, BM_SETCHECK, 1, 0);

      if (gWCFlags & WC_DISCARDNS)
        SendDlgItemMessage (hwnd, DID_DISCARDNS, BM_SETCHECK, 1, 0);

      if (gWCFlags & WC_SEPCHARS)
        SendDlgItemMessage (hwnd, DID_SEPCHARS, BM_SETCHECK, 1, 0);

      if (gWCFlags & WC_DEFAULTCHAR)
        SendDlgItemMessage (hwnd, DID_DEFAULTCHAR, BM_SETCHECK, 1, 0);

      SendDlgItemMessage (hwnd, DID_EFDEFAULTCHAR, EM_LIMITTEXT, 1, 0);
      SetDlgItemTextA (hwnd, DID_EFDEFAULTCHAR, glpDefaultChar);

      if (gUsedDefaultChar)
        SendDlgItemMessage (hwnd, DID_USEDDEFAULTCHAR, BM_SETCHECK, 1, 0);


      SetFocus (GetDlgItem (hwnd, IDOK));
    return FALSE;


    case WM_COMMAND:
      switch (LOWORD (wParam)) {
        case IDCANCEL:
          EndDialog (hwnd, FALSE);
        break;

        /******************************************************************\
        *  WM_COMMAND, IDOK
        *
        * Get state from radio buttons and others.
        \******************************************************************/
        case IDOK: {

          if (SendDlgItemMessage(hwnd, DID_PRECOMPOSED, BM_GETCHECK, 0,0))
            gMBFlags |= MB_PRECOMPOSED;
          else
            gMBFlags &= ~MB_PRECOMPOSED;

          if (SendDlgItemMessage(hwnd, DID_COMPOSITE, BM_GETCHECK, 0,0))
            gMBFlags |= MB_COMPOSITE;
          else
            gMBFlags &= ~MB_COMPOSITE;

          if (SendDlgItemMessage(hwnd, DID_USEGLYPHCHARS, BM_GETCHECK, 0,0))
            gMBFlags |= MB_USEGLYPHCHARS;
          else
            gMBFlags &= ~MB_USEGLYPHCHARS;

          if (SendDlgItemMessage(hwnd, DID_DISCARDNS, BM_GETCHECK, 0,0))
            gWCFlags |= WC_DISCARDNS;
          else
            gWCFlags &= ~WC_DISCARDNS;

          if (SendDlgItemMessage(hwnd, DID_COMPOSITECHECK, BM_GETCHECK, 0,0))
            gWCFlags |= WC_COMPOSITECHECK;
          else
            gWCFlags &= ~WC_COMPOSITECHECK;

          if (SendDlgItemMessage(hwnd, DID_SEPCHARS, BM_GETCHECK, 0,0))
            gWCFlags |= WC_SEPCHARS;
          else
            gWCFlags &= ~WC_SEPCHARS;

          if (SendDlgItemMessage(hwnd, DID_DEFAULTCHAR, BM_GETCHECK, 0,0))
            gWCFlags |= WC_DEFAULTCHAR;
          else
            gWCFlags &= ~WC_DEFAULTCHAR;

          GetDlgItemTextA (hwnd, DID_EFDEFAULTCHAR, glpDefaultChar, 2); // CHAR + NULL

          EndDialog (hwnd, TRUE);
        } break;


        /******************************************************************\
        *  WM_COMMAND, DID_*
        *
        * Manage radio button pattern.
        \******************************************************************/
        case DID_PRECOMPOSED:
          SendDlgItemMessage (hwnd, DID_PRECOMPOSED, BM_SETCHECK, TRUE, 0);
          SendDlgItemMessage (hwnd, DID_COMPOSITE,   BM_SETCHECK, FALSE, 0);
        break;

        case DID_COMPOSITE:
          SendDlgItemMessage (hwnd, DID_PRECOMPOSED, BM_SETCHECK, FALSE, 0);
          SendDlgItemMessage (hwnd, DID_COMPOSITE,   BM_SETCHECK, TRUE, 0);
        break;

      }
    break; /* end WM_COMMAND */



    case WM_SYSCOMMAND:
      if (LOWORD (wParam) == SC_CLOSE)
          EndDialog (hwnd, FALSE);
    break;

  } /* end switch */
  return FALSE;
}



/***************************************************************************\
*    FUNCTION: SourceOptionsProc
*
* Fill Dlg with state information on WM_INITDIALOG.
*  Take it back down and change internal state on WM_COMMAND, IDOK.
*
* Global variables:
*   gTypeSource
*   giSourceCodePage
*   giDestinationCodePage
*
\***************************************************************************/
LRESULT CALLBACK SourceOptionsProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
TCHAR buffer[50];

  switch (message) {

    /******************************************************************\
    *  WM_INITDIALOG
    *
    * Set radio buttons appropriately.
    \******************************************************************/
    case WM_INITDIALOG:
      SetWindowText (hwnd, LoadResourceString(IDS_INTERPRET_SOURCE_AS));
      ListInstalledTables (GetDlgItem (hwnd, DID_CODEPAGELIST),CB_ADDSTRING, TRUE);
      if (gTypeSource == TYPEUNICODE)
        SendDlgItemMessage (hwnd, DID_RBUNICODE, BM_SETCHECK, 1, 0);

      /*
       * if gTypeSource == TYPECODEPAGE, then see if it is one of the
       *  standard radio buttons.  If so, check the right one.
       *  if not, check, "other" and select correct entry in combobox.
       */
      else if (gTypeSource == TYPECODEPAGE) {
        if (giSourceCodePage == GetACP())
          SendDlgItemMessage (hwnd, DID_RBANSICP, BM_SETCHECK, 1, 0);
        else if (giSourceCodePage == GetOEMCP())
          SendDlgItemMessage (hwnd, DID_RBOEMCP, BM_SETCHECK, 1, 0);
        else {
          SendDlgItemMessage (hwnd, DID_RBOTHERCP, BM_SETCHECK, 1, 0);
          wsprintf (buffer, TEXT("%d"), giSourceCodePage);
          SendDlgItemMessage (hwnd, DID_CODEPAGELIST, CB_SELECTSTRING, 0, (LPARAM)buffer);
        }
      } else {
        // OK to not be specified here.  Wait for user to make choice.
      }


      SetFocus (GetDlgItem (hwnd, IDOK));
    return FALSE;


    case WM_COMMAND:
      switch (LOWORD (wParam)) {
        case IDCANCEL:
          EndDialog (hwnd, FALSE);
        break;

        /******************************************************************\
        *  WM_COMMAND, IDOK
        *
        * Get state from radio buttons and others.
        \******************************************************************/
        case IDOK: {
          BOOL success;

          if (SendDlgItemMessage(hwnd, DID_RBUNICODE, BM_GETCHECK, 0,0)) {
            gTypeSource = TYPEUNICODE;
          } else if (SendDlgItemMessage(hwnd, DID_RBANSICP, BM_GETCHECK, 0,0)) {
            gTypeSource = TYPECODEPAGE;
            giSourceCodePage=GetACP();
          } else if (SendDlgItemMessage(hwnd, DID_RBOEMCP, BM_GETCHECK, 0,0)) {
            gTypeSource = TYPECODEPAGE;
            giSourceCodePage=GetOEMCP();
          } else if (SendDlgItemMessage(hwnd, DID_RBOTHERCP, BM_GETCHECK, 0,0)) {
            gTypeSource = TYPECODEPAGE;
            giSourceCodePage=GetDlgItemInt (hwnd, DID_CODEPAGELIST, &success, FALSE);
          } else
            gTypeSource = TYPEUNKNOWN;
          EndDialog (hwnd, TRUE);
        } break;
      }
    break; /* end WM_COMMAND */


    case WM_SYSCOMMAND:
      if (LOWORD (wParam) == SC_CLOSE)
          EndDialog (hwnd, FALSE);
    break;

  } /* end switch */
  return FALSE;
}

/***************************************************************************\
*    FUNCTION: DestinationOptionsProc
*
* Fill Dlg with state information on WM_INITDIALOG.
*  Take it back down and change internal state on WM_COMMAND, IDOK.
*
*
* Global variables:
*   gTypeSource
*   giSourceCodePage

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?