【VC++】関数テンプレートを利用する

<機能>

(1)関数テンプレートを利用してint/std::string型の配列をvectorに設定する

(2)vector(動的配列)を昇順でソートして返す

(3)std::coutで結果を出力する

 

<動作検証&開発環境>

Visual Studio Community 2019

Version16.1.1

 

<イメージ>

VC++,コンソールアプリケーション,vector

 

<使い方>

Windowsデスクトップウィザードでプロジェクトを作成する

Windowsデスクトップウィザード

コンソールアプリケーション(.exe)を指定する

ソースを追加する

 

#include <iostream>
#include <vector>
#include <algorithm>
//関数テンプレートを利用する
template<typename T> void MakeArrayAndSort(std::vector<T>* myArray, T myData[], int count);
int main()
{
    //出力文字列
    std::string str("");
    //テンプレートの型がintのとき
    int arrayInt[] = { 9,12,5,20,1 };
    std::vector<int> myIntArray;
    //テンプレート関数を呼び出し、vectorに格納して昇順でソート
    MakeArrayAndSort<int>(&myIntArray,arrayInt,5);
    for (auto itr = myIntArray.begin(); itr != myIntArray.end(); ++itr)
    {
        char buf[512];
        memset(&buf, 0x0,sizeof(buf));
        sprintf_s(buf, "%d ", *itr);
        str.append(buf);
    }
    str.append("¥r¥n");
    //テンプレートの型がstd::stringのとき
    std::string arrayString[] = {"Willson","Johnson","Smith","Davis","Brown"};
    std::vector<std::string> myStringArray;
    //テンプレート関数を呼び出し、vectorに格納して昇順でソート
    MakeArrayAndSort<std::string>(&myStringArray, arrayString, 5);
    for (auto itr = myStringArray.begin(); itr != myStringArray.end(); ++itr)
    {
        str.append(*itr + " ");
    }
    //結果を出力
    std::cout << str << "¥r¥n";
}
/******************************************************
配列をvectorに格納、ソートして返す
  myArray:格納先vector(動的配列)
  myData :格納するデータ(ソート前)
  count  :データの要素数
******************************************************/

template<typename T> void MakeArrayAndSort(std::vector<T>* myArray,T myData[],int count)
{
    for (int i = 0; i < count; i++)
    {
        myArray->push_back(myData[i]);
    }
    //降順でソートするときはgreaterを指定
    //std::sort(myArray->begin(), myArray->end(), std::greater<T>());
    //昇順でソート
    std::sort(myArray->begin(), myArray->end(), std::less<T>());
}

 

よろしければポチッと押してください


プログラマー ブログランキングへ


【VC++】2進数を10進数に変換/10進数を2進数に変換

0

    <機能>

    (1)エディットボックスに入力された2進数文字列を10進数文字列に変換する

    (2)エディットボックスに入力された10進数文字列を2進数文字列に変換する

     

    <動作検証&開発環境>
    Visual Studio Community 2017

    Version15.9.7

     

    <イメージ>

    MFC,2進数文字列を10進数文字列に変換

     

    <使い方>

    (1)MFCアプリケーションでプロジェクトを作成

    (2)アプリケーションの種類に ダイアログベース を指定

    MFCアプリケーション

    (3)ダイアログにUIを配置する

    リソースエディター

    (4)エディットボックスにメンバ変数を追加する

    ※UpdateDataでアクセスするため

    エディットボックスにメンバ変数を追加

    (5)ラベルにメンバ変数を追加する

    ※UpdateDataでアクセスするため

    ラベルにメンバ変数を追加

    (6)ソースを追加する

     

     

    MFCApplication1Dlg.h

    class CMFCApplication1Dlg : public CDialogEx
    {
        //~~省略~~


    public:
        afx_msg void OnBnClickedButton1();
        CString m_Edit1;
        CButton *cb;
        CString m_Label1;
    };

    MFCApplication1Dlg.cpp

    //プロトタイプ宣言
    CString ConvertBinary2Decimal(CString moji);
    CString ConvertDecimal2Binary(CString moji);

    CMFCApplication1Dlg::CMFCApplication1Dlg(CWnd* pParent /*=nullptr*/)
        : CDialogEx(IDD_MFCAPPLICATION1_DIALOG, pParent)
        , m_Edit1(_T(""))
        , m_Label1(_T(""))
    {
        m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }

    void CMFCApplication1Dlg::DoDataExchange(CDataExchange* pDX)
    {
        CDialogEx::DoDataExchange(pDX);
        DDX_Text(pDX, IDC_EDIT1, m_Edit1);
        DDX_Text(pDX, IDC_Label1, m_Label1);
    }

    BEGIN_MESSAGE_MAP(CMFCApplication1Dlg, CDialogEx)
        ON_WM_SYSCOMMAND()
        ON_WM_PAINT()
        ON_WM_QUERYDRAGICON()
        ON_BN_CLICKED(IDC_BUTTON1, &CMFCApplication1Dlg::OnBnClickedButton1)
    END_MESSAGE_MAP()

    BOOL CMFCApplication1Dlg::OnInitDialog()
    {
        CDialogEx::OnInitDialog();

     

        //〜〜省略〜〜

        //ラジオボタンの初期値を設定
        cb = (CButton*)GetDlgItem(IDC_RADIO1);
        cb->SetCheck(TRUE);

        return TRUE;
    }

    /******************************************************
    ボタンクリックイベントハンドラ
    ラジオボタンの選択により処理を分岐する
      2進数を10進数に変換:ConvertBinary2Decimal
      10進数を2進数に変換:ConvertDecimal2Binary
    ******************************************************/

    void CMFCApplication1Dlg::OnBnClickedButton1()
    {
        CString cs,csRet;
        //エディットボックスの内容をメンバ変数にセット
        UpdateData(TRUE);
        if (m_Edit1.GetLength() == 0) return;

        //入力文字列チェック&変換
        if (cb->GetCheck())
        {
            //入力値チェック
            if (m_Edit1 != m_Edit1.SpanIncluding(L"01"))
            {
                AfxMessageBox(L"2進数は0か1を入力してください", MB_ICONERROR);
                return;
            }
            else
            {
                //上限桁数はunsigned intのマックス値まで
                if (m_Edit1.GetLength() > 32)
                {
                    AfxMessageBox(L"入力2進数は32桁がマックス値です", MB_ICONERROR);
                    return;
                }
            }

            //2進数から10進数に変換
            m_Label1 = ConvertBinary2Decimal(m_Edit1);
            UpdateData(FALSE);

        }
        else
        {
            //入力値チェック
            if (m_Edit1 != m_Edit1.SpanIncluding(L"0123456789"))
            {
                AfxMessageBox(L"10進数は0-9の数値を入力してください", MB_ICONERROR);
                return;
            }
            else
            {
                //上限桁数はunsigned intのマックス値まで
                if (m_Edit1.GetLength() > 10)
                {
                    AfxMessageBox(L"入力10進数は10桁がマックス値です", MB_ICONERROR);
                    return;
                }
                else if (m_Edit1.GetLength() == 10)
                {
                    if (m_Edit1 > L"4294967295")
                    {
                        AfxMessageBox(L"入力10進数はunsigned intの上限がマックス値です", MB_ICONERROR);
                        return;
                    }
                }
            }

            //10進数から2進数に変換
            m_Label1 = ConvertDecimal2Binary(m_Edit1);
            UpdateData(FALSE);
        }
    }

    /******************************************************
    2進数文字列を10進数文字列に変換する
    符号なし/unsigned intのマックス値まで変換可能
    引 数:2進数文字列
    戻り値:10進数文字列
    ******************************************************/

    CString ConvertBinary2Decimal(CString moji)
    {
        CString csRet(L""),cwk;
        unsigned int uiRet = 0;
        for (int i = 0; i < moji.GetLength(); i++)
        {
            cwk = moji.Mid(i, 1);
            if (cwk == L"1")
            {
                uiRet += (unsigned int)pow(2, (moji.GetLength() - 1) - i);
            }
        }
        csRet.Format(L"%u",uiRet);
        return csRet;
    }

    /******************************************************
    10進数文字列を2進数文字列に変換する
    符号なし/unsigned intのマックス値まで変換可能
    引 数:10進数文字列
    戻り値:2進数文字列
    ******************************************************/

    CString ConvertDecimal2Binary(CString moji)
    {
        CString csRet(L""), cwk;
        wchar_t wt[20];
        ZeroMemory(&wt, sizeof(wchar_t) * 20);
        wsprintf(wt,L"%s", moji);

        unsigned int idecimal = 0,ui;
        //_ttoiによる数値変換だとintの最大値に丸められるため独自に計算する
        //idecimal = _ttoi(moji)
        for (int i = 0; i < moji.GetLength(); i++)
        {
            cwk = moji.Mid(i, 1);
            ui = _ttoi(cwk);
            idecimal += ((unsigned int)pow(10, (moji.GetLength() - 1) - i) * ui);
        }

        unsigned int syo, amari;
        for(;;)
        {
            syo = idecimal / 2;
            amari = idecimal % 2;

            cwk.Format(L"%u",amari);
            csRet = (cwk + csRet);

            //商が0になったら終了
            if (syo == 0) break;
            idecimal = syo;
        }
        return csRet;
    }

     

    よろしければポチッと押してください


    プログラマー ブログランキングへ

     
     


    【VC++】レジストリからWindows10のバージョン情報を取得する

    0

      <機能>

      (1)RegOpenKeyExでレジストリをオープンします

         HKEY_LOCAL_MACHINE

         SOFTWARE¥Microsoft¥Windows NT¥CurrentVersion

      (2)RegQueryValueExを使ってレジストリの値を取得します

         ProductName

         ReleaseId

         CurrentBuildNumber

         UBR

      (3)Windows10のバージョン情報を表示します

      Winver,WIndows10,バージョン情報表示,

       

      <動作検証&開発環境>
      Visual Studio Community 2017

       

      <イメージ>

      OS Windows 10 Enterprise

      バージョン 1803

      OSビルド 17134.345

       

      Version情報,実行イメージ,ProductName,ReleaseId,CurrentBuildNumber,UBR,

       

      <使い方>

      (1)プロジェクトの選択でデスクトップウィザードを指定します

         アプリケーションの種類:コンソールアプリケーション

         共通ヘッダの追加:MFCにチェック

      (2)コードを記述します

       

      //プロトタイプ宣言
      CString GetWindows10Version();
      CString GetRegDataText(DWORD dwType, DWORD dwSize, TCHAR *buf, CString csEntry);
      const int DMAX_SIZE = 256;

       

      int main()
      {
          if (hModule != nullptr)
          {
              // MFC を初期化して、エラーの場合は結果を印刷します。
              if (!AfxWinInit(hModule, nullptr, ::GetCommandLine(), 0))
              {
                  //〜〜省略〜〜
              }
              else
              {

                  //Window10のバージョン情報をレジストリから取得
                  CString csRet = GetWindows10Version();
                  //結果を出力
                  AfxMessageBox(csRet, MB_ICONINFORMATION);
              }
          }
          else
          {
              //〜〜省略〜〜
          }

          return nRetCode;
      }

       

      /******************************************************
      GetWindows10Version
      レジストリからRegQueryValueExを使用してバージョン情報を取得する

       

      戻り値
       バージョン情報(タイプ/サイズ/値)
      ******************************************************/

      CString GetWindows10Version()
      {
          HKEY hKey = nullptr; //レジストリキーのハンドル
          LONG lRet;
          CString csRet=_T("");
          TCHAR buf[DMAX_SIZE];
          DWORD dwSize,dwType,dwVal=0;

          //レジストリオープン
          lRet = RegOpenKeyEx(
              HKEY_LOCAL_MACHINE,
              _T("SOFTWARE¥¥Microsoft¥¥Windows NT¥¥CurrentVersion"),
              0,
              KEY_QUERY_VALUE,
              &hKey
          );
          //レジストリオープンエラー
          if (lRet != ERROR_SUCCESS)
          {
              csRet = _T("RegOpenKeyExエラー");
              goto lbl_Error;
          }

          //RegQueryValueExについてはDeveloperNetwork参照
          //// プロダクト(OS)を取得 //////////
          dwSize = DMAX_SIZE;
          ZeroMemory(&buf, DMAX_SIZE*2);
          lRet = RegQueryValueEx(
              hKey,
              _T("ProductName"),
              0,
              &dwType,
              (LPBYTE)buf,
              &dwSize
          );
          //プロダクト 値取得エラー
          if (lRet != ERROR_SUCCESS)
          {
              csRet = _T("RegQueryValueEx(ProductName)エラー");
              goto lbl_Error;
          }
          csRet = _T("【Windows Version情報】¥r¥n");
          csRet += GetRegDataText(dwType, dwSize, buf, _T("ProductName"));

       

          //// リリースIDを取得 //////////
          dwSize = DMAX_SIZE;
          ZeroMemory(&buf, DMAX_SIZE * 2);
          lRet = RegQueryValueEx(
              hKey,
              _T("ReleaseId"),
              0,
              &dwType,
              (LPBYTE)buf,
              &dwSize
          );
          //リリースID 値取得エラー
          if (lRet != ERROR_SUCCESS)
          {
              csRet = _T("RegQueryValueEx(ReleaseId)エラー");
              goto lbl_Error;
          }
          csRet += GetRegDataText(dwType, dwSize, buf,_T("ReleaseId"));

       

          //// ビルドバージョンを取得 //////////
          dwSize = DMAX_SIZE;
          ZeroMemory(&buf, DMAX_SIZE * 2);
          lRet = RegQueryValueEx(
              hKey,
              _T("CurrentBuildNumber"),
              0,
              &dwType,
              (LPBYTE)buf,
              &dwSize
          );
          //ビルドバージョン 値取得エラー
          if (lRet != ERROR_SUCCESS)
          {
              csRet = _T("RegQueryValueEx(CurrentBuildNumber)エラー");
              goto lbl_Error;
          }
          csRet += GetRegDataText(dwType, dwSize, buf, _T("CurrentBuildNumber"));

       

          //// ビルドバージョン(UBR)を取得 //////////
          dwSize = DMAX_SIZE;
          ZeroMemory(&buf, DMAX_SIZE * 2);
          lRet = RegQueryValueEx(
              hKey,
              _T("UBR"),
              0,
              &dwType,
              (LPBYTE)buf,
              &dwSize
          );
          //ビルドバージョン(UBR) 値取得エラー
          if (lRet != ERROR_SUCCESS)
          {
              csRet = _T("RegQueryValueEx(UBR)エラー");
              goto lbl_Error;
          }
          csRet += GetRegDataText(dwType, dwSize, buf, _T("UBR"));

      lbl_Error:
          if (hKey != NULL)
          {
              //レジストリクローズ
              RegCloseKey(hKey);
          }
          return csRet;
      }

      /******************************************************
      GetRegDataText
      取得したタイプ(データ型)/サイズ/値より表示用文字列を生成

       

      引数
       dwType  : タイプ(データ型)
       dwSize  : データサイズ
       buf     : レジストリの値
       csEntry : レジストリのエントリ名
      戻り値
       表示用文字列
      ******************************************************/

      CString GetRegDataText(DWORD dwType,DWORD dwSize,TCHAR *buf,CString csEntry)
      {
          CString csRet = _T("¥r¥n=== ") + csEntry + _T(" ==========¥r¥n");
          CString cwk;
          int iwk;

          //読みだしたタイプに応じてサイズと値を設定
          //ここでは必要なタイプのみ設定するがタイプの詳細はDeveloperNetwork参照
          switch (dwType)
          {
          case REG_DWORD:
              iwk = (int)buf[0];
              cwk.Format(_T("   VALUE: %d¥r¥n   SIZE: %d  TYPE: REG_DWORD¥r¥n"), iwk, dwSize);
              break;
          case REG_SZ:
              cwk.Format(_T("   VALUE: %s¥r¥n   SIZE: %d  TYPE: REG_SZ¥r¥n"), buf, dwSize);
              break;
          }
         
          csRet += cwk;
          return csRet;
      }

       

      よろしければポチッと押してください


      プログラマー ブログランキングへ


      【VC++】非矩形のダイアログを作成する

      0

        <機能>

        (1)CreateEllipticRgnで楕円形のリージョン(Crgn)を作成します

        (2)CreateRectRgnで四角形のリージョン(CRgn)を作成します

        (3)CombineRgnでリージョンを結合します

        (4)SetWindowRgnで非矩形ウィンドウを作成します

         

        <動作検証&開発環境>
        Visual Studio Community 2017

         

        <イメージ>

        元のダイアログ

        MFC,非矩形ウィンドウ,画面イメージ1

        [楕円1個]ボタン押下により楕円形のウィンドウに切り替え

        MFC,非矩形ウィンドウ,画面イメージ2

        [楕円2個]ボタン押下により楕円形2個のウィンドウに切り替え

        MFC,非矩形ウィンドウ,画面イメージ3

        [楕円くり抜き]ボタン押下により左右の矩形と楕円をXORしたウィンドウに切り替え

        MFC,非矩形ウィンドウ,画面イメージ4

        CombineRgnされた矩形ダイアログと楕円ダイアログのXOR部分が透明になります

        MFC,非矩形ウィンドウ,RGN_XOR,

         

        <使い方>

        (1)MFCアプリケーションでプロジェクトを作成

        (2)アプリケーションの種類でダイアログベースを選択

        MFC,非矩形ウィンドウ,ウィザード,アプリケーションの種類,

        (3)生成されたクラスで基底クラスにCDialogを選択

        MFC,非矩形ウィンドウ,ウィザード,生成されたクラス,

        (4)MFCApplication1.rcを下記の通り修正

        ※MFCApplication1は各環境のプロジェクト名

        MFC,非矩形ウィンドウ,ウィザード,ダイアログアプリの既存バグ修正,

        (5)クラスウィザードでWM_NCHITTESTメッセージを追加

        ※非矩形ウィンドウはタイトルバーがなくなるためタイトルバー以外でドラッグ移動できるようにする

        MFC,非矩形ウィンドウ,クラスウィザード,

        (6)ボタンを追加します(ダイアログの中央に集めてください)

        MFC,非矩形ウィンドウ,リソース追加,

        (7)ソースを追加します

         

        MFCApplication1Dlg.h
        // CMFCApplication1Dlg ダイアログ
        class CMFCApplication1Dlg : public CDialog
        {
            //〜〜省略〜〜
        private:
            int m_iTh;
            int m_iEw;
            int m_iEh;
            CRect m_Rect;
        public:
            afx_msg void OnBnClickedEllipse2();
            afx_msg void OnBnClickedEllipse1();
            afx_msg void OnBnClickedButton();
            afx_msg LRESULT OnNcHitTest(CPoint point);
        };

        MFCApplication1Dlg.cpp
        // CMFCApplication1Dlg メッセージ ハンドラー
        BOOL CMFCApplication1Dlg::OnInitDialog()
        {
            CDialog::OnInitDialog();
            //〜〜省略〜〜
            // クライアント領域(タイトルバーなどを除いた領域)のサイズを取得
            GetClientRect(&m_Rect);
            // タイトルバーの高さ
            m_iTh = GetSystemMetrics(SM_CYCAPTION);
            // ダイアログ枠線の幅
            m_iEw = GetSystemMetrics(SM_CXFRAME);
            // サイズ調整
            m_iEw += 5;
            // ダイアログ枠線の高さ
            m_iEh = GetSystemMetrics(SM_CYFRAME);
            // サイズ調整
            m_iEh += 5;
            return TRUE;
        }
        /*************************************************
        関数名 OnBnClickedNormal
        機能   [もとに戻す] ボタン押下イベント
        *************************************************/

        void CMFCApplication1Dlg::OnBnClickedNormal()
        {
            // ウィンドウを元に戻す
            SetWindowRgn(0, TRUE);
        }
        /*************************************************
        関数名 OnBnClickedEllipse1
        機能   [楕円1個] ボタン押下イベント
        *************************************************/

        void CMFCApplication1Dlg::OnBnClickedEllipse1()
        {
            CRgn rgn;
            int th = m_iTh + m_iEh;
            // 指定した領域(左上X座標,左上Y座標,右下X座標,右下Y座標)で楕円リージョンを作成
            rgn.CreateEllipticRgn(m_iEw, th, m_Rect.Width()+m_iEw, m_Rect.Height()+th);
            // 非矩形ウィンドウを作成する
            SetWindowRgn(rgn, TRUE);
        }
        /*************************************************
        関数名 OnBnClickedEllipse2
        機能   [楕円2個] ボタン押下イベント
        *************************************************/

        void CMFCApplication1Dlg::OnBnClickedEllipse2()
        {
            CRgn rgn, rgn1, rgn2;
            int th = m_iTh + m_iEh;
            // 指定した領域(左上X座標,左上Y座標,右下X座標,右下Y座標)で楕円リージョンを作成
            rgn1.CreateEllipticRgn(m_iEw, th, (m_Rect.Width() / 2)+m_iEw, m_Rect.Height()+th);
            rgn2.CreateEllipticRgn((m_Rect.Width() / 2)+m_iEw, th, m_Rect.Width() + m_iEw, m_Rect.Height() + th);
            rgn.CreateRectRgn(0, 0, 1, 1);
            // 2つのリージョン(rgn1とrgn2)を結合する
            // 結合するときに実行する操作はDeveloperNetwork参照
            int iResult = rgn.CombineRgn(&rgn1, &rgn2, RGN_OR);
            if (iResult == ERROR || iResult == NULLREGION)
            {
                AfxMessageBox(L"リージョン結合(CombineRgn)に失敗しました", MB_ICONERROR);
                OnBnClickedNormal();
                return;
            }
            rgn1.DeleteObject();
            rgn2.DeleteObject();
            // 非矩形ウィンドウを作成する
            SetWindowRgn(rgn, TRUE);
        }
        /*************************************************
        関数名 OnBnClickedButton
        機能   [楕円くり抜き] ボタン押下イベント
        *************************************************/

        void CMFCApplication1Dlg::OnBnClickedButton()
        {
            CRgn rgn, rgn1, rgn2,rgn3;
            int th = m_iTh + m_iEh;
            int iResult;
            // 指定した領域で四角形リージョンを作成
            // 詳細はDeveloperNetwork参照
            rgn1.CreateRectRgn(m_iEw, th, 150, m_Rect.Height()+th);
            rgn2.CreateRectRgn(m_Rect.Width()-150, th, m_Rect.Width()+m_iEw, m_Rect.Height()+th);
            rgn.CreateRectRgn(0, 0, 1, 1);
            // リージョンを結合する
            iResult = rgn.CombineRgn(&rgn1, &rgn2, RGN_OR);
            if (iResult == ERROR || iResult == NULLREGION)
            {
                AfxMessageBox(L"リージョン結合(CombineRgn)に失敗しました",MB_ICONERROR);
                OnBnClickedNormal();
                return;
            }
            // 指定した領域で楕円リージョンを作成
            rgn3.CreateEllipticRgn(m_iEw, th, m_Rect.Width()+m_iEw, m_Rect.Height()+th);
            // rgnにrgn3を結合する
            // 結合する際に実行する操作としてRGN_XORを指定(詳細はDeveloperNetwork参照)
            iResult = rgn.CombineRgn(&rgn, &rgn3, RGN_XOR);
            if (iResult == ERROR || iResult == NULLREGION)
            {
                AfxMessageBox(L"リージョン結合(CombineRgn)に失敗しました", MB_ICONERROR);
                OnBnClickedNormal();
                return;
            }
            rgn1.DeleteObject();
            rgn2.DeleteObject();
            rgn3.DeleteObject();
            // 非矩形ウィンドウを作成する
            SetWindowRgn(rgn, TRUE);
        }
        /*************************************************
        関数名 OnNcHitTest
        機能   タイトルバーがなくてもクライアント領域でウィンドウ移動を可能とする
        *************************************************/

        LRESULT CMFCApplication1Dlg::OnNcHitTest(CPoint point)
        {
            return HTCAPTION;
        }

        よろしければポチッと押してください


        プログラマー ブログランキングへ


        【VC++】CFile::GetStatusでファイルステータスを取得する

        0

          <機能>

          (1)ファイル選択ダイアログでファイルを指定します

          (2)指定ファイルのCFile::GetStatusでファイルステータスを取得します

           

          CFileStatus構造体
          CTime m_ctime ファイルの作成日時
          CTime m_mtime ファイルの最終更新日時
          CTime m_atime ファイルが読み取りで最後にアクセスされた日時
          ULONGLONG m_size ファイルの論理サイズ
          BYTE m_attribute ファイル属性
          char m_szFullName ファイルパス

           

          (3)ファイル属性(m_attribute)を取得します

          (4)ファイルステータスの取得結果をメッセージボックスで表示します

           

          <動作検証&開発環境>
          Visual Studio Community 2017

           

          <イメージ>

          CFile,GetStatus,CFileStatus,m_attribute,

           

          <使い方>

          (1)"Windowsデスクトップウィザード" を選択します

          (2)コンソールアプリケーション(.exe)を選択します

          (3)MFCにチェックを入れます

          CFile,GetStatus,ウィザード,

          (4)コードを記述します

           

          const int DMAX_FILEPATH = 4096;
          //プロトタイプ宣言
          BOOL GetAttribute(CString csBuff);
          BOOL GetFilePath(CString csCur, CString &csBuff);
          using namespace std;
          int main()
          {

              int nRetCode = 0;
              HMODULE hModule = ::GetModuleHandle(nullptr);
              if (hModule != nullptr)
              {

                  //~~省略~~
                  }
                  else
                  {

                      //バッファ宣言
                      CString csBuff("");
                      CString csCur("");
                     
                      //ファイル選択ダイアログの初期値に実行フォルダを指定
                      wchar_t wct[DMAX_FILEPATH];
                      ZeroMemory(&wct, sizeof(wct));
                      GetModuleFileName(NULL, wct, sizeof(wct));
                      CString cwk;
                      cwk.Format(L"%s",wct);
                      wchar_t c = L'¥u00A5'; //C4566警告対応
                      csCur = cwk.Left(cwk.ReverseFind(c));
                      //ファイル選択ダイアログでファイル指定
                      if(!GetFilePath(csCur,csBuff))
                      {
                          return nRetCode;
                      }
                      //ファイルの属性を取得する
                      if (!GetAttribute(csBuff))
                      {
                          return nRetCode;
                      }
                  }
              }
              else
              {
                  // TODO: 必要に応じてエラー コードを変更してください。
                  wprintf(L"致命的なエラー: GetModuleHandle が失敗しました¥n");
                  nRetCode = 1;
              }
              return nRetCode;
          }
          /***********************************************************
          GetAttribute
          ファイルの属性を取得する
          詳細はDeveloper Network(CFile::GetSatus)参照
          パラメータ
           csBuff : 選択ファイル
          戻り値
           true : CFileStatus取得成功
           false : CFileStatus取得失敗
          ***********************************************************/

          BOOL GetAttribute(CString csBuff)
          {
              CString csMsg(""), cwk("");
              CFileStatus status;
              CFile cfile;
              if (cfile.GetStatus(csBuff, status))
              {
                  //CTimeオブジェクトを書式設定
                  //ファイルパス
                  cwk.Format(L"ファイルパス : %s¥n",status.m_szFullName);
                  csMsg = cwk;
                  //ファイルサイズ
                  cwk.Format(L"ファイルサイズ : %I64uバイト¥n",status.m_size);
                  csMsg += cwk;
                  //ファイル作成日時
                  cwk = status.m_ctime.Format(L"ファイルの作成日時 : %Y-%m-%d %H:%M:%S¥n");
                  csMsg += cwk;
                  //ファイル最終更新日時
                  cwk = status.m_mtime.Format(L"ファイルの最終更新日時 : %Y-%m-%d %H:%M:%S¥n");
                  csMsg += cwk;
                  //ファイル最終アクセス日時
                  cwk = status.m_atime.Format(L"ファイルの最終アクセス日時 : %Y-%m-%d %H:%M:%S¥n");
                  csMsg += cwk;
                  //アトリビュート(読み取り専用)
                  if (status.m_attribute & CFile::readOnly)
                  {
                      csMsg += L"CFile::readOnly(0x01)¥n";
                  }
                  //アトリビュート(隠しファイル)
                  if (status.m_attribute & CFile::hidden)
                  {
                      csMsg += L"CFile::hidden(0x02)¥n";
                  }
                  //アトリビュート(システムファイル)
                  if (status.m_attribute & CFile::system)
                  {
                      csMsg += L"CFile::system(0x04)¥n";
                  }
                  //アトリビュート(ディレクトリ)
                  if (status.m_attribute & CFile::directory)
                  {
                      csMsg += L"CFile::directory(0x10)¥n";
                  }
              }
              else {
                  return FALSE;
              }
              AfxMessageBox(csMsg,MB_ICONINFORMATION);
              return TRUE;
          }
          /***********************************************************
          SelectFile
          ファイルダイアログでファイルを選択する
          詳細はDeveloper Network(CFileDialog)参照
          パラメータ
           csCur[in] : ファイル選択ダイアログの初期表示フォルダ
           csBuff[out] : 選択ファイル
          戻り値
           true : ファイル選択ダイアログでファイルが選択された
           false : ファイル選択ダイアログでキャンセルされた
          ***********************************************************/

          BOOL GetFilePath(CString csCur,CString &csBuff)
          {
              csBuff = "";
              wchar_t *p = csBuff.GetBuffer(DMAX_FILEPATH);
             
              //ファイルを開くダイアログ:TRUE
              //ファイルを保存ダイアログ:FALSE
              CFileDialog dlg(TRUE);
              //OPENFILENAME構造体に値をセット
              OPENFILENAME &ofn = dlg.GetOFN();
              //ダイアログタイトル
              ofn.lpstrTitle = L"ファイルを1つ選択してください";
              //存在するファイル名のみ選択できる
              ofn.Flags |= OFN_FILEMUSTEXIST;
              //初期表示フォルダ
              ofn.lpstrInitialDir = csCur;
              //ファイル選択ダイアログ表示
              if (dlg.DoModal() != IDOK)
              {
                  csBuff.ReleaseBuffer();
                  return FALSE;
              }
              POSITION pos = dlg.GetStartPosition();
              csBuff = dlg.GetNextPathName(pos);
              wchar_t c = L'¥u00A5';  //C4566警告対応
              csCur = csBuff.Left(csBuff.ReverseFind(c));
              csBuff.ReleaseBuffer();
              return TRUE;
          }

          よろしければポチッと押してください


          プログラマー ブログランキングへ

           



          | 1/7PAGES | >>