MFC单文档 无法响应对话框设定的初始值

weilixing 2011-11-07 11:13:42
新建了一个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
...全文
67 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
weilixing 2011-11-13
  • 打赏
  • 举报
回复
谢谢你啦!~解决了。
我先把pictureNO这个变量初始值设为一个小于零的值了,当它小于零的时候,显示背景。
很多不懂的~纠结诶




[Quote=引用 4 楼 hztj2005 的回复:]

调试过程中发现是到了这一句的时候背景全部变成黑色的:
pDC->BitBlt(0, 0, rc.Width(), rc.Height(), &memDC2, 0, 0, SRCCOPY);

memDC2是源,检查memDC2是如何定义赋值的?
[/Quote]
weilixing 2011-11-13
  • 打赏
  • 举报
回复
谢谢你啦!~解决了。
我先把pictureNO这个变量初始值设为一个小于零的值了,当它小于零的时候,显示背景。
很多不懂的~纠结诶


[Quote=引用 3 楼 weilixing 的回复:]

引用 1 楼 hztj2005 的回复:
void CMainFrame::OnSelectpicture()
{
// TODO: Add your command handler code here
int iPictureNo; // 图片序号
CDlgSelectPicture dlgPara; // 创建对话框
dlgPara.m_iPictureNumber = 0; /……
[/Quote]
hztj2005 2011-11-08
  • 打赏
  • 举报
回复
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; //在这里设断点,看直接选择OK时 iPictureNo是否有效
delete dlgPara; //
CImgsubView *pView = (CImgsubView *)GetActiveView();
pView->pictureNO = iPictureNo;

//添加两行看
pView->InvalidateRect(NULL, true ); //或者 InvalidateRect(NULL, false );
pView->UpdateWindow();

}

weilixing 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hztj2005 的回复:]
void CMainFrame::OnSelectpicture()
{
// TODO: Add your command handler code here
int iPictureNo; // 图片序号
CDlgSelectPicture dlgPara; // 创建对话框
dlgPara.m_iPictureNumber = 0; // 初始化对话框变量值

if (dl……
[/Quote]

添加后面的代码后可以即时响应初始值了。
还有一个问题想请教一下。关于修改背景的问题。我在View中添加了显示背景图片的程序
BOOL CImgsubView::OnEraseBkgnd(CDC* pDC)
{
CRect rect;
GetClientRect(&rect);
CDC memDC;
CBitmap cbmp;
CBitmap* bmp = NULL;
cbmp.LoadBitmap(IDB_MYBITMAP);
BITMAP bmInfo;
cbmp.GetBitmap(&bmInfo);
memDC.CreateCompatibleDC(pDC);
bmp = memDC.SelectObject(&cbmp);
pDC->StretchBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, 0, 0, bmInfo.bmWidth,bmInfo.bmHeight,SRCCOPY);
if(bmp)memDC.SelectObject(bmp);
return TRUE;
}
但是在执行程序时,并不会显示背景图片,而是一片黑色。我想要的是在我没有选择图片序号时显示的是背景图片。调试过程中发现是到了这一句的时候背景全部变成黑色的:
pDC->BitBlt(0, 0, rc.Width(), rc.Height(), &memDC2, 0, 0, SRCCOPY);

为什么呢?
用户 昵称 2011-11-08
  • 打赏
  • 举报
回复
你只在OnDraw里面调用显示,但是在选择的时候没执行一下显示,所以把OnDraw里面的代码单独提出来,分别在Select和OnDraw调用就好了。
hztj2005 2011-11-08
  • 打赏
  • 举报
回复
调试过程中发现是到了这一句的时候背景全部变成黑色的:
pDC->BitBlt(0, 0, rc.Width(), rc.Height(), &memDC2, 0, 0, SRCCOPY);

memDC2是源,检查memDC2是如何定义赋值的?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧