【VC++】ピクチャーボックスに画像を表示する
<機能>
(1)ピクチャーボックスに直接絵をかきます
(2)ピクチャーボックスに任意の画像を表示します
(2)-1.画像を表示する際にピクチャーボックスのサイズに伸縮します
(2)-2.伸縮画像が劣化しないように伸縮モードを指定します
<実行イメージ>
上はピクチャーボックスに直接グラデーションを描画
下はJPEGをピクチャーボックスに表示(伸縮して表示)
<動作検証&開発環境>
Visual Studio Community 2017
<使い方>
1.MFCのダイアログベースアプリケーションを作成します
※サンプルではプロジェクト名をPictureTestとします
2.リソースファイル(PictureTest.rc)を開いて"言語 17、"を""LANGUAGE 17,"に修正
3.ダイアログにコントロールを追加
・ピクチャーボックス:IDC_PICTURE1/IDC_PICTURE2
・ボタンはIDOKをそのまま使用
4.ピクチャーボックスにメンバ変数を追加
・IDC_PICTURE1 : m_Picture1(コントロール変数)
・IDC_PICTURE2 : m_Picture2(コントロール変数)
5.メンバ関数setPictureControl()を追加
6.ONOKのボタン押下イベント追加
7.ソースを追加
PictureTestDlg.h
{
//~~省略~~
//ピクチャーコントロールの描画エリア
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;
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);
}
}
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;
}
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();
}
よろしければポチッと押してください