【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(コントロール変数)


     

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


     

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

    7.ソースを追加

     

    PictureTestDlg.h

     

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

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

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

     



    << | 2/47PAGES | >>

    calendar

    S M T W T F S
        123
    45678910
    11121314151617
    18192021222324
    25262728   
    << February 2018 >>

    profile

    others

    mobile

    qrcode         スマホ表示に戻す