英語で読む

次の方法で共有


CMainWindow

Microsoft Windows オペレーティング システムは、次のユーザー アクションを標準ウィンドウ メッセージに変換し、StoClien アプリケーションのメインプロシージャに送信します。

  • ユーザーがマウスの左ボタン、またはタブレット デバイスのペン先スイッチをクリックして、線の描画シーケンスを開始します。
  • ユーザーはボタンをクリックして押したままにし、マウスを移動して線を描画します。
  • マウスの左ボタンが離されると、シーケンスは終了します。

次のコード例は、この手順を示しています。

CMainWindow::WindowProc (STOCLIEN.CPP)

LRESULT CMainWindow::WindowProc(
            UINT uMsg,
            WPARAM wParam,
            LPARAM lParam)
  {
    LRESULT lResult = FALSE;

    switch (uMsg)
    {
      case WM_CREATE:
        break;

      case WM_ACTIVATE:
        // A mouse click reactivates the paint procedure.
        // This is used to paint a new window when a user
        // selects a portion of the STOCLIEN window that is 
        // visible beneath another window. This message is  
        // sent in the WindowProc handle.
        if (WA_CLICKACTIVE == LOWORD(wParam))
          m_pGuiPaper->PaintWin();
        lResult = ::DefWindowProc(m_hWnd, uMsg, wParam, lParam);
        break;

      case WM_SIZE:
        // Handle a resize of this window.
        m_wWidth = LOWORD(lParam);
        m_wHeight = HIWORD(lParam);
        // Inform CGuiPaper of the change.
        m_pGuiPaper->Resize(m_wWidth, m_wHeight);
        break;

      case WM_PAINT:
        // This is a message to repaint the window.
        {
          PAINTSTRUCT ps;

          if(BeginPaint(m_hWnd, &ps))
            EndPaint(m_hWnd, &ps);

          m_pGuiPaper->PaintWin();
        }
        break;

      case WM_LBUTTONDOWN:
        // Start sequence of ink drawing to the paper.
        m_pGuiPaper->InkStart(LOWORD(lParam), HIWORD(lParam));
        break;

      case WM_MOUSEMOVE:
        // Draw inking sequence data.
        m_pGuiPaper->InkDraw(LOWORD(lParam), HIWORD(lParam));
        break;

      case WM_LBUTTONUP:
        // Stop an ink drawing sequence.
        m_pGuiPaper->InkStop(LOWORD(lParam), HIWORD(lParam));
        break;

      case WM_COMMAND:
        // Dispatch and handle any Menu command messages received.
        lResult = DoMenu(wParam, lParam);
        break;

      case WM_CHAR:
        if (wParam == 0x1b)
        {
          // Exit this application if user presses the ESC key.
          ::PostMessage(m_hWnd, WM_CLOSE, 0, 0);
        }
        break;

      case WM_CLOSE:
        // The user selected Close on the main window System menu
        // or Exit on the File menu.
        // If there is unsaved ink data, then prompt
        // the user. If the user cancels, do not close the window.
        if (IDCANCEL == m_pGuiPaper->AskSave())
          break;
      case WM_QUIT:
        // When exiting the application, close any associated help
        // windows.
        // ::WinHelp(m_hWnd, m_szHelpFile, HELP_QUIT, 0);
      default:
        // If there are any messages that have not been handled,
        // send them to the default window procedure.
        lResult = ::DefWindowProc(m_hWnd, uMsg, wParam, lParam);
        break;
    }

    return(lResult);
  }

WM_LBUTTONDOWN メッセージがマウス位置データを配信すると、線描画シーケンスが開始されます。

CMainWindow には CGuiPaper オブジェクトへのポインターがあり、 CGuiPaper::InkStart メソッドを呼び出して線描画シーケンスを開始します。

マウスを移動して描画すると、マウス位置データを含む個別の WM_MOUSEMOVE メッセージのシーケンスが CGuiPaper::InkDraw メソッドに提供されます。

マウスの左ボタンが離されると、 WM_LBUTTONUP メッセージが受信されます。 CGuiPaper::InkStop メソッドは、線の描画シーケンスを停止します。