17:32 2012/05/03 更新
    ◆キーワード
    \r\n UpdateData(FALSE); UpdateWindow(); RedrawWindow(); DrawMenuBar(); LVNI_SELECTED の 反対は !LVNI_SELECTED _wsetlocale(LC_ALL, L"Japanese"); _wsetlocale(LC_ALL, _T("jpn")); _wsetlocale(LC_ALL, _T(""));
    ◆モーダルでメインクラスを呼びだす
    C○○Dlg* m_Dlg = (C○○Dlg*)AfxGetMainWnd(); if( (m_Dlg==NULL)||(m_Dlg->GetSafeHwnd()==NULL) ){ return FALSE; } m_Dlg->●●・・・
    ◆ダイアログの呼び出す方法
    //モーダル InputBoxDlg m_dlg; if (m_dlg.DoModal()==IDOK){ SaveFileName = _T(""); SaveFileName = m_dlg.ExportFileName; }else{ SaveFileName = _T(""); } if (SaveFileName != _T("")){ WritePlayList_Func(_T("write"),_T(""),AudioItems,SaveFileName); } //モーダレス1 CDialog *m_pDlg; m_pDlg = new ReplaceDlg(this); m_pDlg->Create(IDD_DIALOG_Replace); m_pDlg->ShowWindow(true);
    ◆((C○○App*)AfxGetApp())->m_lpCmdLine
    6:33 2011/06/03 BOOL C○○Dlg::OnInitDialog(){ { //CDialogEx::OnInitDialog(); // "バージョン情報..." メニューをシステム メニューに追加します。 CDialogEx::OnInitDialog(); // TODO: 初期化をここに追加します。 CString TempStr; CString FileName; FileName =_T(""); int i=0; int StartIDX = 0; int EndIDX = 0; BOOL QuotStartFLG = FALSE; BOOL SpaceStartFLG = FALSE; TempStr = ((C○○App*)AfxGetApp())->m_lpCmdLine; while (i<=TempStr.GetLength()-1){ TempStr = ((C○○App*)AfxGetApp())->m_lpCmdLine; if (TempStr.Mid(i,1) == _T("\"")){ if(QuotStartFLG == FALSE){ QuotStartFLG = TRUE; StartIDX = i; }else if (QuotStartFLG == TRUE){ QuotStartFLG = FALSE; EndIDX = i; FileName = TempStr.Mid(StartIDX+1,EndIDX-StartIDX-1); i++; //ここにFileNameを処理する文を書いて下さい! } } if(QuotStartFLG == FALSE){ if(SpaceStartFLG == FALSE && TempStr.Mid(i,1) != _T(" ")){ SpaceStartFLG = TRUE; StartIDX = i; } if ((TempStr.Find(_T(" "),0) == NULL || i ==TempStr.GetLength()-1 )){ EndIDX = i; FileName = TempStr.Mid(StartIDX,EndIDX-StartIDX + 1); //ここにFileNameを処理する文を書いて下さい! break; }else if ((TempStr.Mid(i,1) == _T(" ") || i ==TempStr.GetLength()-1 ) && ( SpaceStartFLG == TRUE )){ SpaceStartFLG = FALSE; EndIDX = i; FileName = TempStr.Mid(StartIDX,EndIDX-StartIDX); //ここにFileNameを処理する文を書いて下さい! } } i++; } DragAcceptFiles();//Drag & Drop処理 UpdateData(FALSE); return TRUE; }
    ◆ReverseFindの作成 (検索開始位置 startIDX を追加)
    //http://www.codeguru.com/forum/archive/index.php/t-174318.html int C○○Dlg::myReverseFind(CString cs, CString subString,int startIDX){ cs.MakeReverse(); subString.MakeReverse(); int n1 = cs.Find(subString,cs.GetLength()-startIDX); if (n1 != -1) n1 = cs.GetLength() - n1 - subString.GetLength(); return n1; }
    ◆エスケープ シーケンス
    FullPathString.Replace(_T("%"),_T("%%")); FullPathString.Replace(_T("\\"),_T("\\\\")); FullPathString.Replace(_T("%%"),_T("%")); FullPathString.Replace(_T("\\\\"),_T("\\"));
    ◆文字型の変換
    CString CharToStringFunc(TCHAR inStr){ CString myStr; myStr = inStr; return myStr; } 【要修正】 TCHAR StringToCharFunc(CString theString){ int sizeOfString = (theString.GetLength() + 1); LPTSTR lpsz = new TCHAR[ sizeOfString ]; _tcscpy_s(lpsz, sizeOfString, theString); //... modify lpsz as much as you want return lpsz[sizeOfString]; delete[] lpsz; }
    ◆文字をLONG型に
    //http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200011/00110021.txt long C○○Dlg::CStringToLong(CString strValue){ USES_CONVERSION; int intLength; // CString文字数 LPWSTR strWPoint; // UNICODE文字 LPSTR strAPoint; // JIS文字 // 文字数の取得 intLength = strValue.GetLength(); // 文字ポインタ取得 strWPoint = strValue.GetBuffer(intLength); // UNICODEからJISへ変換 strAPoint = W2A(strWPoint); // バッファ開放 strValue.ReleaseBuffer(); return atol(strAPoint); }
    ◆ファイルパスからファイル名を返す関数(あえて自作した)
    CString FullPathToFileName(CString FullPathStr){ int PathSeparatorIDX = 0; CString FileName; if(FullPathStr.GetLength()==0){ FileName = ""; }else{ PathSeparatorIDX = FullPathStr.ReverseFind(_T('\\')); if(PathSeparatorIDX == -1){ FileName = FullPathStr; }else{ FileName= FullPathStr.Mid(PathSeparatorIDX+1); } //TRACE(_T("%d"),PathSeparatorIDX); //TRACE(FileName); } return FileName; }
    ◆ParseDateTime
    CTime C○○Dlg::CStringToDate(CString strDate) { //http://sphere42.mlexp.com/techlib/2011/02/vc.html COleDateTime oleTime; oleTime.ParseDateTime(strDate); return oleTime; }
    ◆MessageBoxの使い方
    int myResult; myResult = MessageBox(_T("ファイルを保存しますか?") ,_T("保存確認"), MB_YESNOCANCEL ); if (IDYES == myResult){ //ファイル保存処理 }
    ◆メッセージボックスの代わり(警告音をならして、tempTimeミリ秒スリープしたあと、文字をダイアログ上に表示)
    CString C○○Dlg::StatusStringSet(CString tempStr,int tempTime,BOOL SndOn){ if(SndOn == TRUE){ MessageBeep(MB_OK); } Sleep(tempTime); C○○Dlg::m_xvStatusString = tempStr; UpdateData(FALSE); return tempStr; }
    ◆HTMLの特殊な記号 (置換する順序が大事!!)
    if (tempStr !=_T("")){ tempStr.Replace(_T("&"), _T("&amp;"));//出力前の置換は最初に行う tempStr.Replace(_T("<"), _T("&lt;")); tempStr.Replace(_T(">"), _T("&gt;")); tempStr.Replace(_T("\""), _T("&quot;")); tempStr.Replace(_T(" "), _T("&nbsp;")); tempStr.Replace(_T("(c)"), _T("&copy;")); tempStr.Replace(_T("(r)"), _T("&reg;")); tempStr.Replace(_T("'"),_T("&apos;")); tempStr.Replace(_T("^"),_T("&cric;")); tempStr.Replace(_T("~"),_T("&tilde;")); tempStr.Replace(_T("-"),_T("&ndash;")); tempStr.Replace(_T("‘"),_T("&lsquo;")); tempStr.Replace(_T("’"),_T("&rsquo;")); tempStr.Replace(_T(","),_T("&sbquo;")); } if (tempStr !=_T("")){ tempStr.Replace(_T("&lt;"), _T("<")); tempStr.Replace(_T("&gt;"), _T(">")); tempStr.Replace(_T("&quot;"), _T("\"")); tempStr.Replace(_T("&nbsp;"), _T(" ")); tempStr.Replace(_T("&copy;"), _T("(c)")); tempStr.Replace(_T("&reg;"), _T("(r)")); tempStr.Replace(_T("&apos;"), _T("'")); tempStr.Replace(_T("&cric;"), _T("^")); tempStr.Replace(_T("&tilde;"), _T("~")); tempStr.Replace(_T("&ndash;"), _T("-")); tempStr.Replace(_T("&lsquo;"), _T("‘")); tempStr.Replace(_T("&rsquo;"), _T("’")); tempStr.Replace(_T("&sbquo;"), _T(",")); tempStr.Replace(_T("&amp"), _T("&"));//読込み時は最後に置換 }
    /* http://d.hatena.ne.jp/shikaku/20090519/p3 ■[CPP][VC]LPCSTRなどのVC++の紛らわしい定義の意味 一見正体不明のVC++オリジナル定義。よーくみれば違いが分かる。 名前 意味 LP *(ポインタ) C const TSTR TCHAR(char) STR char WSTR WCHAR(ユニコード用:2byte) ゆえに・・・ 定義 正体 LPSTR char* LPCSTR const char* LPTSTR TCHAR* LPCTSTR const TCHAR* LPWSTR WCHAR* LPCWSTR const WCHAR* となる。*/
    ◆コンボボックスの現在編集中の文字を取得
    CString myStr; ((CComboBox*)GetDlgItem(IDC_COMBO_TargetDate))->GetWindowText(myStr);
    ◆チェックボックス・コントロールの使用法
    //http://www.ujasiri.com/prglib/vc/compo/vc_chkboxsap.html CButton* chkbox1 = (CButton*)GetDlgItem(IDC_CHECK_DateSpan); if (m_xvChkTargetDate == TRUE) { //.GetCheck() m_xvChkTargetDate = FALSE; m_xvChkDateSpan = TRUE; chkbox1->SetCheck(1); }else{ m_xvChkTargetDate = TRUE; m_xvChkDateSpan = FALSE; //チェックを外す chkbox1->SetCheck(0); }
    ◆リストボックス・コントロールで、全ての項目を選択
    void C○○Dlg::SelectALL_Func(){ //SelectALLFLG = TRUE; int i = 0; while(i<=m_xcList.GetItemCount() -1){ m_xcList.SetItemState(i, // フォーカス&選択状態にしたいアイテムのインデックス !LVIS_FOCUSED | LVIS_SELECTED, // 状態 LVIS_FOCUSED | LVIS_SELECTED); // マスク C○○Dlg::m_xcList.EnsureVisible(i, FALSE); //ListView_Update(m_xcList, i);//追加しても意味がなかった2011.05.14 UpdateWindow(); i++; } //SelectALLFLG = FALSE; C○○Dlg::StatusStringSet(_T("すべてのアイテムを選択状態にしました"),300,TRUE); }
    ◆現在の時刻を返す関数
    CString C○○Dlg::CreateDateTime(int mySwitch){//mySwitch//1:ファイル名に付与する日時//2:現在の時間を表示 CTime cTime; CString str; //2010.07.09_16-42-30 switch(mySwitch){ case 1: cTime = CTime::GetCurrentTime(); // 現在時刻 str = cTime.Format("%Y.%m.%d_%H-%M-%S"); // "YYYY/mm/dd HH:MM:SS"形式の時刻文字列を取得 break; case 2: cTime = CTime::GetCurrentTime(); // 現在時刻 str = cTime.Format("%Y/%m/%d %H:%M:%S"); // "YYYY/mm/dd HH:MM:SS"形式の時刻文字列を取得 break; default: break; } return str; }
    ◆ファイル名に使えない文字をアンダーバーに変換
    CString C○○Dlg::ProhibitFileName(CString tempFileName , BOOL AutoSkipMode){ //''■禁止文字 \ / : * ? " < > | if(tempFileName == _T("")){ return _T(""); } BOOL illegalStrFLG; illegalStrFLG = FALSE; if(tempFileName.Find(_T("\\"),0)>=0){ illegalStrFLG = TRUE; } if(tempFileName.Find(_T("/"),0)>=0){ illegalStrFLG = TRUE; } if(tempFileName.Find(_T(":"),0)>=0){ illegalStrFLG = TRUE; } if(tempFileName.Find(_T("*"),0)>=0){ illegalStrFLG = TRUE; } if(tempFileName.Find(_T("\?"),0)>=0){ illegalStrFLG = TRUE; } if(tempFileName.Find( _T("\""),0)>=0){ illegalStrFLG = TRUE; } if(tempFileName.Find( _T("<"),0)>=0){ illegalStrFLG = TRUE; } if(tempFileName.Find( _T(">"),0)>=0){ illegalStrFLG = TRUE; } if(tempFileName.Find( _T("|"),0)>=0){ illegalStrFLG = TRUE; } if(illegalStrFLG == FALSE){ return tempFileName; } if(AutoSkipMode == TRUE){ if (tempFileName !=_T("")){ tempFileName.Replace(_T("\\"), _T("_")); tempFileName.Replace(_T("/"), _T("_")); tempFileName.Replace(_T(":"), _T("_")); tempFileName.Replace(_T("*"), _T("_")); tempFileName.Replace(_T("\?"), _T("_")); tempFileName.Replace(_T("\""), _T("_")); tempFileName.Replace(_T("<"), _T("_")); tempFileName.Replace(_T(">"), _T("_")); tempFileName.Replace(_T("|"), _T("_")); } return tempFileName; } int myResult; myResult = MessageBox(_T("ファイル名に以下の文字は使用できません。\r\n禁止文字を _ に置き換えますか? (「いいえ」を選択した場合は、削除します。)\r\n \\ / : * \? \" < > |"), _T("禁止文字"), MB_YESNOCANCEL); if(myResult == IDYES){ if (tempFileName !=_T("")){ tempFileName.Replace(_T("\\"), _T("_")); tempFileName.Replace(_T("/"), _T("_")); tempFileName.Replace(_T(":"), _T("_")); tempFileName.Replace(_T("*"), _T("_")); tempFileName.Replace(_T("\?"), _T("_")); tempFileName.Replace(_T("\""), _T("_")); tempFileName.Replace(_T("<"), _T("_")); tempFileName.Replace(_T(">"), _T("_")); tempFileName.Replace(_T("|"), _T("_")); } return tempFileName; }else if(myResult == IDNO){ if (tempFileName !=_T("")){ tempFileName.Replace(_T("\\"), _T("")); tempFileName.Replace(_T("/"), _T("")); tempFileName.Replace(_T(":"), _T("")); tempFileName.Replace(_T("*"), _T("")); tempFileName.Replace(_T("\?"), _T("")); tempFileName.Replace(_T("\""), _T("")); tempFileName.Replace(_T("<"), _T("")); tempFileName.Replace(_T(">"), _T("")); tempFileName.Replace(_T("|"), _T("")); } return tempFileName; }else if(myResult == IDCANCEL){ return _T(""); } return _T(""); }
    ◆文字列が数値であるか?をチェックする関数
    //http://oshiete.goo.ne.jp/qa/1424060.html // #include <stdio.h> // #include <stdlib.h> // #include <ctype.h> BOOL C○○Dlg::myIsDigit_Func(CString targetStr){ if (targetStr==_T("")) return (FALSE); int sizeOfString_1 = (targetStr.GetLength() + 1); LPTSTR lpsz_1 = new TCHAR[ sizeOfString_1 ]; _tcscpy_s(lpsz_1, sizeOfString_1, targetStr); //char str[16]; int error; TCHAR *p; //do{ error=0; //fgets(str, sizeof(str), stdin); for(p=lpsz_1;*p!='\n' && *p;p++){ /* 一文字ずつ調べる */ if(!isdigit(*p)){ /* 数字文字以外が含まれていた */ error=1; /* エラー発見 */ //printf("数字以外の文字が含まれています\n"); break; } } //if(error) continue; /* エラーが起こっている時以下はスキップする */ //}while(!error); /* エラーでなければ繰り返す */ delete[] lpsz_1; return (!error); }
    ◆フォルダ内のファイル一覧の取得 複数選択可能
    void C○○Dlg::OnBnClickedBtnStepsearch() { // TODO: ここにコントロール通知ハンドラー コードを追加します。 //.Visible = FALSE; C○○Dlg::m_xvStatusString = _T("StepSearch 実行中"); UpdateData(FALSE); CString filter("ALL Files |*.*|Audio Files|*.mp3; *.wma; *.m4a|Document Files|*.xls; *.doc; *.ppt|Image Files|*.jpg; *.jpeg; *.gif; *.png; *.bmp|Movie Files|*.mpg; *.mpeg; *.asf; *.avi; *.mov; *.wmv; *.flv|Text Files|*.txt; *.text|HTML Files|*.htm; *.htm|PlayLIST Files|*.m3u; *.wpl||"); CString filePath, strBuf; POSITION pos = NULL; CFileDialog selDlg(TRUE, NULL, NULL, //http://q.hatena.ne.jp/1173014326 ショートカットファイルのリンクを辿らない OFN_NODEREFERENCELINKS OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT | OFN_NODEREFERENCELINKS , filter);//OFN_NODEREFERENCELINKS 追加 int err = 0, lbErr = 0; // ファイル名リスト用メモリ確保 if (!err) { try { selDlg.GetOFN().lpstrFile = strBuf.GetBuffer(MAX_PATH *100); selDlg.GetOFN().nMaxFile = MAX_PATH *100; } catch (...) {err = 1;} } if (!err) if (selDlg.DoModal() != IDOK) err = 1; if (!err) if ((pos = selDlg.GetStartPosition()) == NULL) err = 1; if (!err) { while (pos) { //MessageBox(); filePath = selDlg.GetNextPathName(pos); if (!err) { lbErr = C○○Dlg::ListInsertItem(filePath); if (lbErr == LB_ERR || lbErr == LB_ERRSPACE) err = 1; } if (err) break; } UpdateData(FALSE); } strBuf.ReleaseBuffer(); C○○Dlg::StatusStringSet(_T("StepSearch 終了"),300,TRUE); DrawMenuBar(); return; }
    ◆ファイルやディレクトリの存在確認&カレントディレクトリの取得
    CString C○○Dlg::CurrentDirFunc(CString tempPath,BOOL LocalDirFLG){ //'CurDirは使わない if(tempPath == _T("")){ return _T(""); } //If Dir(tempPath) = "" Then // CurrentDirFunc = "" // Exit Function //End If BOOL ExistsFLG = FALSE; if(LocalDirFLG == TRUE){ if ( PathFileExists(tempPath) ){ // ファイルは存在する ExistsFLG = TRUE; } else{ // ファイルは存在しない } if ( PathIsDirectory(tempPath) ){ // ディレクトリは存在する ExistsFLG = TRUE; } else{ // ディレクトリは存在しない } }else{ ExistsFLG = TRUE; } int SearchIDX = 0; int i = 0; if(ExistsFLG == TRUE){ for( i = tempPath.GetLength()-1; i >= 0; i--){ SearchIDX = tempPath.Find(_T("\\"),i); if(SearchIDX >= 0){ break; } } tempPath = tempPath.Left(SearchIDX); return tempPath; } return _T(""); }
    ◆ファイルを開く
    //★エクスプローラで開く if(FullPath.Right(1)!=_T("\\")){ ShellExecute( NULL, _T("open"), _T("C:\\WINDOWS\\EXPLORER.EXE"), _T("/select,") + FileName , FolderPath , SW_SHOWNORMAL ); }else{ ShellExecute( NULL, _T("open"), _T("C:\\WINDOWS\\EXPLORER.EXE"), FullPath , NULL , SW_SHOWNORMAL ); } //★エクスプローラで開く(2)【バグ修正版】 SetCurrentDirectory(FolderPath); if(FullPath.Right(1)!=_T("\\")){ ShellExecute( NULL, _T("open"), _T("C:\\WINDOWS\\EXPLORER.EXE"), _T("/select,.\\" + FileName) , FolderPath, SW_SHOWNORMAL ); }else{ ShellExecute( NULL, _T("open"), _T("C:\\WINDOWS\\EXPLORER.EXE"), FullPath , NULL , SW_SHOWNORMAL ); } //★関連付けられたプログラムで開く ShellExecute( NULL, _T("open"), _T("C:\\WINDOWS\\EXPLORER.EXE"), FileName , FolderPath , SW_SHOWNORMAL ); //★メディアプレイヤで開く ShellExecute( NULL, _T("open"), _T("C:\\Program Files\\Windows Media Player\\wmplayer.exe"), m3uFile , NULL , SW_SHOWNORMAL ); //★Linkファイルを開く(関連付けられたプログラムで開く) if(FileName.Right(4)==_T(".lnk")){ ShellExecute( NULL, _T("open"), _T("C:\\WINDOWS\\EXPLORER.EXE"), FileName , FolderPath , SW_SHOWNORMAL ); }else if(FullPath.Right(1)==_T("\\")){ ShellExecute( NULL, _T("open"), _T("C:\\WINDOWS\\EXPLORER.EXE"), FullPath , NULL , SW_SHOWNORMAL ); }
    ◆実行ファイルのフルパス取得
    //http://rararahp.cool.ne.jp/vc/vctips/api.htm // 実行ファイルのフルパス取得 TCHAR szPath[_MAX_PATH]; GetModuleFileName( NULL, szPath, MAX_PATH); // フルパスを分解 TCHAR szDir[_MAX_DIR]; TCHAR szDrive[_MAX_DRIVE]; TCHAR szFName[_MAX_FNAME]; TCHAR szExt[_MAX_EXT]; _splitpath(szPath,szDrive,szDir,szFName,szExt); // フォルダ、ファイル名取得 TCHAR szFilePath[_MAX_PATH]; TCHAR szFileName[_MAX_PATH]; sprintf(szFilePath,"%s%s",szDrive,szDir); sprintf(szFileName,"%s%s",szFName,szExt); //★実行ファイルがあるフォルダをエクスプローラで開く SetCurrentDirectory(FolderPath); ShellExecute( NULL, _T("open"), _T("C:\\WINDOWS\\EXPLORER.EXE"), _T(".\\") , NULL, SW_SHOWNORMAL );
    ◆文字列を小文字に変換
    CString str_1 = "ABC"; str_1.MakeLower(); CString C○○Dlg::myStrToLower_Func(CString FileSpecStr){ //http://oshiete.goo.ne.jp/qa/6356162.html int i; int sizeOfString = (FileSpecStr.GetLength() + 1); LPTSTR lpsz = new TCHAR[ sizeOfString ]; _tcscpy_s(lpsz, sizeOfString, FileSpecStr); //... modify lpsz as much as you want //return lpsz[sizeOfString]; //delete[] lpsz; for(i=0;i<sizeOfString;i++){ if(lpsz[i]=='\0')/*文字列の終わりなら抜ける*/{ break; }else if(isupper(lpsz[i])){ lpsz[i]=tolower(lpsz[i]); //else if(islower(lpsz[i])) //lpsz[i]=toupper(lpsz[i]); } } CString RetStr; RetStr = lpsz; return RetStr; delete[] lpsz; }
    ◆コンボボックスのIndexと関連付けて FormatDataNumを取得&セット
    m_Dlg->m_xcList.GetItemData(index,FormatDataNum); m_Dlg->m_xcList.SetItemData(index,FormatDataNum);
    ◆ESCボタンを押したら直ちに、処理を抜ける
    //http://okwave.jp/qa/q7039176.html ESCAPE_FLG = FALSE; while(1) { MSG msg; if ( PeekMessage(&msg,NULL,0,0,PM_REMOVE) ) { // メッセージを取得した場合0以外が返る if(msg.hwnd != GetDlgItem(IDC_EDIT_Item)->m_hWnd ){ //アイテム編集(ボックス表示)中じゃない時 if (msg.wParam == VK_ESCAPE){ // Esc を押したら ESCAPE_FLG = TRUE; break; //終了。メッセージループを抜ける。 } } TranslateMessage(&msg); DispatchMessage(&msg); //continue; //continueはない方が良い場合も } //ここに処理するコードを書く } if (ESCAPE_FLG == TRUE) break;//他の部分でもループを抜けるよう、フラグで制御する
    Arrow 戻る