001 charとCString
●CString型をLPSTR型に変換する。
CString csData= "変換する文字列";
LPTSTR lpsz = new TCHAR[csData.GetLength()+1];
_tcscpy(lpsz, csData);
注)delete lpsz を忘れずに!

●LPSTR型をCString型に変換する。
CString csData;
csData.Format( "%s" , lpsz );
HomeBack掲示板
002 アウトルックの様に画面を3分割する
●CMainFrameにCSplitterWind型のメンバ変数を追加する。
public:
    CSplitterWnd m_wndSplitter1;
    CSplitterWnd m_wndSplitter2;

●MainFrame.cppにTreeView、ListView、EditViewをインクルードする。
#include "MyTreeView.h"
#include "MyListView.h"
#include "MyEditView.h"

●CMainFrameのOnCreateClientで以下の処理を行う。
this->m_wndSplitter1.CreateStatic( this , 1 , 2 );
this->m_wndSplitter2.CreateStatic( &this->m_wndSplitter1, 2, 1,
         WS_CHILD | WS_VISIBLE,this->m_wndSplitter1.IdFromRowCol(0,1));
this->m_wndSplitter1.CreateView( 0 , 0 , RUNTIME_CLASS( CMyTreeView ) ,
         CSize( 230,100 ) , pContext );
this->m_wndSplitter2.CreateView( 0 , 0 , RUNTIME_CLASS( CMyListView ) ,
         CSize( 0 ,50 ) , pContext );

this->m_wndSplitter2.CreateView( 1 , 0 , RUNTIME_CLASS( CMyEditView ) ,
         CSize ( 0 ,0 ) , pContext );

HomeBack掲示板
003 ダイアログのキャプションを変更する
CMyDlgのOnInitDialogで
this->SetWindowText("新しいキャプション");
を追加する。
HomeBack掲示板
004 指定のファイルを関連付けたアプリケーションで実行する
::ShellExecute( NULL , "open" , "ファイル名" , NULL , NULL , SW_SHOWNORMAL );

::ShellExecute( NULL , "open" , "http://www2.sanmedia.or.jp/moto001/" , NULL , NULL , SW_SHOWNORMAL );
で、URLを開くことも出来る。
HomeBack掲示板
005 アプリケーションのパス名を取得する
TCHAR szName[_MAX_PATH+1];
DWORD dwChar = ::GetModuleFileName( NULL, szName, _MAX_PATH);
HomeBack掲示板
006 アプリケーションの2重起動を防止する
//CXXXAppのメンバ変数に追加
HANDLE m_hExeCheckMutex;

//ソースに追加
BOOL CXXXApp::InitInstance()

{
  //プログラムの複数起動抑止////////////////////////////////////
  HWND hWndCap;
  CString strCaption;

  //もし、オープンできれば以前のアプリケーションが起動している
  HANDLE hPrevMutex = OpenMutex(MUTEX_ALL_ACCESS,FALSE,_T("XXX_Instance"));
  if(hPrevMutex) {
    ::AfxMessageBox( "既に常駐しています。");
    //クローズ
    ::CloseHandle(hPrevMutex);
    return FALSE;
  }
  //複数起動確認用ミューテックス作成
  this->m_hExeCheckMutex = ::CreateMutex(FALSE,0,"XXX_Instance");
  /////////////////////////////////////////////////////////////

int CXXXApp::ExitInstance()
{
  ReleaseMutex( this->m_hExeCheckMutex );
  return CWinApp::ExitInstance();
}

HomeBack掲示板
007 フルパス名をドライブ名、フォルダ名、ファイル名、拡張子に分割する
TCHAR drive[_MAX_DRIVE] , dir[_MAX_DIR] , fname[_MAX_FNAME] , ext[_MAX_EXT];
::_splitpath( lpszPathName, drive, dir, fname, ext );
HomeBack掲示板
008 アプリケーションを強制的に終了させる
MainFrameにWM_CLOSEメッセージを送ります。基本的に戻ってこなくてもいいので、PostMessageを使用します。
CMainFrame* pMainFrm = ::AfxGetMainWnd();
pMainFrm->PostMessage( WM_CLOSE );
HomeBack掲示板
009 別のウインドウに文字列を送信する
●送る側
  COPYDATASTRUCT theCDS;
  theCDS.dwData = 0;
  theCDS.lpData = (void*)lpszData; //送信する文字列
  theCDS.cbData = ::lstrlen( lpszData ) + 1;

  pWnd->SendMessage( WM_COPYDATA , NULL , (LPARAM)&theCDS );

●受ける側
CMainFrame::OnCopyData( CWnd* pWnd , COPYDATASTRUCT* pCopyDataStruct )
{
  LPSTR lpszData = pCopyDataStruct->lpData; //受け取った文字列
  return CFrameWnd::OnCopyData( pWnd , pCopyDataStruct );
}
HomeBack掲示板
010 Int型のCArray(配列)クラスを定義する
#include <afxtempl.h> を追加する。
typedef CArray< int , int > CIntArray;
とすると、int型のCArrayを使用できるようになります。

  CIntArray nArray;
  int nData = 100;
  nArray.add( nData );
HomeBack掲示板
011 現在の日時を取得する
現在の日時はCTime::GetCurrentTime()で取得します。
CTime theTime = CTime::GetCurrentTime();
   
これを指定の文字列にフォーマットします。

this->m_csTime = theTime.Format( "%Y/%m/%d/(%A) %p %I:%M:%S" );
結果
2000/03/10/(Friday) PM 02:35:25

Formatに使えるのは以下の項目があります。

 %a   曜日の省略名
 %A   曜日の正式名
 %b   月の省略名
 %B   月の正式名
 %c   ロケールに応じた日付と時間の表現
 %d   10 進数で表す月の日付 (01〜31)
 %H   24 時間表記の時間 (00〜23)
 %I   12 時間表記の時間 (01〜12)
 %j   10 進数で表す年頭からの日数 (001〜366)
 %m   10 進数で表す月 (01〜12)
 %M   10 進数で表す分 (00〜59)
 %p   現在のロケールの AM/PM
 %S   10 進数で表す秒 (00〜59)
 %U   10 進数で表す週の通し番号。日曜日を週の最初の日とする (00〜53)。
 %w   10 進数で表す曜日。日曜日を 0 とする (0〜6)。
 %W   10 進数で表す週の通し番号。月曜日を週の最初の日とする (00〜53)。
 %x   現在のロケールの日付表示
 %X   現在のロケールの時刻表示
 %y   10 進数で表す西暦の下 2 桁 (00〜99)
 %Y   10 進数で表す 4 桁の西暦
 %z、%Z 時間帯の名前またはその省略名。時間帯がわからない場合には文字を入れない。
 %%   パーセント記号
HomeBack掲示板
012 ファイルからアイコンを取り出す
  SHFILEINFO shfi;
  CString csPath = "パス名"

  //通常のアイコンの取得
  if( ::SHGetFileInfo( csPath, FILE_ATTRIBUTE_ARCHIVE, &shfi,
    sizeof(SHFILEINFO),SHGFI_ICON ) != 0 ){
    HICON hIcon = shfi.hIcon;
  }

  //スモールアイコンの取得
  if( ::SHGetFileInfo( csPath, FILE_ATTRIBUTE_ARCHIVE, &shfi,
    sizeof(SHFILEINFO),SHGFI_ICON | SHGFI_SMALLICON ) != 0 ){
    HICON hSmallIcon = shfi.hIcon;
  }
HomeBack掲示板
013 TreeViewの全アイテムに処理を行う
  引数hItemにRootItemを指定すると全てのアイテムに
  処理を行うことができます。

  void CXXXView::hoge( HTREEITEM hItem )
  {
    //hItem以下のアイテムに処理を行う。

    //TreeCtrlの取得
    CTreeCtrl& treeCtrl = this->GetTreeCtrl();

    //////////////////////////////////////////
    //  ここで必要な処理を行う
    /////////////////////////////////////////

    if( treeCtrl.ItemHasChildren( hItem ) ){
      HTREEITEM hChild = treeCtrl.GetChildItem( hItem );
      while( hChild != NULL ){
        //自分を呼ぶ
        this->hoge( hChild );
        hChild = treeCtrl.GetNextSiblingItem( hChild );
      }
    }
  }
HomeBack掲示板
014 ListViewのヘッダの文字列を取得、設定する
//指定カラムのヘッダのテキストを取得する。
CString CMyListView::getHeaderItemText( CHeaderCtrl* pHeaderCtrl , int nClmNo)
{
  int nMax = 256;
  //ヘッダアイテム構造体
  HDITEM hi;
  hi.mask = HDI_TEXT;
  hi.pszText = new TCHAR[nMax];
  hi.cchTextMax = nMax;
  //ヘッダアイテム情報を取得
  pHeaderCtrl->GetItem( nClmNo , &hi );
  CString csText( hi.pszText );
  delete hi.pszText;
  return csText;
}

//指定カラムのヘッダに指定の文字列を設定する。
void CMyListView::setHeaderItemText(CHeaderCtrl *pHeaderCtrl, int nClmNo, LPCTSTR lpText)
{

  HDITEM hi;
  hi.mask = HDI_TEXT;
  hi.pszText = new TCHAR[::_tcslen( lpText ) + 1 ];
  ::_tcscpy( hi.pszText , lpText );
  hi.cchTextMax = ::_tcslen( lpText ) + 1;
  pHeaderCtrl->SetItem( nClmNo , &hi );
  delete hi.pszText;
}

●MyListViewからの使用方法
  CListCtrl& listCtrl = this->GetListCtrl();
  CHeaderCtrl* pHeaderCtrl = listCtrl.GetHeaderCtrl();
  //ヘッダの文字列を取得
  CString csText = this->getHeaderItemText( pHeaderCtrl , 0 );
  //ヘッダの文字列へ設定
  this->setHeaderItemText( pHeaderCtrl, 0, "新しいヘッダテキスト" );
HomeBack掲示板
015 ウインドウにドロップしたファイルを取得する
  ●CWnd::DragAcceptFilesを使用して受取可能なウインドウとする。

void CMyView::OnDropFiles(HDROP hDropInfo)
{
  UINT  usize;
  UINT  nCount;
  TCHAR  lpPath[_MAX_PATH+1];

  CStringArray csPathArray;  //ドロップされたファイルのパスを格納する配列

  //Dropされたファイル数を取得
  UINT nFileCount =::DragQueryFile(hDropInfo,0xffffffff,lpPath,sizeof(buf)-1)

  for(nCount =0 ; nCount < nFileCount; nCount++ ){
    //Dropされたファイルのパス名を取得
    usize = ::DragQueryFile(hDropInfo,i,lpPath,sizeof(buf)-1);
    //パス名を配列に格納する。
    csPathArray.Add( lpPath );
  
  }
  ::DragFinish(hDropInfo);
HomeBack掲示板
016 小数点以下任意の桁で切り捨てて、CString型に設定する
  CString getCStringData(double dData, int nKeta )
  {
    CString csFormat;
    csFormat.Format( "%s%df" , "%0." , nKeta );
    
    CString csRet;
    csRet.Format( csFormat , dData );

    return csRet;
  }
  ●使い方は
  CString csData = getCStringData( 10.23333 , 2 );
  ●結果は csData = "10.23"
HomeBack掲示板
017 レジストリを活用する
  CXXXApp::initInstance()内で
    SetRegistryKey(_T("製作者名"));
  を追加します。

  ●データをレジストリに保存する
    CPjMemoApp* pApp = (CPjMemoApp*)::AfxGetApp();
    int nData = 100;
    pApp->WriteProfileInt( "Settings" , "Data01" , nData );
    CString csData("文字列");
    pApp->WriteProfileString( "Settings" , "Data02" , csData );

  ●データをレジストリから取り出す
    CPjMemoApp* pApp = (CPjMemoApp*)::AfxGetApp();
    int nData = pApp->GetProfileInt( "Settings" , "Data01" , 0 );
    CString csData = pApp->GetProfileString( "Settings" , "Data02" , NULL );

  HKEY_CURRENT_USER\Software\製作者名\アプリケーション名\Settingsに保存されます。
HomeBack掲示板
018 指定のフォルダ以下のファイルを取得する
  void getFiles(LPCTSTR lpFolder , BOOL bSubFolder , CStringArray& csFileArray )
  {
    CString csSearchFile;
    csSearchFile.Format( "%s%s" , lpFolder , _T("\\*.*") );
  
    CFileFind FileFind;
    if(!FileFind.FindFile(csSearchFile)) return;

    while( FileFind.FindNextFile() ){
 
      // ".",".."でない場合に処理を行う
      if(!FileFind.IsDots()){
  
        //ディレクトリで、更にサブディレクトリを処理するのであれば自分を呼ぶ
        if(FileFind.IsDirectory() && bSubFolder != FALSE ){
          this->getFiles(FileFind.GetFilePath() , bSubFolder , csFileArray );
        }
        //ファイルであれば、ファイル名配列に追加していく。
        else{
          csFileArray.Add( FileFind.GetFilePath() );
        }
      }
     }
  }

●使い方
  CStringArray csFileArray;
  getFiles( "c:" , TRUE , csFileArray );

HomeBack掲示板

HomeSoftware工房VC++ Tips moto001@sanmedia.or.jp