【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);
      }

       

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

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

       


      【VC++】SDIにリストコントロールを追加してイベント処理を実装する

      0

        <機能>

        (1)MFCのSDIアプリケーションにリストコントロール(CListCtrl)を追加する

        (2)リストコントロールをCreate(サイズ・WindowStyle指定)する

        (3)リストコントロールのフォントを変更してみる(MS UI Gothic使用)

        (4)ヘッダ設定(InsertColumn)、データ設定(InsertItem)を行う

        (5)イベントを追加する(WindowProc)

          ・LVN_ITEMCHANGED : リストコントロールに変更があった
          ・LVN_COLUMNCLICK : リストコントロールのヘッダが左クリックされた

         

        <実行イメージ>

        フォントをMS UI Gothicに変更しヘッダ・データをセット

        ※データは東京都の市区町村別人口

        VisualStudio,MFC,SDI,CListCtrl,実行イメージ,
         

        リスト選択により選択行番号と選択行の情報を表示

        VisualStudio,MFC,SDI,CListCtrl,LVN_ITEMCHANGED,

        項目行左クリックにより選択カラム番号を表示

        VisualStudio,MFC,SDI,CListCtrl,LVN_COLUMNCLICK,
         

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

         

        <使い方>

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

        2.アプリケーションの種類でシングルドキュメントを選択

        VisualStudio,MFC,SDI,CListCtrl,アプリケーションの種類,
         

        3.ユーザーインターフェイス機能でくクラシックメニューを使用するを選択

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

        VisualStudio,MFC,SDI,CListCtrl,ユーザーインターフェイス機能,
         

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

        VisualStudio,MFC,SDI,CListCtrl,高度な機能,
         

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

        VisualStudio,MFC,SDI,CListCtrl,ソリューション,プロジェクト構成,
         

        6.クラスウィザードにてCChileViewクラスにOnCreateハンドラーを追加

        ※OnCreateでリストコントロールを生成しデータを設定する

        VisualStudio,MFC,SDI,CListCtrl,クラスウィザード,OnCreate,
         

        7.クラスウィザードにてCChileViewクラスにWindowProcハンドラーを追加

        ※WindowProcでリストコントロールのイベント処理を行う

        VisualStudio,MFC,SDI,CListCtrl,クラスウィザード,WindowProc,
         

        MainFrm.cpp

        //メインフレームのサイズ設定を行う

        BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
        {
            if( !CFrameWnd::PreCreateWindow(cs) )
                return FALSE;

            cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE
                 | WS_SYSMENU;

            //cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
            //ウィンドウサイズとクライアント領域を一致させる
            cs.dwExStyle = WS_EX_CLIENTEDGE;
            cs.lpszClass = AfxRegisterWndClass(0);

            //作業領域のサイズを取得
            //画面全体からシステムのタスクバーやアプリケーションのツールバーが占有する領域を除いた部分
            CRect rcSpara;
            SystemParametersInfo(SPI_GETWORKAREA, NULL, &rcSpara, NULL);
            //ウィンドウサイズの設定
            CRect rect(0, 0, 600, 400);
            ::AdjustWindowRectEx(&rect, cs.style, TRUE, cs.dwExStyle);
            //ウィンドウサイズを取得
            cs.cx = rect.Width();
            cs.cy = rect.Height();
           
            //画面中央に表示
            cs.x = rcSpara.left + (rcSpara.Width() - cs.cx) / 2;
            cs.y = rcSpara.top + (rcSpara.Height() - cs.cy) / 2;

            return TRUE;
        }

        ChildView.h

        //フォント変更するためCFontオブジェクトを追加

        class CChildView : public CWnd
        {


        //省略~~


        public:
            afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

        private:
            const int D_IDLISTVIEW = 1000;
            void InsertListCtrlItems(CListCtrl *pList);
        public:
            virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
            CFont *m_pFont;
        };

        ChildView.cpp

        CChildView::CChildView()
        {
            //子ウィンドにフォントをセット
            m_pFont = new CFont;
            LOGFONT logFont;
            logFont.lfHeight = 12;
            logFont.lfWidth = 10;
            logFont.lfEscapement = 0;
            logFont.lfOrientation = 0;
            logFont.lfWeight = FW_DONTCARE;
            logFont.lfItalic = FALSE;
            logFont.lfUnderline = FALSE;
            logFont.lfStrikeOut = FALSE;
            logFont.lfCharSet = DEFAULT_CHARSET;
            logFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
            logFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
            logFont.lfQuality = DEFAULT_QUALITY;
            logFont.lfPitchAndFamily = FF_DONTCARE;
            lstrcpy(logFont.lfFaceName, L"MS UI Gothic");
            m_pFont->CreateFontIndirect(&logFont);
        }

        CChildView::~CChildView()
        {
            //フォントオブジェクトを破棄
            delete m_pFont;
        }

        /***********************************************************
        OnCreate
        SDIで子ウィンドウの作成時にリストコントロール(CListCtrl)を生成
        ***********************************************************/

        int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct)
        {
            if (CWnd::OnCreate(lpCreateStruct) == -1)
                return -1;

            //ウィンドウサイズを取得
            CFrameWnd *pFrm = GetParentFrame();
            CRect rect;
            pFrm->GetClientRect(&rect);

            //リストコントロール(レポート形式)を配置
            //ウィンドウサイズに対して余白10で配置する
            CListCtrl *pListctrl = new CListCtrl();
            //List-View Window Stylesはデベロッパーセンターを参照
            pListctrl->Create(

                WS_VISIBLE | WS_BORDER | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_REPORT | LVS_SINGLESEL,
                CRect(10, 10, rect.Width()-20, rect.Height()-20), this, D_IDLISTVIEW);
           
            //拡張スタイルを設定
            pListctrl->SetExtendedStyle(pListctrl->GetExtendedStyle() | LVS_EX_FULLROWSELECT);
           
            //リストカラムセッティング
            LV_COLUMN lvclm;
            ZeroMemory(&lvclm, sizeof(LV_COLUMN));
            lvclm.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;

            //インデックス0の列はは常にLVCFMT_LEFTとなる
            //詳細はデベロッパーセンターのRemarks参照
            //lvclm.fmt = LVCFMT_CENTER;
            lvclm.iSubItem = 0;
            lvclm.pszText = L"地域コード";
            lvclm.cx = 130;
            pListctrl->InsertColumn(0, &lvclm);

            lvclm.fmt = LVCFMT_LEFT;
            lvclm.iSubItem = 1;
            lvclm.pszText = L"市区町村名";
            lvclm.cx = 250;
            pListctrl->InsertColumn(1, &lvclm);

            lvclm.fmt = LVCFMT_RIGHT;
            lvclm.iSubItem = 2;
            lvclm.pszText = L"人口(人)";
            lvclm.cx = 150;
            pListctrl->InsertColumn(2, &lvclm);

            //アイテムセット
            InsertListCtrlItems(pListctrl);
            //フォントをセット
            GetDlgItem(D_IDLISTVIEW)->SetFont(m_pFont);

            return 0;
        }

        /***********************************************************
        InsertListCtrlItems
        リストコントロールにデータ(東京都市区町村の人口)をセット
        ***********************************************************/

        void CChildView::InsertListCtrlItems(CListCtrl *pList)
        {
            TCHAR twk[64];
            int idx=0;
            LVITEM lvitm;

            struct
            {
                int id;
                TCHAR name[128];
                int population;
            }item[]={
                { 13101,_T("東京都 千代田区"),61218 },{ 13102,_T("東京都 中央区"),156256 },
                { 13103,_T("東京都 港区"),253018 },{ 13104,_T("東京都 新宿区"),343533 },
                { 13105,_T("東京都 文京区"),227141 },{ 13106,_T("東京都 台東区"),202947 },
                { 13107,_T("東京都 墨田区"),264229 },{ 13108,_T("東京都 江東区"),510574 },
                { 13109,_T("東京都 品川区"),397710 },{ 13110,_T("東京都 目黒区"),283005 },
                { 13111,_T("東京都 大田区"),728423 },{ 13112,_T("東京都 世田谷区"),921720 },
                { 13113,_T("東京都 渋谷区"),229670 },{ 13114,_T("東京都 中野区"),335745 },
                { 13115,_T("東京都 杉並区"),575841 },{ 13116,_T("東京都 豊島区"),298050 },
                { 13117,_T("東京都 北区"),348547 },{ 13118,_T("東京都 荒川区"),216273 },
                { 13119,_T("東京都 板橋区"),574058 },{ 13120,_T("東京都 練馬区"),731696 },
                { 13121,_T("東京都 足立区"),677514 },{ 13122,_T("東京都 葛飾区"),450846 },
                { 13123,_T("東京都 江戸川区"),691084 },{ 13201,_T("東京都 八王子市"),577910 },
                { 13202,_T("東京都 立川市"),179390 },{ 13203,_T("東京都 武蔵野市"),146381 },
                { 13204,_T("東京都 三鷹市"),190432 },{ 13205,_T("東京都 青梅市"),135789 },
                { 13206,_T("東京都 府中市"),261829 },{ 13207,_T("東京都 昭島市"),111902 },
                { 13208,_T("東京都 調布市"),235243 },{ 13209,_T("東京都 町田市"),434091 },
                { 13210,_T("東京都 小金井市"),123813 },{ 13211,_T("東京都 小平市"),192874 },
                { 13212,_T("東京都 日野市"),188327 },{ 13213,_T("東京都 東村山市"),150180 },
                { 13214,_T("東京都 国分寺市"),124501 },{ 13215,_T("東京都 国立市"),74610 },
                { 13218,_T("東京都 福生市"),58210 },{ 13219,_T("東京都 狛江市"),82357 },
                { 13220,_T("東京都 東大和市"),84664 },{ 13221,_T("東京都 清瀬市"),75377 },
                { 13222,_T("東京都 東久留米市"),116360 },{ 13223,_T("東京都 武蔵村山市"),71651 },
                { 13224,_T("東京都 多摩市"),147691 },{ 13225,_T("東京都 稲城市"),90225 },
                { 13227,_T("東京都 羽村市"),55225 },{ 13228,_T("東京都 あきる野市"),80373 },
                { 13229,_T("東京都 西東京市"),202201 },{ 13303,_T("東京都 西多摩郡瑞穂町"),33102 },
                { 13305,_T("東京都 西多摩郡日の出町"),17404 },{ 13307,_T("東京都 西多摩郡檜原村"),2096 },
                { 13308,_T("東京都 西多摩郡奥多摩町"),5058 },{ 13361,_T("東京都 大島町"),7580 },
                { 13362,_T("東京都 利島村"),343 },{ 13363,_T("東京都 新島村"),2630 },
                { 13364,_T("東京都 神津島村"),1845 },{ 13381,_T("東京都 三宅島三宅村"),2383 },
                { 13382,_T("東京都 御蔵島村"),343 },{ 13401,_T("東京都 八丈島八丈町"),7330 },
                { 13402,_T("東京都 青ヶ島村"),174 },{ 13421,_T("東京都 小笠原村"),3067 },
                0
            };
            for (INT i = 0;; i++)
            {
                if (item[i].id == 0) break;
                ZeroMemory(&lvitm, sizeof(LVITEM));
                lvitm.mask = LVIF_TEXT;
                lvitm.iItem = pList->GetItemCount();
                lvitm.iSubItem = 0;
                ZeroMemory(&twk, sizeof(twk));
                wsprintf(twk, _T("%d"), item[i].id);
                lvitm.pszText = twk;
                idx = ListView_InsertItem(pList->GetSafeHwnd(), &lvitm);
                //idx = pList->InsertItem(&lvitm);
                if (idx == (-1))
                {
                    AfxMessageBox(L"InsertItem Error!!",MB_ICONSTOP);
                    return;
                }
                ZeroMemory(&lvitm, sizeof(LVITEM));
                lvitm.mask = LVIF_TEXT;
                lvitm.iItem = idx;
                lvitm.iSubItem = 1;
                lvitm.pszText = item[i].name;
                ListView_SetItem(pList->GetSafeHwnd(), &lvitm);
                //pList->SetItem(&lvitm);

                ZeroMemory(&lvitm, sizeof(LVITEM));
                lvitm.mask = LVIF_TEXT;
                lvitm.iItem = idx;
                lvitm.iSubItem = 2;
                ZeroMemory(&twk, sizeof(twk));
                wsprintf(twk, _T("%d"), item[i].population);
                lvitm.pszText = twk;
                ListView_SetItem(pList->GetSafeHwnd(), &lvitm);
                //pList->SetItem(&lvitm);
            }
        }

        /***********************************************************
        WindowProc
        リストコントロールのイベント処理
        LVN_ITEMCHANGED : リストコントロールに変更があった
        LVN_COLUMNCLICK : リストコントロールのヘッダが左クリックされた
        ***********************************************************/

        LRESULT CChildView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
        {
            LV_DISPINFO *lvdisp;
            NM_LISTVIEW *pNMLV;
            CString cs;
            int idx;

            switch (message)
            {
            case WM_NOTIFY:
               
                //リストコントロールからのメッセージのみ処理する
                if ((int)wParam == D_IDLISTVIEW) {
                    lvdisp = (LV_DISPINFO *)lParam;
                    pNMLV = (NM_LISTVIEW *)lParam;
                    //リストビューを取得
                    CListCtrl *pListCtrl = (CListCtrl *)GetDlgItem(D_IDLISTVIEW);
                    //選択されている行のインデックスを取得
                    idx = pNMLV->iItem;

                    switch (lvdisp->hdr.code) {
                    case LVN_ITEMCHANGED:
                        //選択行の情報を表示する
                        if ((pNMLV->uChanged & LVIF_STATE) && (pNMLV->uNewState & LVIS_SELECTED)) {
                            cs.Format(L"%d行目¥r¥n地域コード  [%s]¥r¥n市区町村名  [%s]¥r¥n人口     [%s]",
                                idx+1,pListCtrl->GetItemText(idx, 0),

                                pListCtrl->GetItemText(idx, 1),

                                pListCtrl->GetItemText(idx, 2));
                            AfxMessageBox(cs,MB_ICONINFORMATION);
                        }
                        break;
                    case LVN_COLUMNCLICK:
                        //iSubItemを参照してヘッダのクリックされた列を表示する
                        cs.Format(L"ヘッダ行の%d列目が左クリックされました", pNMLV->iSubItem+1);
                        AfxMessageBox(cs,MB_ICONINFORMATION);
                        break;
                    }
                }
                break;

            default:
                ;
            }

            return CWnd::WindowProc(message, wParam, lParam);
        }

         

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

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


        【VC++】operatorキーワードで演算子をオーバーロードする

        0

          <機能>

          (1)社員ID(int)、社員名(CString)、通勤費支給(BOOL)を持つクラスを定義

          (2)クラスのメンバ変数を operator= でコピーできるようにする

           オブジェクトA = オブジェクトB でメンバ変数をコピー

          (3)クラスインスタンスを動的配列(std::vector)に operator+ で追加する

          (4)追加と同時にソート処理を実施する

           オブジェクトA + オブジェクトB でオブジェクトAの動的配列にオブジェクトBを追加

           オブジェクトAの動的配列を社員IDの昇順でソート(std::sort)

           

          <実行イメージ>

          "出力"ウィンドウに結果を表示します

          ※表示されていない場合は[表示]メニュー→[出力]

          VC,MFC,VisualStudio,operator,sort,演算子のオーバーロード,
           

          <動作検証&開発環境>

          Visual Studio Community 2017

           

          <使い方>

          1.プロジェクトの種類でWindowsデスクトップウィザードを選択

          2.アプリケーションの種類で「コンソールアプリケーション」を選択

          3.共通ヘッダの「MFC」にチェック

          VC,MFC,VisualStudio,operator,sort,演算子のオーバーロード,
           

          4.クラスを追加

           クラス名:CShainClass

           ファイル名:ShainClass.h

           (ShainClass.cppは本サンプルでは使用しません)

          5.ソースを追加

           

          ShainClass.h

          #pragma once
          #include <vector>
          #include <algorithm> //sort
          //社員クラス(CShainClass)
          class CShainClass
          {
          private:
              int iShainID;           //社員ID
              CString strName;    //社員氏名
              BOOL bAllowance;   //通勤手当支給対象
              //全社員情報を格納するvector配列
              std::vector<CShainClass> vShainClass;
              //社員情報を社員IDが小さい順でソートする
              struct sort_shainNo : std::binary_function<CShainClass&, CShainClass&, bool>
              {
                  bool operator()(CShainClass &a, CShainClass &b)
                  {
                      if (a.iShainID < b.iShainID) return true;
                      return false;
                  }
              };
          public:
              //コンストラクタ(初期化)
              CShainClass() :iShainID(0), strName(""), bAllowance(FALSE) {};
              //デストラクタ
              ~CShainClass() {};
              //set/get
              void SetShainData(int a, CString b, bool c) {
                  iShainID = a;
                  strName = b;
                  bAllowance = c;
              }
              int GetID() { return iShainID; }
              CString GetName() { return strName; }
              bool GetAllowance() { return bAllowance; }
              auto GetBegin() { return vShainClass.begin();}
              auto GetEnd() { return vShainClass.end(); }
              //=演算子をオーバーロード(メンバ変数をコピーする)
              //詳細はDeveloperNetwork参照

              void operator = (CShainClass& shain)
              {
                  iShainID = shain.iShainID;
                  strName = shain.strName;
                  bAllowance = shain.bAllowance;
              }
              //+演算子をオーバーロード(メンバ変数をコピー&ソートする)
              //社員情報を追加(push_back)

              void operator + (CShainClass& shain)
              {
                  vShainClass.push_back(shain);
                  std::sort(vShainClass.begin(), vShainClass.end(), sort_shainNo());
              }
          };

           

          Main(Project1.cpp)
          #include "stdafx.h"
          #include "Project1.h"
          #include "ShainClass.h"
          #ifdef _DEBUG
          #define new DEBUG_NEW
          #endif

          // 唯一のアプリケーション オブジェクトです。
          CWinApp theApp;
          using namespace std;
          int main()
          {
              //省略~~
              if (hModule != nullptr)
              {
                  if (!AfxWinInit(hModule, nullptr, ::GetCommandLine(), 0))
                  {
                      //省略~~
                  }
                  else
                  {
                      CString csmsg,cstmp;
                     
                      //operator= のテスト ここから ///////////////////////
                      CShainClass tmp1, tmp2;
                      //tmp2に値をセット
                      tmp2.SetShainData(99,L"OperatorTest Ichiro",false);
                      //tmp1に値にtmp2をコピー
                      tmp1 = tmp2;
                      //operator= の結果を確認
                      cstmp.Format(L"tmp1.iShainID=%d tmp1.strName=%s tmp1.bAllowance=%d¥r¥n¥r¥n",
                                              tmp1.GetID(), tmp1.GetName(), tmp1.GetAllowance());
                      csmsg = L"¥r¥n□operator= のテスト¥r¥n" + cstmp;
                      //operator= のテスト ここまで ///////////////////////
                     
                      CShainClass allShain, tmpShain;
                      //要素を定義して全社員クラスに追加する
                      //追加と同時にソートされる

                      tmpShain.SetShainData(71, L"山田太郎", false);
                      allShain + tmpShain;
                      tmpShain.SetShainData(167, L"鈴木花子", true);
                      allShain + tmpShain;
                      tmpShain.SetShainData(108, L"佐々木小次郎", true);
                      allShain + tmpShain;
                      tmpShain.SetShainData(9, L"青木幸子", true);
                      allShain + tmpShain;
                      //全社員クラスの値を確認(追加&ソート)
                      csmsg += L"□全社員クラスの値を確認(operator+ で追加とソート)¥r¥n";
                      for (auto itr = allShain.GetBegin(); itr != allShain.GetEnd(); ++itr)
                      {
                          CString cwk = itr->GetName();
                          for (int i = cwk.GetLength()*sizeof(TCHAR); i <= 20; i++)
                          {
                              cwk += L" ";
                          }
                         
                          cstmp.Format(L"社員ID[%03d]  社員氏名[%-s]  通勤費支給[%d]¥r¥n",
                                                  itr->GetID(),cwk,itr->GetAllowance());
                          csmsg += cstmp;
                      }
                      TRACE(csmsg);
                  }
              }
              else
              {
                  //省略~~
              }
              return nRetCode;
          }
           
          よろしければポチッと押してください

          【VC++】エディットボックスに半角英数のみ入力できるようにする

          0

            <機能>

            (1)入力は半角英数のみ、文字数の上限チェックをクラスで実装する

            (2)OnEnChangeで半角英数チェックを行う

            (3)OnKeyDownで入力文字数の上限チェックを行う

            (4)入力制限クラスを複数のエディットボックスに適用する

             

            <実行イメージ>

            半角英数チェックと文字数の上限チェックを行う

            VisualStudio,MFC,VC++,半角英数,入力チェック,クラス,
             

            <動作検証&開発環境>

            Visual Studio Community 2017

             

            <使い方>

            1.ダイアログベースでMFCApplication1プロジェクトを作成します

            VisualStudio,MFC,VC++,アプリケーションの種類,

            2.クラスウィザードでMFCクラスを追加します

            VisualStudio,MFC,VC++,クラスウィザード,
             

            基底クラスに「CEdit」を選択

            クラス名を「CEditTest」とします

            VisualStudio,MFC,VC++,クラスウィザード,クラス追加,
             

            3.クラスウィザードでCEditTestクラスに下記イベントを追加します

            OnEnChange : このイベントで半角英数チェックを行います

            OnKeyDown : このイベントで上限文字数チェックを行います

            VisualStudio,MFC,VC++,イベント,OnEnChange,OnKeyDown,
             

            4.IDD_MFCAPPLICATION1_DIALOGにエディットボックスを2つ追加します

            VisualStudio,MFC,VC++,Edit,
             

            5.追加したエディットボックスにそれぞれメンバ変数を追加します

            ・コントロール変数にチェック

            ・カテゴリ:Control

            ・変数の種類:CEditTest(CEditTestクラスの変数とする)

            ・変数名はそれぞれm_Edit1 、 m_Edit2 とします

            VisualStudio,MFC,VC++,メンバ変数の追加ウィザード,

             

            6.ソースを追加してください

             

            CEditTest.h

            class CEditTest : public CEdit
            {
                DECLARE_DYNAMIC(CEditTest)

            public:
                CEditTest();
                virtual ~CEditTest();

            protected:
                DECLARE_MESSAGE_MAP()
            public:
                afx_msg void OnEnChange();
                afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
            };

             

            CEditTest.cpp

             

            BEGIN_MESSAGE_MAP(CEditTest, CEdit)

                ON_CONTROL_REFLECT(EN_CHANGE, &CEditTest::OnEnChange)
                ON_WM_KEYDOWN()
            END_MESSAGE_MAP()

             

             

            // CEditTest メッセージ ハンドラー

             

            /***********************************************************
            OnEnChange
            エディットコントロールの内容を変更したイベントハンドラ
            半角英数以外の入力があった場合は文字を削除する
            ***********************************************************/

            void CEditTest::OnEnChange()
            {
                CString cs;
                this->GetWindowText(cs);

             

             

                //数値チェックを行う
                CString csChk = cs.SpanIncluding(_T("abcdefghujklmnopqrstuvwxyz ¥
                                                    ABCDEFGHIJKLMNOPQRSTUVWXYZ ¥
                                                    0123456789"));
                //半角英数以外が混ざっていたら取り除いて設定する
                if (csChk != cs) {
                    TRACE(L"<<Error>> 半角英数以外が混ざっていました [%s]¥r¥n", cs);
                    //半角英数以外の文字を取り除く
                    int ichi = csChk.GetLength();
                    cs.Replace(cs.Mid(ichi,1),L"");
                    this->SetWindowText(cs);
                }
            }

             

             

            /***********************************************************
            OnKeyDown
            システムキー以外のキーが押下されたイベントハンドラ
            入力文字数が入力条件を超えていないかチェック
            ***********************************************************/

            void CEditTest::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
            {
                CString cs;
                //入力上限バイト数を取得
                int iLimit = this->GetLimitText();
                //入力済み文字列を取得
                this->GetWindowText(cs);
                TRACE(L"text=[%s] limit/nowlength=%d/%d¥r¥n",cs,iLimit,cs.GetLength());

             

                //既に入力上限に達しているときは何もしない
                if (cs.GetLength() == iLimit) return;

                CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
            }

             

            MFCApplication1Dlg.h

             

            #pragma once
            #include "CEditTest.h"

             

            class CMFCApplication1Dlg : public CDialog
            {
                // 〜〜省略〜〜
            private:
                CEditTest m_Edit1;
                CEditTest m_Edit2;
            };

             

             

            MFCApplication1Dlg.cpp

             

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

             

                // 〜〜省略〜〜

             

                // このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、
                //  Framework は、この設定を自動的に行います。
                SetIcon(m_hIcon, TRUE);         // 大きいアイコンの設定
                SetIcon(m_hIcon, FALSE);        // 小さいアイコンの設定

             

                //リミットを設定
                m_Edit1.SetLimitText(10);
                m_Edit2.SetLimitText(5);

             

                return TRUE;  // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
            }

             

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

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

             



            | 1/6PAGES | >>

            calendar

            S M T W T F S
                  1
            2345678
            9101112131415
            16171819202122
            23242526272829
            30      
            << September 2018 >>

            profile

            others

            mobile

            qrcode         スマホ表示に戻す