home *** CD-ROM | disk | FTP | other *** search
/ Tech Win 1999 February / TECH Win 02-1999 Disc A.iso / ols / lzh / csend1_s.lzh / csend / csendDlg.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1998-02-05  |  19.5 KB  |  624 lines

  1. // csendDlg.cpp : インプリメンテーション ファイル
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "csend.h"
  6. #include "csendDlg.h"
  7.  
  8. // Make -->
  9. #include "InputBox.h"    // 文字列登録用ダイアログのヘッダファイル
  10. // <--Make
  11.  
  12. #ifdef _DEBUG
  13. #define new DEBUG_NEW
  14. #undef THIS_FILE
  15. static char THIS_FILE[] = __FILE__;
  16. #endif
  17.  
  18. // Make-->
  19. #define WM_USER_NTFYICON    (WM_USER+531)    // タスクトレイアイコンからのメッセージ用
  20. // <--Make
  21.  
  22.  
  23. /////////////////////////////////////////////////////////////////////////////
  24. // アプリケーションのバージョン情報で使われている CAboutDlg ダイアログ
  25.  
  26. class CAboutDlg : public CDialog
  27. {
  28. public:
  29.     CAboutDlg();
  30.  
  31. // ダイアログ データ
  32.     //{{AFX_DATA(CAboutDlg)
  33.     enum { IDD = IDD_ABOUTBOX };
  34.     //}}AFX_DATA
  35.  
  36.     // ClassWizard は仮想関数を生成しオーバーライドします
  37.     //{{AFX_VIRTUAL(CAboutDlg)
  38. protected:
  39.     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV のサポート
  40.     //}}AFX_VIRTUAL
  41.  
  42. // インプリメンテーション
  43. protected:
  44.     //{{AFX_MSG(CAboutDlg)
  45.     //}}AFX_MSG
  46.     DECLARE_MESSAGE_MAP()
  47. };
  48.  
  49. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  50. {
  51.     //{{AFX_DATA_INIT(CAboutDlg)
  52.     //}}AFX_DATA_INIT
  53. }
  54.  
  55. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  56. {
  57.     CDialog::DoDataExchange(pDX);
  58.     //{{AFX_DATA_MAP(CAboutDlg)
  59.     //}}AFX_DATA_MAP
  60. }
  61.  
  62. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  63.     //{{AFX_MSG_MAP(CAboutDlg)
  64.         // メッセージ ハンドラがありません。
  65.     //}}AFX_MSG_MAP
  66. END_MESSAGE_MAP()
  67.  
  68. /////////////////////////////////////////////////////////////////////////////
  69. // CCsendDlg ダイアログ
  70.  
  71. CCsendDlg::CCsendDlg(CWnd* pParent /*=NULL*/)
  72.     : CDialog(CCsendDlg::IDD, pParent)
  73. {
  74.     //{{AFX_DATA_INIT(CCsendDlg)
  75.     //}}AFX_DATA_INIT
  76.     // メモ: LoadIcon は Win32 の DestroyIcon のサブシーケンスを要求しません。
  77.     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  78. }
  79.  
  80. void CCsendDlg::DoDataExchange(CDataExchange* pDX)
  81. {
  82.     CDialog::DoDataExchange(pDX);
  83.     //{{AFX_DATA_MAP(CCsendDlg)
  84.     DDX_Control(pDX, IDC_CLIST, m_CList);
  85.     //}}AFX_DATA_MAP
  86. }
  87.  
  88. BEGIN_MESSAGE_MAP(CCsendDlg, CDialog)
  89.     //{{AFX_MSG_MAP(CCsendDlg)
  90. // Wiz-->
  91.     ON_WM_SYSCOMMAND()        // システムメニュー等のメッセージを処理します
  92.     ON_WM_PAINT()            // WM_PAINT はウインドウの描画が必要時に呼ばれます
  93.     ON_WM_QUERYDRAGICON()    // ほとんど意識しなくても良いです
  94.     ON_WM_SIZE()            // ウインドウサイズが変更されたときに呼ばれます
  95.     ON_LBN_SELCHANGE(IDC_CLIST, OnSelchangeClist)    // リストボックスが選択されたとき呼ばれます
  96.     ON_LBN_DBLCLK(IDC_CLIST, OnDblclkClist)    // リストボックスの項目がダブルクリックされたときに呼ばれます
  97.     ON_WM_CLOSE()    // ウインドウを閉じるときに呼ばれます
  98.     ON_WM_DESTROY()    // ウインドウが破棄される前に呼ばれます
  99.     ON_WM_CONTEXTMENU()    // ウインドウ内で右クリックが押されたときに呼ばれます
  100.     ON_COMMAND(ID_ADDSTRING, OnAddstring)    // ON_COMMANDはメニューに対応します
  101.     ON_COMMAND(ID_CHANGE, OnChange)
  102.     ON_COMMAND(ID_DELETESTRING, OnDeletestring)
  103. // <--Wiz
  104.  
  105. // Make-->
  106.     ON_MESSAGE( WM_USER_NTFYICON, OnNotifyIconIvents )    // タスクトレイアイコンからのメッセージを処理します
  107. // <--Make
  108.  
  109.     //}}AFX_MSG_MAP
  110. END_MESSAGE_MAP()
  111.  
  112. /////////////////////////////////////////////////////////////////////////////
  113. // CCsendDlg メッセージ ハンドラ
  114.  
  115. // ダイアログボックスが表示される前に呼ばれます
  116. BOOL CCsendDlg::OnInitDialog()
  117. {
  118.     CDialog::OnInitDialog();
  119.  
  120.     // IDM_ABOUTBOX はコマンド メニューの範囲でなければなりません。
  121.     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  122.     ASSERT(IDM_ABOUTBOX < 0xF000);
  123.  
  124.     CMenu* pSysMenu = GetSystemMenu(FALSE);    // システムメニューを取得します
  125.     CString strMenu;
  126. // Make-->
  127.     pSysMenu->AppendMenu(MF_SEPARATOR);    //セパレータ
  128.  
  129.     strMenu.LoadString(IDS_ADDSTRING);        // 登録
  130.         pSysMenu->AppendMenu(MF_STRING, ID_ADDSTRING, strMenu);
  131.     strMenu.LoadString(IDS_CHANGESTRING);    // 変更
  132.         pSysMenu->AppendMenu(MF_STRING, ID_CHANGE, strMenu);
  133.     strMenu.LoadString(IDS_DELETESTRING);    // 削除
  134.         pSysMenu->AppendMenu(MF_STRING, ID_DELETESTRING, strMenu);
  135.  
  136.     pSysMenu->AppendMenu(MF_SEPARATOR);    // セパレータ
  137.  
  138.     strMenu.LoadString(IDS_HELP);            // ヘルプ
  139.         pSysMenu->AppendMenu(MF_STRING, ID_HELP, strMenu);
  140.     strMenu.LoadString(IDS_ABOUTBOX);        // AboutBox
  141.         pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strMenu);
  142. // <--Make
  143.     
  144.     // このダイアログ用のアイコンを設定します。フレームワークはアプリケーションのメイン
  145.     // ウィンドウがダイアログでない時は自動的に設定しません。
  146.     SetIcon(m_hIcon, TRUE);            // 大きいアイコンを設定
  147.     SetIcon(m_hIcon, FALSE);        // 小さいアイコンを設定
  148.     
  149.     // TODO: 特別な初期化を行う時はこの場所に追加してください。
  150. // Make-->
  151.     
  152.     // ファイルからウインドウのサイズと位置、リストを取得します
  153.     CString l_tmp;    // 行を読み込むための作業領域
  154.  
  155.     CString adds;    // リストの最後の(追加)メッセージ用です。この文字はリソースで変更できます
  156.     adds.LoadString( IDS_LISTADD );    // 「(追加)」
  157.  
  158.     CStdioFile savedata;    // セーブされているデータファイルを扱います
  159.     CString csSaveFileName;    // セーブされているファイル名を指定します、リソースで変更できます
  160.     csSaveFileName.LoadString( IDS_SAVEFILE );    // リソースからファイル名を取得します
  161.     if( savedata.Open( csSaveFileName,
  162.             CFile::modeRead | CFile::typeText ) ){    // 読み込み、テキストモードで開きます
  163.         if( savedata.ReadString( l_tmp ) ){    // 一行読み込み
  164.             // 一行目はサイズと位置が入っています
  165.             sscanf( l_tmp, "%04X%04X%04X%04X", &rect.top, &rect.left,
  166.                                 &rect.bottom, &rect.right );
  167.             MoveWindow( &rect );    // 取得した情報に従ってサイズと位置を変更します
  168.         }            
  169.         while( savedata.ReadString( l_tmp ) ){    // 行が有る間読み込みます
  170.             if( l_tmp != adds ){        // (追加)という文字で無ければ
  171.                 m_CList.AddString(l_tmp);    // リストに追加します
  172.             }
  173.         }
  174.         savedata.Close();        // ファイルを閉じます
  175.     }
  176.     
  177.     m_CList.InsertString(-1,adds);    // リストの最後に(追加)を加えます
  178.  
  179.     // ツールが使いやすいように常に手前に表示します
  180.     SetWindowPos( &wndTopMost, 0,0,0,0, SWP_NOSIZE | SWP_NOMOVE );
  181.  
  182.     //////////////////////////////////    // アイコンをタスクトレイに表示します。
  183.     m_stNtfyIcon.cbSize = sizeof( NOTIFYICONDATA );    // 構造体のサイズです。
  184.     m_stNtfyIcon.uID = 0;                            // アイコンの識別ナンバーです。
  185.     m_stNtfyIcon.hWnd = m_hWnd;                        // イベントと関連づ    けるウィンドウです。
  186.     m_stNtfyIcon.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;            // 各種設定です。
  187.     m_stNtfyIcon.hIcon = AfxGetApp()->LoadIcon( IDR_MAINFRAME );    // アプリケーションのアイコンを取得して、それをタスクトレイに表示します。
  188.     m_stNtfyIcon.uCallbackMessage = WM_USER_NTFYICON;    // アイコンがクリックされたときに送り出すメッセージです
  189.     lstrcpy( m_stNtfyIcon.szTip, _T( "C-Send" ) );        // チップの文字列です。
  190.     ::Shell_NotifyIcon( NIM_ADD, &m_stNtfyIcon );        // タスクトレイに表示します。
  191.  
  192. // <--Make
  193.  
  194.     return TRUE;  // TRUE を返すとコントロールに設定したフォーカスは失われません。
  195. }
  196.  
  197. // ここではシステムコマンドに対応する為の処理を行います
  198. void CCsendDlg::OnSysCommand(UINT nID, LPARAM lParam)
  199. {
  200. // Make-->
  201.     if( nID == ID_ADDSTRING ){        // 「登録」が選択された場合
  202.         int i = m_CList.GetCount();    // 現在のリストの数を取得
  203.         m_CList.SetCurSel( i-1 );    // リストの最後を選択
  204.         ChangeMessage();            // 文字列追加/変更関数を呼びます
  205.     }
  206.     else if( nID == ID_CHANGE ){    // 「変更」が選択されたら
  207.         int j = m_CList.GetCurSel();// 現在の選択を調べます
  208.         if( j == LB_ERR ){            // 何も選択されていない場合は終了します
  209.             return;
  210.         }
  211.         ChangeMessage();            // 文字列追加/変更関数を呼びます
  212.     }
  213.     else if( nID == ID_HELP ){        // 「ヘルプ」
  214.         AfxGetApp()->WinHelp(0,HELP_CONTENTS);    // ヘルプを呼び出します 
  215.         return;
  216.     }
  217.     else if( nID == ID_DELETESTRING ){    // 削除
  218.         DeleteString();                    // 削除関数を呼び出します
  219.     }
  220.     else
  221. // <--Make
  222.     if ((nID & 0xFFF0) == IDM_ABOUTBOX)    // バージョン情報(AboutBox)
  223.     {
  224.         CAboutDlg dlgAbout;        // ダイアログを作成して
  225.         dlgAbout.DoModal();        // 表示します
  226.     }
  227.     else
  228.     {    // その他デフォルトの処理を行います
  229.         CDialog::OnSysCommand(nID, lParam);
  230.     }
  231. }
  232.  
  233. // もしダイアログボックスに最小化ボタンを追加するならば、アイコンを描画する
  234. // コードを以下に記述する必要があります。MFC アプリケーションは document/view
  235. // モデルを使っているので、この処理はフレームワークにより自動的に処理されます。
  236.  
  237. // ウインドウが描画されるときに呼ばれます
  238. void CCsendDlg::OnPaint() 
  239. {
  240.     if (IsIconic())
  241.     {
  242.         CPaintDC dc(this); // 描画用のデバイス コンテキスト
  243.  
  244.         SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  245.  
  246.         // クライアントの矩形領域内の中央
  247.         int cxIcon = GetSystemMetrics(SM_CXICON);
  248.         int cyIcon = GetSystemMetrics(SM_CYICON);
  249.         CRect rect;
  250.         GetClientRect(&rect);
  251.         int x = (rect.Width() - cxIcon + 1) / 2;
  252.         int y = (rect.Height() - cyIcon + 1) / 2;
  253.  
  254.         // アイコンを描画します。
  255.         dc.DrawIcon(x, y, m_hIcon);
  256.     }
  257.     else
  258.     {
  259.         CDialog::OnPaint();
  260.     }
  261. }
  262.  
  263. // システムは、ユーザーが最小化ウィンドウをドラッグしている間、
  264. // カーソルを表示するためにここを呼び出します。
  265. HCURSOR CCsendDlg::OnQueryDragIcon()
  266. {
  267.     return (HCURSOR) m_hIcon;
  268. }
  269.  
  270. // リストを選択したときに呼ばれます
  271. void CCsendDlg::OnSelchangeClist() 
  272. {
  273.     // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
  274. // Make-->
  275.     CString text;    // リスト文字列取得用
  276.     CString adds;    // (追加)用
  277.  
  278.     int i=m_CList.GetCurSel();    // 現在選択されているリスト
  279.     m_CList.GetText( i, text );    // 文字列を取得する
  280.     
  281.     adds.LoadString( IDS_LISTADD );    // (追加)を取得する
  282.     if( text != adds ){            // 選択されているリストが(追加)でなければ
  283.         SendClipBoard( text );    // クリップボードに文字列を転送します
  284.     }
  285.     else{        // 選択されているリストが(追加)ならばtextを初期化します
  286.         text.LoadString( IDS_TITLE );
  287.     }
  288.     SetWindowText( text );    // 現在のtextの内容をキャプションに表示します
  289. // <--Make
  290. }
  291.  
  292. // ダイアログのサイズが変更されるときに呼ばれます
  293. void CCsendDlg::OnSize(UINT nType, int cx, int cy) 
  294. {
  295.     CDialog::OnSize(nType, cx, cy);
  296.  
  297.     // TODO: この位置にメッセージ ハンドラ用のコードを追加してください
  298. // Make-->
  299.     if( IsIconic() ){    // アイコン化されたら
  300.         ShowWindow( SW_HIDE );    // ウインドウを非表示にします
  301.         return;
  302.     }
  303.     
  304.     if( !IsZoomed() ){    // 最大化でなければ
  305.         GetWindowRect( &rect );        // 現在のウインドウのサイズを取得しておきます
  306.     }
  307.  
  308.     m_CList.MoveWindow( 0, 0, cx, cy);    // リストのサイズをダイアログのクライアントサイズに変更します
  309. // <--Make
  310. }
  311.  
  312. // クリップボードに転送する関数です
  313. // Make-->
  314. void CCsendDlg::SendClipBoard( CString& text )
  315. {
  316.     CString csMessage;    // エラーメッセージ表示用
  317.     if( !OpenClipboard() ){    // クリップボードのオープン
  318.         // 失敗した場合はメッセージを表示して処理を終了します
  319.         csMessage.LoadString( IDS_CBD_NOOPEN );
  320.         AfxMessageBox( csMessage );
  321.         return;
  322.     }
  323.     if( !EmptyClipboard() ){    // クリップボードの内容を初期化します
  324.         // 失敗した場合はメッセージを表示して処理を終了します
  325.         csMessage.LoadString( IDS_CBD_NOEMPTY );
  326.         AfxMessageBox( csMessage );
  327.         CloseClipboard();
  328.         return;
  329.     }
  330.  
  331.     char* buff;    // クリップボードへ転送するための領域を作ります
  332.     // GlobalAllocを使い、GMEM_DDESHAREの属性で作成します
  333.     // ここで作ったメモリ領域はあとで解放する必要はありません
  334.     buff = (char*) GlobalAlloc( GMEM_DDESHARE, text.GetLength()+1 );
  335.  
  336.     lstrcpy( buff, (LPCTSTR)text );    // 作成した領域に文字列を転送します
  337.  
  338.     if ( ::SetClipboardData( CF_TEXT, (HANDLE)buff ) == NULL ){ // クリップボードに転送します
  339.         // 失敗した場合はメッセージを表示して処理を終了します
  340.         csMessage.LoadString( IDS_CBD_NOSEND );
  341.         AfxMessageBox( csMessage );
  342.     }
  343.     CloseClipboard();    // クリップボードを閉じます
  344. }
  345. // <--Make
  346.  
  347. // リストがダブルクリックされたときに呼ばれます
  348. void CCsendDlg::OnDblclkClist() 
  349. {
  350.     // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
  351.  
  352. // Make-->
  353.     ChangeMessage();
  354. // <--Make
  355. }
  356.  
  357. // ウインドウを閉じるときに呼ばれます
  358. void CCsendDlg::OnClose() 
  359. {
  360.     // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
  361. // Make-->
  362.     CDialog::OnOK();    // ウインドウを閉じます
  363. // <--Make
  364. }
  365.  
  366. // OKボタンが押されたときに呼ばれます
  367. void CCsendDlg::OnOK() 
  368. {
  369.     // TODO: この位置にその他の検証用のコードを追加してください
  370. // Make-->
  371.     return;    // 今回は OKボタンの処理は何もしないので処理をせずに抜けます
  372. // <--Make
  373.  
  374.     CDialog::OnOK();
  375. }
  376.  
  377. // キャンセルボタンが押されたときに呼ばれます(場合によってはESCが押されたときも呼ばれたりします)
  378. void CCsendDlg::OnCancel() 
  379. {
  380.     // TODO: この位置に特別な後処理を追加してください。
  381. // Make-->
  382.     return;    // 今回はESCで消えないように処理をせずに抜けます
  383. // <--Make
  384.     CDialog::OnCancel();
  385. }
  386.  
  387. void CCsendDlg::OnDestroy() 
  388. {
  389.     CDialog::OnDestroy();
  390.     
  391.     // TODO: この位置にメッセージ ハンドラ用のコードを追加してください
  392. // Make-->
  393.  
  394.     ::Shell_NotifyIcon( NIM_DELETE, &m_stNtfyIcon );    //タスクトレイのアイコンを削除します。
  395.     AfxGetApp()->WinHelp(0,HELP_QUIT);    // ヘルプを閉じます
  396.  
  397.     //////////////////リストを保存します//////////////////
  398.     CString l_tmp;    // 作業用
  399.  
  400.     int j = m_CList.GetCount();    // リストの数を取得します
  401.  
  402.     CStdioFile savedata;    // 保存用ファイル
  403.     CString csSaveFileName;    // 保存用ファイル名
  404.     csSaveFileName.LoadString( IDS_SAVEFILE );    // 保存用ファイルをリソースから取得します
  405.     if( savedata.Open( csSaveFileName,    // テキストモード、ライト属性で、無い場合は新規作成します
  406.         CFile::modeCreate | CFile::modeWrite | CFile::typeText ) ){
  407.         char buff[17];    // 1行目用
  408.         if( !IsIconic() && !IsZoomed() ){    // ウインドウがアイコン化や最大化されていなければ
  409.             GetWindowRect( &rect );    // ウインドウサイズを取得します
  410.         }
  411.         // 1行目はサイズと位置を書き込みます
  412.         wsprintf( buff, "%04X%04X%04X%04X\n", rect.top, rect.left,
  413.                         rect.bottom, rect.right );
  414.         savedata.WriteString(buff);
  415.  
  416.         for(int i=0; i<j; i++){    // リストを1つづつ取り込んで1行ずつ書き込みます
  417.             m_CList.GetText( i, l_tmp );
  418.             l_tmp += "\n";
  419.             savedata.WriteString(l_tmp);
  420.         }
  421.         savedata.Close();    // ファイルを閉じます
  422.     }
  423. // <--Make
  424. }
  425.  
  426. // タスクトレイのアイコンがクリックされたときに呼ばれます
  427. // Make-->
  428. LRESULT CCsendDlg::OnNotifyIconIvents( WPARAM wParam, LPARAM lParam ){
  429.  
  430.     switch( lParam ){
  431.     case WM_LBUTTONDOWN:    // 左クリック
  432.         int st;
  433.     
  434.         if( IsWindowVisible() ){    // ウインドウが表示されていたら
  435.             st = SW_HIDE;
  436.         }
  437.         else{    // ウインドウが非表示なら
  438.             st = SW_SHOW;    // ウインドウを表示して元の大きさに戻します
  439.             ShowWindow( SW_RESTORE );
  440.         }
  441.  
  442.         ShowWindow( st );    // ウインドウの表示/非表示を切り替えます
  443.  
  444.         break;
  445.     case WM_RBUTTONDOWN:    //右クリック
  446.         break;    // そのうちメニューでも追加します(^^;
  447.     }
  448.     
  449.     return 0;
  450. }
  451.  
  452. // ダイアログの中で右クリックしたときに呼ばれます
  453. // ここでContextMenu(ポップアップのメニュー)の処理を行いましょう
  454. void CCsendDlg::OnContextMenu(CWnd* pWnd, CPoint point) 
  455. {
  456.     // TODO: この位置にメッセージ ハンドラ用のコードを追加してください
  457.  
  458. /*
  459.     解説
  460.       CWnd* pWnd は右クリックされたときのマウスカーソルのあるウインドウです。
  461.         ダイアログボックスの場合中に配置されているコントロールを識別するのに
  462.         使いましょう。
  463.       CPoint point はマウスカーソルの位置です。
  464.         Screen座標です。
  465.         これを使ってリストの項目を選択させるような場合は座標変換を行う必要が
  466.         あります。
  467. */    
  468. // Make-->
  469.     // 現在のマウスカーソルがリストにあるかどうかをチェックしています
  470.     if( pWnd != (CWnd*)GetDlgItem( IDC_CLIST ) ){
  471.         return;
  472.     }
  473.  
  474.     BOOL tmp;    // ItemFromPointの為の作業用変数です(今回は未使用)
  475.     m_CList.ScreenToClient( &point );    // 右クリックでリストの選択を行うため、座標を変換します
  476.     int nSelect = m_CList.ItemFromPoint( point, tmp );    // マウスカーソルの位置のリストを番号を返します
  477.     m_CList.SetCurSel( nSelect );    // リストを選択します
  478.  
  479.     CMenu cMenu;    // メニュー
  480.     if( !cMenu.CreatePopupMenu() ){    // ポップアップメニューを作成します
  481.         return;
  482.     }
  483.  
  484.     CString text;    // 文字列取得用
  485.     int i=m_CList.GetCurSel();    // 現在の選択されているリストを取得します
  486.     m_CList.GetText( i, text );    // 現在の文字列を取得します
  487.  
  488.     CString l_tmp;    // (追加)用
  489.     l_tmp.LoadString( IDS_LISTADD );
  490.  
  491.     CString strMenu;    // メニューに表示する文字列用
  492.     if( l_tmp == text ){    // 現在(追加)が選ばれているとき
  493.         strMenu.LoadString(IDS_ADDSTRING);    // メニューには「登録」を表示します
  494.         cMenu.AppendMenu( MF_STRING, ID_ADDSTRING, strMenu); 
  495.     }
  496.     else{    // (追加)以外が選ばれているとき
  497.         strMenu.LoadString(IDS_CHANGESTRING);    // 変更
  498.         cMenu.AppendMenu( MF_STRING, ID_CHANGE, strMenu ); 
  499.         strMenu.LoadString(IDS_DELETESTRING);    // 削除
  500.         cMenu.AppendMenu( MF_STRING, ID_DELETESTRING, strMenu ); 
  501.     }
  502.  
  503.     // クライアント座標からスクリーン座標に戻します
  504.     m_CList.ClientToScreen( &point );
  505.     // ポップアップメニューの表示はスクリーン座標で指定する必要があります
  506.     cMenu.TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON, point.x, point.y, this );    //ポップアップメニューを表示します。
  507.  
  508. // <--Make
  509. }
  510.  
  511. // 文字列を削除します
  512. // Make-->
  513. void CCsendDlg::DeleteString()
  514. {
  515.     int i = m_CList.GetCount();    // 現在のリストの数を数えます
  516.     if( i<1 ){    // リストに一つもなければ何もしません
  517.         return;
  518.     }
  519.  
  520.     int j = m_CList.GetCurSel();    // 現在選択されている項目を調べます
  521.     if( j == LB_ERR ){    // 何も選択されていなければ何もしません
  522.         return;
  523.     }
  524.  
  525.     if( j == i-1 ){    // 選択されている項目が最後(追加)での場合
  526.         CString csMessage;
  527.         csMessage.LoadString( IDS_NODELETE ); // エラーメッセージを出します
  528.         AfxMessageBox( csMessage );
  529.         return;
  530.     }
  531.  
  532.     CString cst;    // 現在の文字列を取得
  533.     CString output;    // 確認メッセージ用の
  534.  
  535.     m_CList.GetText( j, cst );    // 現在選択されている文字列を取得します
  536.     output.LoadString( IDS_INFOMESSAGE );    // 問い合わせ用のメッセージをリソースから取得します
  537.     // 内容
  538.     //  「XXXXXXXXXXX」
  539.     //のようにします
  540.     output += "\x0d\x0a「";    // メッセージを加工します
  541.     output += cst;
  542.     output += "」";
  543.  
  544.     CString csMessage;    // 削除をすることを促すメッセージ
  545.     csMessage.LoadString( IDS_MESSAGE_DEL );
  546.     if( MessageBox( output, csMessage,    // 確認ダイアログを表示します
  547.                 MB_ICONQUESTION | MB_OKCANCEL | MB_DEFBUTTON2 )    // このときデフォルトのボタンをキャンセルにします
  548.         == IDCANCEL ){
  549.         return;    // キャンセルが選択された場合何もせずに終了します
  550.     }
  551.  
  552.     m_CList.DeleteString(j);    // リストから文字列を削除します
  553. }
  554. // <--Make
  555.  
  556. // 登録メニューが選択され時に呼ばれます
  557. void CCsendDlg::OnAddstring() 
  558. {
  559.     // TODO: この位置にコマンド ハンドラ用のコードを追加してください
  560. // Make-->
  561.     ChangeMessage();
  562. // <--Make
  563. }
  564.  
  565. // 変更メニューが選択されたときに呼ばれます
  566. void CCsendDlg::OnChange() 
  567. {
  568.     // TODO: この位置にコマンド ハンドラ用のコードを追加してください
  569. // Make-->
  570.     ChangeMessage();
  571. // <--Make
  572. }
  573.  
  574. // 削除メニューが選択されたときに呼ばれます
  575. void CCsendDlg::OnDeletestring() 
  576. {
  577.     // TODO: この位置にコマンド ハンドラ用のコードを追加してください
  578. // Make-->
  579.     DeleteString();
  580. // <--Make
  581. }
  582.  
  583. // メッセージの変更と登録
  584. // Make-->
  585. void CCsendDlg::ChangeMessage()
  586. {
  587.     CInputBox cInput;    // メッセージ編集用のダイアログ
  588.     CString text;        // リストの文字列
  589.     
  590.     // 現在選択されている文字列を取得します
  591.     int i=m_CList.GetCurSel();
  592.     m_CList.GetText( i, text );
  593.  
  594.     // (追加)をリソースから取得します
  595.     CString l_tmp;
  596.     l_tmp.LoadString( IDS_LISTADD );
  597.  
  598.  
  599.     BOOL flag = FALSE;    // このフラグで、登録と変更を区別します。TRUE--登録  FALSE--変更
  600.     CString InputWindowName;    // メッセージ編集用のダイアログのキャプション用
  601.     if( text == l_tmp ){    // 現在の文字列が(追加)の時
  602.         InputWindowName.LoadString( IDS_REGIST );    // キャプションは「登録」を選びます
  603.         flag = TRUE;    // フラグを「登録」(TRUE)にします
  604.     }
  605.     else{
  606.         cInput.SetInputText( text );    // メッセージ編集用のダイアログに現在選択されている文字列を設定します
  607.         InputWindowName.LoadString( IDS_CHANGE );    // キャプションは「変更」を選びます
  608.     }
  609.     cInput.SetWindowName( InputWindowName );    // キャプションを設定します
  610.  
  611.     if( cInput.DoModal()==IDOK ){    // ダイアログを表示します
  612.         // OKボタンが押されて終了した場合以下の処理を行います
  613.         CString text;    // メッセージ編集ダイアログからの文字列取得用
  614.         cInput.GetInputText(text);    // メッセージ編集用ダイアログから文字列を取得します
  615.         if( !flag ){    // フラグが「変更」(FALSE)なら、現在のリストの文字列を削除します
  616.             m_CList.DeleteString(i);
  617.         }
  618.         if( text.GetLength() ){    // 取得した文字列がある場合
  619.             m_CList.InsertString( i, (LPCTSTR) text );    // リストに文字列を追加します
  620.         }
  621.     }
  622. }
  623. // <--Make
  624.