MFC单文档 无法响应对话框设定的初始值
新建了一个MFC单文档Imgsub应用程序。主要实现的功能是显示16张图片,并根据选择1-16号中的某一数字,单独显示这一数字对应的图片。在Imgsub项目中,我主要做了以下这些代码的编写。
1:添加了CDlgSelectPicture这个类,主要是对话框的建立。
2:在OnDraw写了代码选择图片的代码。
3:在MainFrame中,添加了OnSelectpicture()选择图片代码
现在出现了一个问题:
疑问1:输入您所需的图片序号: 在这个对话框中,默认选择为0,但是当我执行程序,不点编辑区域的数字,直接选择OK时,不能即时显示16张图片。当把窗口稍微变大变小之类的时候,就能马上显示16张图片了。
当我点数字编辑区填入某一数字时,能够立刻响应。我想知道为什么不点一下编辑窗口时不能即时显示图片,这出现的原因是因为我没有刷新窗口吗?还是对话框的初始值没有传到View中?
初来乍到,特别希望能够得到大家的帮助。初学,好多不懂的。以下是我的代码。先谢过大家了。
void CImgsubView::OnDraw(CDC* pDC)
{
CImgsubDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CDC memDC1, memDC2; //设备
CBitmap memBitmap1, memBitmap2; //位图
CRect rc;
HBITMAP hBitmap;
GetClientRect(&rc);
pDC = GetDC();
//创建与显示设备兼容的设备
memDC1.CreateCompatibleDC(pDC);
memDC2.CreateCompatibleDC(pDC);
memBitmap1.CreateCompatibleBitmap(pDC, rc.Width(), rc.Height());
memBitmap2.CreateCompatibleBitmap(pDC, rc.Width(), rc.Height());
//将位图选入设备
memDC1.SelectObject(&memBitmap1);
memDC2.SelectObject(&memBitmap2);
//当pictureNO值为0时,压缩显示所有的图片
if(pictureNO==0)
{
for (int i=1; i<=16; i++)
{
hBitmap = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1+i-1));
if (hBitmap != NULL)
{
memDC1.SelectObject(hBitmap); //将位图选入设备
if(i<=4) memDC2.StretchBlt((i-1)*200,0, 190, 190,&memDC1, 0,0,248,255,SRCCOPY);
if(i>4&&i<=8)memDC2.StretchBlt((i-5)*200,200, 190, 190,&memDC1, 0,0,248,255,SRCCOPY);
if(i>8&&i<13)memDC2.StretchBlt((i-9)*200,400, 190, 190,&memDC1, 0,0,248,255,SRCCOPY);
if(i>=13) memDC2.StretchBlt((i-13)*200,600,190, 190,&memDC1, 0,0,248,255,SRCCOPY);
::DeleteObject(&hBitmap);
}
}
}
//当pictureNO不为0时,显示其数值对应的图片
else
{
hBitmap = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1+pictureNO-1));
if (hBitmap != NULL)
{
memDC1.SelectObject(hBitmap); //将位图选入设备
memDC2.BitBlt(0, 0, 1024, 1024,&memDC1, 0, 0, SRCCOPY);
::DeleteObject(&hBitmap);
}
}
//一次性的向显示设备显示位图,以避免出现闪屏
pDC->BitBlt(0, 0, rc.Width(), rc.Height(), &memDC2, 0, 0, SRCCOPY);
//释放资源
memBitmap2.DeleteObject();
memBitmap1.DeleteObject();
memDC2.DeleteDC();
memDC1.DeleteDC();
ReleaseDC(pDC);
}
////////////////////////选择图片///////////////////////////////////////////
void CMainFrame::OnSelectpicture()
{
// TODO: Add your command handler code here
int iPictureNo; // 图片序号
CDlgSelectPicture dlgPara; // 创建对话框
dlgPara.m_iPictureNumber = 0; // 初始化对话框变量值
// 显示对话框,提示用户设定图片序号
if (dlgPara.DoModal() != IDOK)
{
return;
}
iPictureNo = dlgPara.m_iPictureNumber; // 获取用户设定的图片序号
delete dlgPara; // 删除对话框
CImgsubView *pView = (CImgsubView *)GetActiveView();
pView->pictureNO = iPictureNo;
}
// DlgSelectPicture.cpp : implementation file
//
#include "stdafx.h"
#include "Imgsub.h"
#include "DlgSelectPicture.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// CDlgSelectPicture dialog
CDlgSelectPicture::CDlgSelectPicture(CWnd* pParent /*=NULL*/)
: CDialog(CDlgSelectPicture::IDD, pParent)
{
//{{AFX_DATA_INIT(CDlgSelectPicture)
m_iPictureNumber=0;
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CDlgSelectPicture::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgSelectPicture)
// NOTE: the ClassWizard will add DDX and DDV calls here
DDX_Text(pDX,IDC_EDIT1_Picture,m_iPictureNumber);
DDV_MinMaxInt(pDX,m_iPictureNumber,0,16);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDlgSelectPicture, CDialog)
//{{AFX_MSG_MAP(CDlgSelectPicture)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDlgSelectPicture message handlers