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("&"));//出力前の置換は最初に行う
tempStr.Replace(_T("<"), _T("<"));
tempStr.Replace(_T(">"), _T(">"));
tempStr.Replace(_T("\""), _T("""));
tempStr.Replace(_T(" "), _T(" "));
tempStr.Replace(_T("(c)"), _T("©"));
tempStr.Replace(_T("(r)"), _T("®"));
tempStr.Replace(_T("'"),_T("'"));
tempStr.Replace(_T("^"),_T("&cric;"));
tempStr.Replace(_T("~"),_T("˜"));
tempStr.Replace(_T("-"),_T("–"));
tempStr.Replace(_T("‘"),_T("‘"));
tempStr.Replace(_T("’"),_T("’"));
tempStr.Replace(_T(","),_T("‚"));
}
if (tempStr !=_T("")){
tempStr.Replace(_T("<"), _T("<"));
tempStr.Replace(_T(">"), _T(">"));
tempStr.Replace(_T("""), _T("\""));
tempStr.Replace(_T(" "), _T(" "));
tempStr.Replace(_T("©"), _T("(c)"));
tempStr.Replace(_T("®"), _T("(r)"));
tempStr.Replace(_T("'"), _T("'"));
tempStr.Replace(_T("&cric;"), _T("^"));
tempStr.Replace(_T("˜"), _T("~"));
tempStr.Replace(_T("–"), _T("-"));
tempStr.Replace(_T("‘"), _T("‘"));
tempStr.Replace(_T("’"), _T("’"));
tempStr.Replace(_T("‚"), _T(","));
tempStr.Replace(_T("&"), _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;//他の部分でもループを抜けるよう、フラグで制御する