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

<機能>

(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;
        }

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


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

         


        【VC++】SDIにマウスイベントで四角形を描画する

        0

          <機能>

          (1)MFCのSDIアプリケーションにマウスイベントを追加します

           WM_MOUSELEAVE : ウィンドウのクライアント領域を離れた

           WM_MOUSEMOVE : マウスカーソルが動いた

           WM_RBUTTONDOWN : マウスの右ボタンが押下された

           WM_RBUTTONUP : マウスの右ボタンが解放された

          (2)マウスの右ボタンでクライアント領域をドラッグすると四角形を描画します

           CDC->Rectangle

          (3)メニューで描画する四角形の塗りつぶし色、線の種類を変更できます

           塗りつぶし色

           ・赤系の色

           ・緑系の色

           ・青系の色

           線のスタイル

           ・実線(PS_SOLID)

           ・破線(PS_DASH)

           ・点線(PS_DOT)

           

          <実行イメージ>

          メニューを指定すると描画する四角形の色と線のスタイルが変更できます

          VisualStudio,MFC,C++,MOUSE,GetMenu,GetMenuState,
           

          マウスの右ボタン押下するとスタート位置セット、

          マウスの右ボタンUPすると終了位置をセットして四角形を描画します

          VisualStudio,MFC,C++,MOUSE,OnCommand,CheckMenuRadioItem,
           

          <動作検証&開発環境> 
          Visual Studio Community 2017 
           
          <使い方> 
          1.MFCアプリケーションでプロジェクトを作成 
          2.アプリケーションの種類でシングルドキュメントを選択 

          ※その他の設定は下図参照

          VisualStudio,MFC,C++,MOUSE,アプリケーションの種類,ウィザード,
          3.ユーザーインターフェイス機能でクラシックメニューを使用するを選択

          ※その他の設定は下図参照

          VisualStudio,MFC,C++,MOUSE,ユーザーインターフェイス,ウィザード,
           

          4.高度な機能で不要なチェックを外す

          VisualStudio,MFC,C++,MOUSE,高度な機能,ウィザード,
           

          5.プロジェクト構成を確認してソースを追加する

          VisualStudio,MFC,C++,MOUSE,ソリューションエクスプローラー,
          6.クラスウィザードでCChileViewクラスにマウスイベントハンドラを追加

          WM_MOUSELEAVE : クライアント領域の外にカーソルが移動したとき座標を初期化

          WM_MOUSEMOVE : 移動中のマウスカーソルを変更する

          WM_RBUTTONDOWN : マウスの右ボタンでスタート座標取得

          WM_RBUTTONUP : マウスの右ボタンUPで終了座標取得して描画

          VisualStudio,MFC,C++,MOUSE,クラスウィザード,マウスイベント追加,
           

          7.リソースの[Menu]->[IDR_MAINFRAME]を修正してメニュー項目を追加

          以下項目を追加します

           赤系の色 : ID_32771 

           緑系の色 : ID_32772 

           青系の色 : ID_32773

           ――境界線をセット――

           実線 : ID_32774

           破線 : ID_32775

           点線 : ID_32776

          ※塗りつぶし色と線のスタイルはCheckMenuRadioItemでそれぞれグループ化します

          VisualStudio,MFC,C++,MOUSE,Menu,Resource,
          メニューのIDはここではID_32771~ID32776ですがソース内もそれぞれの環境に応じて変更してください

           

          8.クラスウィザードでCMainFrameにOnCommandを追加します

          メニューが操作されたとき塗りつぶし色、線のスタイルを変更する

          VisualStudio,MFC,C++,MOUSE,クラスウィザード,CMainFrame,
           

           

          MFCApplication1.h
          class CMFCApplication1App : public CWinApp
          {
          //〜〜省略〜〜

           

          //グローバル変数
          public:
              //メニューでの選択値
              COLORREF selClr;
              COLORREF selLinfClr;
              int iSelStyle;
          };
          extern CMFCApplication1App theApp;


          MainFrm.h
          class CMainFrame : public CFrameWnd
          {
          //〜〜省略〜〜

           

          private:
              //塗りつぶしの色
              COLORREF clr[3] = {
                  RGB(216,130,187),
                  RGB(146,208,80),
                  RGB(155,194,230)
              };
              //線の色
              COLORREF lineclr[3] = {
                  RGB(199,73,157),
                  RGB(97,148,40),
                  RGB(47,117,181)
              };
              //線のスタイル
              int iStyle[3] = {
                  PS_SOLID,
                  PS_DASH,
                  PS_DOT
              };

              
              virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
          };


          MainFrm.cpp
          #include "stdafx.h"
          #include "MFCApplication1.h"
          #include "MainFrm.h"

          //CMainFrameオブジェクト
          extern CMFCApplication1App theApp;

           

          int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
          {

              //〜〜省略〜〜

           

              CMenu *pMenu = this->GetMenu();
              //ON_COMMAND ハンドラーが自動的に無効になるのを停止
              CFrameWnd::m_bAutoMenuEnable = FALSE;
              //全てのメニューを有効化
              pMenu->EnableMenuItem(ID_32771, MF_BYCOMMAND | MF_ENABLED);
              pMenu->EnableMenuItem(ID_32772, MF_BYCOMMAND | MF_ENABLED);
              pMenu->EnableMenuItem(ID_32773, MF_BYCOMMAND | MF_ENABLED);
              pMenu->EnableMenuItem(ID_32774, MF_BYCOMMAND | MF_ENABLED);
              pMenu->EnableMenuItem(ID_32775, MF_BYCOMMAND | MF_ENABLED);
              pMenu->EnableMenuItem(ID_32776, MF_BYCOMMAND | MF_ENABLED);

              //色のメニューをグループ化して赤系にチェックOn

              //CheckMenuRadioItemについてはDeveloperNetwork参照
              pMenu->CheckMenuRadioItem(ID_32771, ID_32773, ID_32771, MF_BYCOMMAND);
              //線のメニューをグループ化して実線にチェックOn
              pMenu->CheckMenuRadioItem(ID_32774, ID_32776, ID_32774, MF_BYCOMMAND);
              //初期値をセット
              theApp.selClr = clr[0];
              theApp.selLinfClr = lineclr[0];
              theApp.iSelStyle = iStyle[0];

              return 0;
          }

          /***********************************************************
          OnCommand
          メニューが変更されたら塗りつぶし色、線の種類を変更

          ※環境に応じてメニューのIDは変更してください
          ***********************************************************/

          BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam)
          {
              int iSelClr = 0;
              int iSelStyle = 0;
              CMenu *pMenu = this->GetMenu();

              //現在(変更前)のメニューの状態を取得
              if (pMenu->GetMenuState(ID_32771, MF_BYCOMMAND | MF_CHECKED) & MF_CHECKED) iSelClr = 0;
              if (pMenu->GetMenuState(ID_32772, MF_BYCOMMAND | MF_CHECKED) & MF_CHECKED) iSelClr = 1;
              if (pMenu->GetMenuState(ID_32773, MF_BYCOMMAND | MF_CHECKED) & MF_CHECKED) iSelClr = 2;
              if (pMenu->GetMenuState(ID_32774, MF_BYCOMMAND | MF_CHECKED) & MF_CHECKED) iSelStyle = 0;
              if (pMenu->GetMenuState(ID_32775, MF_BYCOMMAND | MF_CHECKED) & MF_CHECKED) iSelStyle = 1;
              if (pMenu->GetMenuState(ID_32776, MF_BYCOMMAND | MF_CHECKED) & MF_CHECKED) iSelStyle = 2;

              //変更されたメニュー項目(iItem)で更新
              UINT iItem = LOWORD(wParam);
              switch (iItem)
              {
              case ID_32771:
                  iSelClr = 0;
                  break;
              case ID_32772:
                  iSelClr = 1;
                  break;
              case ID_32773:
                  iSelClr = 2;
                  break;
              case ID_32774:
                  iSelStyle = 0;
                  break;
              case ID_32775:
                  iSelStyle = 1;
                  break;
              case ID_32776:
                  iSelStyle = 2;
                  break;
              default:
                  ;
              }

              //塗りつぶしグループの値を変更
              if (iItem == ID_32771 || iItem == ID_32772 || iItem == ID_32773)
              {
                  pMenu->CheckMenuRadioItem(ID_32771, ID_32773, iItem, MF_BYCOMMAND);
                  theApp.selClr = clr[iSelClr];
                  theApp.selLinfClr = lineclr[iSelClr];
              }
              //線の種類グループの値を変更
              if (iItem == ID_32774 || iItem == ID_32775 || iItem == ID_32776)
              {
                  pMenu->CheckMenuRadioItem(ID_32774, ID_32776, iItem, MF_BYCOMMAND);
                  theApp.iSelStyle = iStyle[iSelStyle];
              }
              TRACE(L"iSelClr=%d iSelStyle=%d¥r¥n",iSelClr, iSelStyle);
              return CFrameWnd::OnCommand(wParam, lParam);
          }


          ChildView.h
          class CChildView : public CWnd
          {
          //〜〜省略〜〜

           

          public:
              afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
              afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
              afx_msg void OnMouseMove(UINT nFlags, CPoint point);
              afx_msg void OnMouseLeave();

          private:
              void DrawRectangle();
              //描画中フラグ(描画中のときTRUE)
              BOOL bDrawing;
              //座標情報
              CPoint stPoint, edPoint;
          };

           

          ChildView.cpp
          #include "stdafx.h"
          #include "MFCApplication1.h"
          #include "ChildView.h"

          //CMainFrameオブジェクト
          extern CMFCApplication1App theApp;

          BEGIN_MESSAGE_MAP(CChildView, CWnd)
              //〜〜省略〜〜
              ON_WM_RBUTTONDOWN()
              ON_WM_RBUTTONUP()
              ON_WM_MOUSEMOVE()
              ON_WM_MOUSELEAVE()
          END_MESSAGE_MAP()

           

          /***********************************************************
          OnRButtonDown
          子ウィンドウでマウスの右ボタンが押下されたイベント
          ***********************************************************/

          void CChildView::OnRButtonDown(UINT nFlags, CPoint point)
          {
              bDrawing = TRUE;
              SetCursor(LoadCursor(NULL,IDC_SIZEALL));

              //開始位置を終了位置を初期化
              stPoint.SetPoint(0, 0);
              edPoint.SetPoint(0, 0);
              //開始位置をセット
              stPoint = point;

              CWnd::OnRButtonDown(nFlags, point);
          }

          /***********************************************************
          OnRButtonUp
          子ウィンドウでマウスの右ボタンが離されたイベント
          ***********************************************************/

          void CChildView::OnRButtonUp(UINT nFlags, CPoint point)
          {
              if (bDrawing)
              {
                  SetCursor(LoadCursor(NULL,IDC_ARROW));
                  //終了位置をセット
                  edPoint = point;
                  //四角形を描画する
                  DrawRectangle();
              }
              bDrawing = FALSE;

              CWnd::OnRButtonUp(nFlags, point);
          }


          /***********************************************************
          OnMouseMove
          マウスが移動中に発生するイベント
          ***********************************************************/

          void CChildView::OnMouseMove(UINT nFlags, CPoint point)
          {
              if (bDrawing)
              {
                  SetCursor(LoadCursor(NULL,IDC_SIZEALL));
              }

              //WM_MOUSELEAVEイベントを受け取れるようにしておく
              //TrackMouseEventについてはDeveloperNetwork参照
              TRACKMOUSEEVENT tme;
              tme.cbSize = sizeof(TRACKMOUSEEVENT);
              tme.dwFlags = WM_NCMOUSELEAVE;
              tme.hwndTrack = this->GetSafeHwnd();
              tme.dwHoverTime = 0; //関係ないので0をセットしておく
              TrackMouseEvent(&tme);

              CWnd::OnMouseMove(nFlags, point);
          }

           

          /***********************************************************
          OnMouseLeave
          子ウィンドウのクライアント領域をマウスが離れたイベント
          描画フラグとアイコンをリセットする
          ***********************************************************/

          void CChildView::OnMouseLeave()
          {
              bDrawing = FALSE;
              SetCursor(LoadCursor(NULL, IDC_ARROW));
              TRACE(L"OnMouseLeave¥r¥n");

              CWnd::OnMouseLeave();
          }

           

          /***********************************************************
          DrawRectangle
          開始Pointと終了Pointに対して四角形を描画する
          塗りつぶし色、線の色、線のスタイルはメニューの選択値を取得
          ***********************************************************/

          void CChildView::DrawRectangle()
          {
              CDC *pDC = this->GetDC();

              //四角形を塗りつぶすブラシ
              CBrush brs(theApp.selClr);
              CBrush *pOldBrush = pDC->SelectObject(&brs);

              //四角形を描画するペン
              //1より大きな幅を指定するとPS_SOLIDスタイルになるため幅は0とする
              CPen pen;
              pen.CreatePen(theApp.iSelStyle, 0, theApp.selLinfClr);
              CPen *pOldPen = pDC->SelectObject(&pen);

              //四角形を描画する領域
              CRect rect(stPoint,edPoint);
              //参考情報として出力ウィンドウに座標表示
              CString cs;
              cs.Format(L"st.x=%d st.y=%d ed.x=%d ed.y=%d¥r¥n", 
                  stPoint.x, stPoint.y, edPoint.x, edPoint.y);
              TRACE(cs);

              //四角形を描画
              pDC->Rectangle(rect);

              //オブジェクトを戻す
              pDC->SelectObject(pOldBrush);
              pDC->SelectObject(pOldPen);
          }

           

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

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

           



          | 1/6PAGES | >>