InputIntDlg.cpp

C:\home\SVGCats_src\src\InputIntDlg.cpp

[関数 | マクロ]

関数一覧

マクロ一覧


   1|// InputIntDlg.cpp : インプリメンテーション ファイル 
   2|//
   3|
   4|#include "mixer_precomp.h"
   5|#ifdef  USES_MXP_AUTOINC
   6| #include  "SVGCat.ah"
   7|#endif
   8|
   9|#include <imm.h>
  10|
  11|
  12|#ifdef _DEBUG
  13|#define new DEBUG_NEW
  14|#undef THIS_FILE
  15|static char THIS_FILE[] = __FILE__;
  16|#endif
  17|
  18|/////////////////////////////////////////////////////////////////////////////
  19|// CInputIntDlg ダイアログ
  20|
  21|
  22|CInputIntDlg::CInputIntDlg(CWnd* pParent /*=NULL*/)
  23|  : CDialog(CInputIntDlg::IDD, pParent)
  24|{
  25|  //{{AFX_DATA_INIT(CInputIntDlg)
  26|  m_Msg = _T("");
  27|  m_Value = 0;
  28|  //}}AFX_DATA_INIT
  29|  m_bSetAtCursor = true;
  30|  m_XY.x = 0;  m_XY.y = 0;
  31|  m_PenInputPanel = NULL;
  32|}
  33|
  34|
  35|void CInputIntDlg::DoDataExchange(CDataExchange* pDX)
  36|{
  37|  CDialog::DoDataExchange(pDX);
  38|  //{{AFX_DATA_MAP(CInputIntDlg)
  39|  DDX_Control(pDX, IDC_Spin, m_Spin);
  40|  DDX_Control(pDX, IDC_Value, m_ValueCtrl);
  41|  DDX_Text(pDX, IDC_Msg, m_Msg);
  42|  DDX_Text(pDX, IDC_Value, m_Value);
  43|  DDX_Control(pDX, IDC_Value2, m_Value2Ctrl);
  44|  //}}AFX_DATA_MAP
  45|}
  46|
  47|
  48|BEGIN_MESSAGE_MAP(CInputIntDlg, CDialog)
  49|  //{{AFX_MSG_MAP(CInputIntDlg)
  50|  ON_EN_CHANGE(IDC_Value, OnChangeValue)
  51|  ON_WM_ACTIVATE()
  52|  //}}AFX_MSG_MAP
  53|END_MESSAGE_MAP()
  54|
  55|BEGIN_EVENTSINK_MAP(CInputIntDlg, CDialog)
  56|    //{{AFX_EVENTSINK_MAP(CInputIntDlg)
  57|  ON_EVENT(CInputIntDlg, IDC_Value2, 1 /* Change */, OnChangeValue2, VTS_NONE)
  58|	ON_EVENT(CInputIntDlg, IDC_Value2, 4 /* KeyUp */, OnKeyUpValue2, VTS_PI4 VTS_I2)
  59|	//}}AFX_EVENTSINK_MAP
  60|END_EVENTSINK_MAP()
  61|
  62|
  63|/////////////////////////////////////////////////////////////////////////////
  64|// CInputIntDlg メッセージ ハンドラ
  65|
  66|
  67|BOOL CInputIntDlg::OnInitDialog()
  68|{
  69|  CDialog::OnInitDialog();
  70|
  71|  CString  s;
  72|  RECT   rect;
  73|  POINT  point;
  74|  int  w, h;
  75|  int  scr_w = GetSystemMetrics( SM_CXFULLSCREEN );
  76|  int  scr_h = GetSystemMetrics( SM_CYFULLSCREEN );
  77|
  78|
  79|  /* ペン入力パネルを設定する */
  80|  if ( m_PenInputPanel != NULL ) {
  81|    BSTR  s;
  82|    HRESULT  hr;
  83|
  84|    hr = m_PenInputPanel->put_AttachedEditWindow( (LONG_PTR)m_Value2Ctrl.GetHwnd() );
  85|    if ( hr != 0 )  error();
  86|
  87|    s = SysAllocString( OLESTR("DIGIT") );
  88|    hr = m_PenInputPanel->put_Factoid( s );
  89|    SysFreeString( s );
  90|    if ( hr != 0 )  error();
  91|
  92|    hr = m_PenInputPanel->EnableTsf( VARIANT_TRUE );
  93|    if ( hr != 0 )  error();
  94|
  95|    hr = m_PenInputPanel->put_AutoShow( VARIANT_FALSE );
  96|    if ( hr != 0 )  error();
  97|
  98|    hr = m_PenInputPanel->put_HorizontalOffset( -40 );
  99|    if ( hr != 0 )  error();
 100|    hr = m_PenInputPanel->put_VerticalOffset( 47 );
 101|    if ( hr != 0 )  error();
 102|  }
 103|
 104|
 105|  /* テキストボックスの初期化をする */
 106|  if ( m_PenInputPanel == NULL ) {
 107|    m_ValueCtrl.SetFocus();
 108|    m_ValueCtrl.GetWindowText( s );
 109|    m_ValueCtrl.SetSel( 0, s.GetLength() );
 110|  }
 111|  else {
 112|    char  ss[16];
 113|
 114|    sprintf( ss, "%d", m_Value );
 115|    m_Value2Ctrl.SetText( ss );
 116|    m_Value2Ctrl.SetFocus();
 117|    m_Value2Ctrl.SetSelStart( 0 );
 118|    m_Value2Ctrl.SetSelLength( strlen(ss) );
 119|  }
 120|
 121|  m_Spin.SetBuddy( &m_ValueCtrl );
 122|  m_Spin.SetRange32( m_Min, m_Max );
 123|
 124|  GetWindowRect( &rect );
 125|  if ( m_bSetAtCursor ) {
 126|    GetCursorPos( &point );
 127|    point.x += 0;  point.y += 80;
 128|  }
 129|  else {
 130|    point.x = m_XY.x;  point.y = m_XY.y;
 131|  }
 132|  w = rect.right - rect.left;   h = rect.bottom - rect.top;
 133|  rect.left = point.x - w / 2;  rect.right = rect.left + w;
 134|  rect.top = point.y - h / 2;   rect.bottom = rect.top + h;
 135|  if ( rect.right >= scr_w )  { rect.left -= rect.right - scr_w;  rect.right = scr_w; }
 136|  if ( rect.bottom >= scr_h )  { rect.top -= rect.bottom - scr_h;  rect.bottom = scr_h; }
 137|  if ( rect.left < 0 )  { rect.right += -rect.left;  rect.left = 0; }
 138|  if ( rect.top < 0 )  { rect.bottom += -rect.top;  rect.top = 0; }
 139|  MoveWindow( &rect );
 140|
 141|  ImmAssociateContext( m_ValueCtrl.m_hWnd, NULL ); /* 日本語入力を不可にする, imm.h, imm32.lib */
 142|  ImmAssociateContext( m_Value2Ctrl.m_hWnd, NULL );
 143|
 144|  m_ValueCtrl.ShowWindow( m_PenInputPanel == NULL ? SW_SHOW : SW_HIDE );
 145|  m_Value2Ctrl.ShowWindow( m_PenInputPanel == NULL ? SW_HIDE : SW_SHOW );
 146|
 147|  return TRUE;  // コントロールにフォーカスを設定しないとき、戻り値は TRUE となります
 148|                // 例外: OCX プロパティ ページの戻り値は FALSE となります
 149|}
 150|
 151|
 152|void CInputIntDlg::OnChangeValue()
 153|{
 154|  if ( m_PenInputPanel != NULL && ::GetFocus() == m_ValueCtrl.m_hWnd ) {
 155|    if ( m_PenInputPanel != NULL ) {
 156|      CString s;
 157|
 158|      m_ValueCtrl.GetWindowText( s );
 159|      m_Value2Ctrl.SetText( s );
 160|    }
 161|  }
 162|}
 163|
 164|void CInputIntDlg::OnChangeValue2()
 165|{
 166|  if ( m_PenInputPanel != NULL && ::GetFocus() == (HWND)m_Value2Ctrl.GetHwnd()  ) {
 167|    if ( m_PenInputPanel != NULL ) {
 168|      CString s;
 169|
 170|      s = m_Value2Ctrl.GetText();
 171|      m_ValueCtrl.SetWindowText( s );
 172|    }
 173|  }
 174|}
 175|
 176|
 177|void CInputIntDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
 178|{
 179|  CDialog::OnActivate(nState, pWndOther, bMinimized);
 180|
 181|  if ( nState == WA_ACTIVE || nState == WA_CLICKACTIVE ) {
 182|    if ( m_PenInputPanel != NULL ) {
 183|      HRESULT  hr;
 184|
 185|      m_Value2Ctrl.SetFocus();
 186|
 187|      hr = m_PenInputPanel->put_Visible( VARIANT_TRUE );
 188|      if ( hr != 0 )  return;  /* コントロールが準備できていない */
 189|    }
 190|  }
 191|}
 192|
 193|void CInputIntDlg::OnOK()
 194|{
 195|  if ( m_PenInputPanel != NULL ) {
 196|    VARIANT_BOOL  busy;
 197|    CString  s;
 198|
 199|    m_PenInputPanel->CommitPendingInput();
 200|    for (;;) {
 201|      m_PenInputPanel->get_Visible( &busy );
 202|      if ( ! busy )  break;
 203|      Sleep(50);
 204|    }
 205|
 206|    s = m_Value2Ctrl.GetText();
 207|    m_ValueCtrl.SetWindowText( s );
 208|  }
 209|
 210|  CDialog::OnOK();
 211|}
 212| 
 213|void CInputIntDlg::OnKeyUpValue2(long FAR* pKey, short ShiftKey) 
 214|{
 215|  CString s;
 216|
 217|  s = m_Value2Ctrl.GetText();
 218|  m_ValueCtrl.SetWindowText( s );
 219|}
 220| 
 221|BOOL CInputIntDlg::PreTranslateMessage(MSG* pMsg) 
 222|{
 223|  if ( pMsg->message == WM_KEYDOWN ) {
 224|    if ( pMsg->wParam == '\r' ) {
 225|      m_ValueCtrl.SetFocus();  /* これをしないと IPenInputPanel でしばらく固まる */
 226|      this->PostMessage( WM_COMMAND, IDOK );
 227|      return  TRUE;
 228|    }
 229|  }
 230|
 231|	return CDialog::PreTranslateMessage(pMsg);
 232|}
 233| 
 234|