![]() |
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 ); |
|
■Home■Back■掲示板■ | |
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 ); |
|
■Home■Back■掲示板■ | |
003 ダイアログのキャプションを変更する | |
CMyDlgのOnInitDialogで this->SetWindowText("新しいキャプション"); を追加する。 |
|
■Home■Back■掲示板■ | |
004 指定のファイルを関連付けたアプリケーションで実行する | |
::ShellExecute( NULL , "open" ,
"ファイル名" , NULL , NULL
, SW_SHOWNORMAL
); ::ShellExecute( NULL , "open" , "http://www2.sanmedia.or.jp/moto001/" , NULL , NULL , SW_SHOWNORMAL ); で、URLを開くことも出来る。 |
|
■Home■Back■掲示板■ | |
005 アプリケーションのパス名を取得する | |
TCHAR szName[_MAX_PATH+1]; DWORD dwChar = ::GetModuleFileName( NULL, szName, _MAX_PATH); |
|
■Home■Back■掲示板■ | |
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(); } |
|
■Home■Back■掲示板■ | |
007 フルパス名をドライブ名、フォルダ名、ファイル名、拡張子に分割する | |
TCHAR drive[_MAX_DRIVE] , dir[_MAX_DIR] ,
fname[_MAX_FNAME] , ext[_MAX_EXT]; ::_splitpath( lpszPathName, drive, dir, fname, ext ); |
|
■Home■Back■掲示板■ | |
008 アプリケーションを強制的に終了させる | |
MainFrameにWM_CLOSEメッセージを送ります。基本的に戻ってこなくてもいいので、PostMessageを使用します。 CMainFrame* pMainFrm = ::AfxGetMainWnd(); pMainFrm->PostMessage( WM_CLOSE ); |
|
■Home■Back■掲示板■ | |
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 ); } |
|
■Home■Back■掲示板■ | |
010 Int型のCArray(配列)クラスを定義する | |
#include <afxtempl.h> を追加する。 typedef CArray< int , int > CIntArray; とすると、int型のCArrayを使用できるようになります。 例 CIntArray nArray; int nData = 100; nArray.add( nData ); |
|
■Home■Back■掲示板■ | |
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 時間帯の名前またはその省略名。時間帯がわからない場合には文字を入れない。 %% パーセント記号 |
|
■Home■Back■掲示板■ | |
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; } |
|
■Home■Back■掲示板■ | |
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 ); } } } |
|
■Home■Back■掲示板■ | |
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, "新しいヘッダテキスト" ); |
|
■Home■Back■掲示板■ | |
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); |
|
■Home■Back■掲示板■ | |
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" |
|
■Home■Back■掲示板■ | |
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に保存されます。 |
|
■Home■Back■掲示板■ | |
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 ); |
|
■Home■Back■掲示板■ |
■Home■Software工房■VC++ Tips■ | moto001@sanmedia.or.jp |