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

<機能>

(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()

    /***********************************************************
    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 を返します。
    }

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

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


    【VC++】メールスロットで単方向プロセス間通信を行う

    0

      <機能>

      (1)メールスロットクライアントとサーバを作成します

      (2)メールスロットを使って2つのexe間でプロセス間通信を行います

      (3)クライアントは[送信]ボタン押下によりメッセージを送付します

      (4)サーバは受信メッセージをリストボックスに表示します

      (5)クライアント起動時にサーバも起動します

       (サーバからクライアントの起動ななし)

       

      <実行イメージ>

      上の実行ファイルはメールスロットクライアント(MFCApplication1)

      下の実行ファイルはメールスロットサーバ(MFCApplication2)

      MFC,VisualStudio,MailSlot,実行サンプル,
       

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

       

      <使い方>

      1.MFCApplication1プロジェクトを作成します

      2.MFCApplication1ソリューションにMFCApplication2プロジェクトを追加します

       (どちらもダイアログベースです)

       

      サンプルのソリューション構成

      MFCApplication1(ソリューションフォルダ)

       Debug

       MFCApplication1(プロジェクトフォルダ)

       MFCApplication2(プロジェクトフォルダ)

       Release

       MFCApplication1.sln

       

      3.コントロールを追加

      MFCApplication1

      MFC,VisualStudio,MailSlot,送信,
       

      MFCApplication2

      MFC,VisualStudio,MailSlot,受信,
       

      4.メンバ変数を追加

      MFCApplication1

       IDC_EDIT1:

      MFC,VisualStudio,MailSlot,送信,メンバ変数追加,クラスウィザード,
       

      MFCApplication2

       IDC_LIST1:

      MFC,VisualStudio,MailSlot,受信,メンバ変数追加,クラスウィザード,
       

      5.MFCApplication2にイベントを追加

       WM_TIMER(タイマーイベントでメッセージを受信)

       WM_DESTROY(画面終了イベントでメールスロットとタイマー停止)

      MFC,VisualStudio,MailSlot,受信,イベント追加,クラスウィザード,
       

      5.ソースを追加

       

      MFCApplication1(クライアント「送信」側アプリ)

       

      MFCApplication1Dlg.h

      class CMFCApplication1Dlg : public CDialog
      {
      //〜省略〜
      // 実装
      protected:
          HICON m_hIcon;
          // 生成された、メッセージ割り当て関数
          virtual BOOL OnInitDialog();
          afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
          afx_msg void OnPaint();
          afx_msg HCURSOR OnQueryDragIcon();
          DECLARE_MESSAGE_MAP()
      private:
          CString m_sendEdt;
          HANDLE m_mailSlot;
      public:
          afx_msg void OnBnClickedButton1();
      };

       

      MFCApplication1Dlg.cpp

       

      BOOL CMFCApplication1Dlg::OnInitDialog()

      {
          //〜省略〜〜
          //受信側(MFCApplication2.exe)も一緒に起動する
          //※本サンプルでは受信側と送信側が同一フォルダに出力されているものとしますが実行環境に合わせて修正してください

          TCHAR buf[2048];
          ZeroMemory(&buf, sizeof(buf));
          GetModuleFileName(NULL, buf, sizeof(buf));
          size_t ichi = wcslen(buf) - wcslen(L"MFCApplication1.exe");
          //送信側(MFCApplication1.exe)実行ファイル名を受信側(MFCApplication2.exe)に置換
          wmemcpy_s(&buf[ichi],wcslen(buf), L"MFCApplication2.exe", wcslen(L"MFCApplication2.exe")*2);
          //受信側(MFCApplication2.exe)を起動
          ShellExecute(NULL, L"open", buf, NULL, NULL, SW_HIDE);
          //エディットボックスを初期化
          m_sendEdt = L"";
          UpdateData(FALSE);
          return TRUE;  // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
      }
       
      /*************************************************
      関数名 OnBnClickedButton1
      機能   送信ボタン押下イベント
      *************************************************/

      void CMFCApplication1Dlg::OnBnClickedButton1()
      {
          CString csError;
          TCHAR cName[256];
          ZeroMemory(&cName,sizeof(cName));
          //エディットボックスの入力値を取得
          UpdateData(TRUE);
          m_sendEdt = m_sendEdt.Trim();
          //メッセージが未入力ならエラーとする
          if (m_sendEdt.IsEmpty())
          {
              AfxMessageBox(L"送信文字列を入力してください",MB_ICONERROR);
              return;
          }
          //コンピュータ名を取得
          //※本サンプルでは同一コンピュータに送信する

          DWORD wksize = sizeof(cName);
          if (!GetComputerName(cName, &wksize))
          {
              AfxMessageBox(L"コンピューター名の取得に失敗しました", MB_ICONERROR);
              return;
          }
          //メールスロットを作成
          //メールスロットの名前は ¥¥mailslot¥¥MailSlot とする

          //詳細はMSDN参照
          CString csSlot;
          csSlot.Format(L"¥¥¥¥%s¥¥mailslot¥¥MailSlot", cName);
          HANDLE hSlot = CreateFile(csSlot, GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ,
                                          NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
          if (hSlot == INVALID_HANDLE_VALUE)
          {
              csError.Format(L"MailSlotの作成に失敗しました(ErrorCode=%d)¥r¥n%s",GetLastError(),csSlot);
              AfxMessageBox(csError, MB_ICONERROR);
              return;
          }
          //メッセージの送信
          LPTSTR cMsg = new TCHAR[2048];
          DWORD dwSize;
          DWORD dwWrite;
          BOOL bResult;
          //dwSize = wcslen(cMsg);
          dwSize = wsprintf(cMsg, L"%s", m_sendEdt);
          bResult = WriteFile(hSlot, cMsg, dwSize * 2, &dwWrite, NULL);
          if (!bResult) {
              csError.Format(L"MailSlotの送信に失敗しました(ErrorCode=%d)¥r¥n%s", GetLastError(), csSlot);
              AfxMessageBox(csError, MB_ICONERROR);
          }
          CloseHandle(hSlot);
          delete cMsg;
      }

       

      MFCApplication2(サーバ「受信」側アプリ)

       

      MFCApplication2Dlg.h
      class CMFCApplication2Dlg : public CDialog
      {
      //〜省略〜〜
      // 実装
      protected:
          HICON m_hIcon;
          // 生成された、メッセージ割り当て関数
          virtual BOOL OnInitDialog();
          afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
          afx_msg void OnPaint();
          afx_msg HCURSOR OnQueryDragIcon();
          DECLARE_MESSAGE_MAP()
      private:
          HANDLE m_Slot;
      public:
          afx_msg void OnTimer(UINT_PTR nIDEvent);
          afx_msg void OnDestroy();
      private:
          CListBox m_recvList;
      };
       
      MFCApplication2Dlg.cpp
      BOOL CMFCApplication2Dlg::OnInitDialog()
      {
          CDialog::OnInitDialog();
         
          //〜省略〜〜
         
          //メールスロットを作成
          //メールスロットの名前は ¥¥mailslot¥¥MailSlot とする
          //メッセージの最大長(バイト数):0(任意サイズ)
          //メッセージ読み取りタイムアウト値(ms)
          //詳細はMSDN参照

          m_Slot = CreateMailslot(L"¥¥¥¥.¥¥mailslot¥¥MailSlot", 0, 1000, NULL);
          if (m_Slot == INVALID_HANDLE_VALUE)
          {
              CString csError;
              csError.Format(L"メールスロット作成に失敗しました(ErrorCode=%d)", GetLastError());
              AfxMessageBox(csError, MB_ICONERROR);
              return FALSE;
          }
          //タイマースタート
          //1000(ms)ごとにチェック
          //コールバック関数なし

          SetTimer(DTIMER_ID, 1000, NULL);
          return TRUE;  // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
      }
      /*************************************************
      関数名 OnTimer
      機能   タイマーイベントで受信をチェック
      *************************************************/

      void CMFCApplication2Dlg::OnTimer(UINT_PTR nIDEvent)
      {
          TCHAR cMsg[2048];
          DWORD dwRead;
          BOOL bResult;
          CString csMsg;
         
          //タイマー停止
          KillTimer(DTIMER_ID);
          //メッセージがあれば処理する
          MSG msg;
          while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
              TranslateMessage(&msg);
              DispatchMessage(&msg);
          }
         
          //メッセージの読み取り
          //詳細はMSDN参照

          ZeroMemory(&cMsg, sizeof(cMsg));
          bResult = ReadFile(m_Slot, cMsg, sizeof(cMsg), &dwRead, NULL);
          if(bResult)
          {
              //リストボックスに表示
              CTime ct;
              ct = CTime::GetCurrentTime();
              csMsg.Format(L"%04d/%02d/%02d %02d:%02d:%02d : %s", ct.GetYear(), ct.GetMonth(),
                  ct.GetDay(), ct.GetHour(), ct.GetMinute(), ct.GetSecond(), cMsg);
              m_recvList.InsertString(-1, csMsg);
              UpdateData(FALSE);
          }else
          {
              LRESULT lrlt = GetLastError();
              if ((lrlt == ERROR_SEM_TIMEOUT) || (lrlt == ERROR_ACCESS_DENIED)) {
                  //メッセージがタイムアウトのときエラーを出さない
                  //別のエラーが出るようならエラーコードを追加する

              }
              else {
                  csMsg.Format(L"MailSlotのメッセージ読み取りに失敗しました(ErrorCode=%d)", lrlt);
                  AfxMessageBox(csMsg, MB_ICONERROR);
                  SetTimer(DTIMER_ID, 1000, NULL);
              }
          }
          //タイマー起動
          SetTimer(DTIMER_ID, 1000, NULL);
          CDialog::OnTimer(nIDEvent);
      }
       
      /*************************************************
      関数名 OnDestroy
      機能   アプリケーションの終了処理
      *************************************************/

      void CMFCApplication2Dlg::OnDestroy()
      {
          CDialog::OnDestroy();
          //タイマー停止
          KillTimer(DTIMER_ID);
          //メールスロットを閉じる
          if (m_Slot != INVALID_HANDLE_VALUE)
          {
              CloseHandle(m_Slot);
          }
      }
       

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

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

       


      【VC++】ピクチャーボックスに画像を表示する

      0

        <機能>

        (1)ピクチャーボックスに直接絵をかきます

        (2)ピクチャーボックスに任意の画像を表示します

          (2)-1.画像を表示する際にピクチャーボックスのサイズに伸縮します

          (2)-2.伸縮画像が劣化しないように伸縮モードを指定します

         

        <実行イメージ>

        上はピクチャーボックスに直接グラデーションを描画

        下はJPEGをピクチャーボックスに表示(伸縮して表示)

        VC,MFC,PICTURECONTROL,伸縮,DC,描画モード,HALFTONE,
         

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

         

        <使い方>

        1.MFCのダイアログベースアプリケーションを作成します

          ※サンプルではプロジェクト名をPictureTestとします

        VC,MFC,PICTURECONTROL,伸縮,DC,ダイアログベース,ウィザード,
         

        2.リソースファイル(PictureTest.rc)を開いて"言語 17、"を""LANGUAGE 17,"に修正

          ※ダイアログベースでビルドエラー参照

        3.ダイアログにコントロールを追加

          ・ピクチャーボックス:IDC_PICTURE1/IDC_PICTURE2

          ・ボタンはIDOKをそのまま使用

        VC,MFC,PICTURECONTROL,伸縮,DC,描画モード,ウィザード,
         

        4.ピクチャーボックスにメンバ変数を追加

          ・IDC_PICTURE1 : m_Picture1(コントロール変数)

          ・IDC_PICTURE2 : m_Picture2(コントロール変数)

        VC,MFC,PICTURECONTROL,伸縮,DC,描画モード,メンバ変数追加ウィザード,
         

        5.メンバ関数setPictureControl()を追加

        VC,MFC,PICTURECONTROL,伸縮,DC,描画モード,メンバ関数追加ウィザード,
         

        6.ONOKのボタン押下イベント追加

        7.ソースを追加

         

        PictureTestDlg.h

        class CPictureTestDlg : public CDialog
        {
            //~~省略~~
        private:
            //ピクチャーコントロールの描画エリア
            RECT rect1, rect2;
            //ピクチャーコントロールへの描画処理
            void setPictureControl();
        public:
            afx_msg void OnBnClickedOk();
            CStatic m_Picture2;
            CStatic m_Picture1;
        };

        PictureTestDlg.cpp

        BOOL CPictureTestDlg::OnInitDialog()

        {

            //~~省略~~

            //ピクチャーコントロールの幅と高さを取得
            m_Picture1.GetWindowRect(&rect1);
            m_Picture2.GetWindowRect(&rect2);

            //~~省略~~
        }


        /*************************************************
        関数名 setPictureControl
        機能   ピクチャーコントールに描画する
        *************************************************/

        void CPictureTestDlg::setPictureControl()
        {
            CDC *cdc;
            int iWidth, iHeight;
            //IDC_PICTURE1にグラデーションを直接描画
            cdc = m_Picture1.GetDC();
            iWidth = rect1.right - rect1.left;
            iHeight = rect1.bottom - rect1.top;
            for (int y = 0; y < iHeight; y++) {
                for (int x = 0; x < iWidth; x++) {
                    COLORREF clr = RGB(0,x * 0xff / iWidth, 0);
                    SetPixel(cdc->GetSafeHdc(), x,y,clr);
                }
            }
            //IDC_PICTURE2にファイルを描画
            cdc = m_Picture2.GetDC();
            iWidth = rect2.right - rect2.left;
            iHeight = rect2.bottom - rect2.top;
            //読み込む画像ファイルパス
            TCHAR buf[2048];
            CString cs;
            ZeroMemory(&buf, sizeof(buf));
            GetModuleFileName(NULL, buf, sizeof(buf));
            cs.Format(L"%s",buf);
            cs = cs.Left(cs.ReverseFind('¥¥')) + L"¥¥Sample.jpg";
           
            CImage img;
            HRESULT ret = img.Load(cs);
            if (img.IsNull()) {
                AfxMessageBox(L"画像の読み込み失敗",MB_ICONERROR);
                return;
            }
            //StretchBltで描画領域に合わせてリサイズ
            CDC bmpDC;
            CBitmap *cbmp;
            cbmp = CBitmap::FromHandle(img);
            bmpDC.CreateCompatibleDC(cdc);
            CBitmap *oldbmp = bmpDC.SelectObject(cbmp);
            //伸縮すると画像が汚くなるので伸縮モードを指定
            //詳細は
        MSDN参照
            cdc->SetStretchBltMode(STRETCH_HALFTONE);
            //ブラシのずれを防止するためSetBrushOrgExを呼び出す
            cdc->SetBrushOrg(0, 0);
            //画像を伸縮してピクチャーボックスに表示
            //詳細は
        MSDN参照
            cdc->StretchBlt(0,0,iWidth,iHeight,&bmpDC,0,0,img.GetWidth(),img.GetHeight(),SRCCOPY);
            bmpDC.SelectObject(oldbmp);
            //後片付け
            cbmp->DeleteObject();
            bmpDC.DeleteDC();
            ReleaseDC(cdc);
        }

        /*************************************************
        関数名 OnBnClickedOk
        機能   OKボタン押下イベントハンドラ
        *************************************************/

        void CPictureTestDlg::OnBnClickedOk()
        {
            setPictureControl();
        }

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

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


        【VC++】VS2017のダイアログベースでビルドエラーとなる場合の対応

        0

          <現象>

          Visual Studio2017のダイアログベースでリソースを編集するとビルドエラーとなる

          (英語版では発生しないが日本語版では発生する)

          RC2135 file not found

          VC++,RC2135file not found,MFC,
           

          再現手順は以下の通り

          1.Visual Stuido2017でダイアログベースアプリのプロジェクト作成

          2.ダイアログにエディットボックスなどを追加

          3.ビルドするとエラーとなる

           

          ちょっとはまったので、私の環境で行ったことをメモとして残します

           

          Visual Stuido2017も最初は大丈夫だった気がする、、、

          アップデートでしこまれたバグだと思われますが早く修正してほしい!!!

           

          <バージョン>

           

          Visual Studio Community 2017

          Version 15.5.6

           

          <ダイアログアプリ作成方法>

           

          行ったこと

          (1)MFC と ATL のサポート(x86 と x64)をインストール

          Visual Studioメニューの[ツール]→[ツールと機能を取得]または

          WindowsメニューのVisual Studio Installerを選択
          VC++,ツール,ツールと機能,VS2017,MFC,
           

          (2)新規プロジェクトを作成

          (3)MFCアプリケーションを選択
          VC++,ウィザード,VS2017,MFC,
           

          (4)アプリケーションの種類でダイアログベースを選択して[完了]押下

          VC++,ウィザード,VS2017,MFC,
           

          (5)リソースファイル(.rc)を開く

          本サンプルではMFCApplication1.rcを右クリックしたコンテキストメニューで

          [コードの表示]を選択

          VC++,ウィザード,VS2017,MFC,
          (6)下記の箇所を全て修正する(「言語」「、」を修正する)

          修正前)"言語 171¥r¥n"

          修正後)"LANGUAGE 17,1¥r¥n"

          VC++,修正,VS2017,MFC,rc,リソースファイル,
           

          <確認方法>

          (1)ダイアログに確認用のGUIを追加

          VC++,修正,VS2017,MFC,確認,
           

          (2)ヘッダファイルにメンバ変数とイベント追加

          本サンプルではMFCApplication1Dlg.hに追加

           

          public:
              afx_msg void OnBnClickedCheck1();
              afx_msg void OnBnClickedButton1();

           

          private:
              CButton *cbtn;
              CButton *ccheck;
              CEdit *cedit;

           

          (3)処理を追加

           

          本サンプルではMFCApplication1Dlg.cppに追加

           

          BOOL CMFCApplication1Dlg::OnInitDialog()
          {

              //~~ 省略 ~~

              //初期化
              cbtn = (CButton*)GetDlgItem(IDC_BUTTON1);
              ccheck = (CButton*)GetDlgItem(IDC_CHECK1);
              cedit = (CEdit*)GetDlgItem(IDC_EDIT1);

           

              cbtn->SetWindowText(L"メッセージ表示");
              ccheck->SetCheck(FALSE);
              cedit->SetWindowText(L"");

           

              //~~ 省略 ~~

          }

           

          //チェックON/OFF
          void CMFCApplication1Dlg::OnBnClickedCheck1()
          {
              if (ccheck->GetCheck()) {
                  cedit->SetWindowText(L"チェックはONです");
              }
              else {
                  cedit->SetWindowText(L"チェックはOFFです");
              }
          }

           

          //ボタン押下
          void CMFCApplication1Dlg::OnBnClickedButton1()
          {
              AfxMessageBox(L"VisualStudio2017 MFCダイアログアプリケーション");
          }

           

          (4)ビルドして実行

           

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

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

           



          << | 2/6PAGES | >>

          selected entries

          categories

          calendar

          S M T W T F S
               12
          3456789
          10111213141516
          17181920212223
          2425262728  
          << February 2019 >>

          profile

          others

          archives