VC++ Tips

to home
 VC++(SDK含む)に関するTipsを覚書き程度に..
  1. アプリケーションの終了
  2. 外部アプリケーションの起動
  3. 外部アプリケーションが終了するまで制御を返さない方法
  4. Windowサイズの変更
  5. プリンタの設定がされているかの判断
  6. ファイルの存在確認
  7. プロジェクトを開いた瞬間にエラーになる対策
  8. ファイルの Drag & Drop
  9. CDialogBar 上に張り付けたコンボボックスのメッセージハンドリング

 別ページですが..


  1. アプリケーションの終了
  2.  WM_CLOSEメッセージをメインウィンドウにポストします。
    AfxGetMainWnd()->PostMessage( WM_CLOSE ); 
        


  3. 外部アプリケーションの起動
  4.  CreateProcess()を使って外部アプリケーションを起動する。例えばメモ帳でc:\foo.txtを開く場合。
    STARTUPINFO sinfo;
    PROCESS_INFORMATION pinfo;
    
    ZeroMemory( &sinfo, sizeof( STARTUPINFO ) );
    ZeroMemory( &pinfo, sizeof( PROCESS_INFORMATION ) );
    sinfo.cb = sizeof( STARTUPINFO );
    sinfo.dwFlags = STARTF_USESHOWWINDOW;
    sinfo.wShowWindow = SW_SHOWNORMAL;
    
    if ( !CreateProcess( NULL,
                         _T("notepad.exe C:\\foo.txt"),
                         NULL,
                         NULL,
                         FALSE,
                         0,
                         NULL,
                         NULL,
                         &sinfo,
                         &pinfo ) ) { 
        // 起動失敗
    }
        


  5. 外部アプリケーションが終了するまで制御を戻さない方法
  6.  上記の例の続きとします。
    // メモ帳が終わるまで制御を戻しません
    WaitForInputIdle( pinfo.hProcess, INFINITE );
    WaitForSingleObject( pinfo.hProcess, INFINITE );
        


  7. Windowサイズの変更
  8.  CWnd::MoveWindow( );  起動時には CFrameWndの継承クラスの
    BOOL CMainFrame::PreCreateWindow( CREATESTRUCT& cs )
    に手を加える
    cs.cy = 300;      // ウィンドウの高さを 300ピクセルに
    cs.cx = 500;      //             幅を   500ピクセルに
    c.y   = 10;       // ウィンドウの左上隅の Y座標を 10に
    c.x   = 50;       //             左上隅の X座標を 50に
        


  9. プリンタの設定がされているかの判断
  10. PRINTDLG pd;
    BOOL bRet = AfxGetApp()->GetPrinterDeviceDefaults( &pd );
    if ( bRet == 0 ) {
        // プリンタ未セッティングの場合
    }
    	


  11. ファイルの存在確認
  12.  指定ファイルが存在していれば、true を返します。それ以外はfalse。
    bool DoesFileExist( LPCTSTR lpFileName )
    {
        bool bRet = false;
        WIN32_FIND_DATA	FindData;
    
        HANDLE hFile = FindFirstFile( lpFileName, &FindData );
        if ( hFile != INVALID_HANDLE_VALUE )
            bRet = true;
        FindClose( hFile );
        return bRet;
    }
    	


  13. プロジェクトを開いた瞬間にエラーになる対策
  14.   例えば、プロジェクト"sample" が既に存在しており、このプロジェクトを開いた瞬間に 下記ダイアログが表示されて強制終了されてしまう。

    対策→拡張子が .ncbのファイルを削除する。このファイルはなければ 自動生成される。別環境で作成したプロジェクトをコピーした時などは、まず削除する ことをお勧めします。


  15. ファイルの Drag & Drop
  16. CXXXApp::Initinstance() にて下記を追加する。
    return 文の前でいい。これで、Dropファイルの受け入れがOKとなる。
    	m_pMainWnd->DragAcceptFiles();
    	

    CMainFrameにて、メッセージ WM_ON_DROPFIRE をハンドルする。

    void CMainFrame::OnDropFiles(HDROP hDropInfo) 
    {
        // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
        static char	szFileName[_MAX_PATH];
    
        UINT nFileCount = ::DragQueryFile( hDropInfo,0xFFFFFFFF,szFileName, _MAX_PATH );//Dropされたファイル数を取得
        if ( nFileCount == 1 ) {
            UINT uSize=::DragQueryFile( hDropInfo, 0 /* index */, szFileName, _MAX_PATH );//Dropされたファイル名を取得
            //ファイル名を保存する処理
            ::AfxMessageBox( szFileName );
            CDocument *pDoc = GetActiveDocument();
            // pDoc->hogehoge()
        }
        ::DragFinish( hDropInfo );
    
        //CFrameWnd::OnDropFiles(hDropInfo);
    }
    	


  17. CDialogBar 上に張り付けたコンボボックスのメッセージハンドリング
  18. CDialogBar 上にコントロールを張り付けられるが、そのイベントの取り方が通常のダイアログの時と 異なる。
    自分でメッセージマップに登録する作業も必要となる。
    [MainFrm.h]
    // 生成されたメッセージ マップ関数
    //{{AFX_MSG(CXDemoDlg)
    :
    :
    afx_msg void OnSelchangeCombo1();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    	

    [MainFrm.cpp]

    BEGIN_MESSAGE_MAP(CXDemoDlg, CDialog)
        //{{AFX_MSG_MAP(CXDemoDlg)
        :
        :
        ON_CBN_SELCHANGE(IDC_COMBO1, OnSelchangeCombo1)
        //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    	

    // 追加したハンドラ void CMainFrame::OnSelchangeCombo1() { CComboBox *pCombo = ( CComboBox *)m_wndDlgBar.GetDlgItem( IDC_COMBO1 ); if ( pCombo ) { int index = pCombo->GetCurSel(); if ( index != CB_ERR ) { CString szStr; pCombo->GetLBText( index, szStr ); TRACE1( "text=:%s:\n", szStr ); } } }


to home

by masu
e-mail: massun.masumoto@nifty.ne.jp
URL : http://member.nifty.ne.jp/~masumoto/