我用MFC做了一个基于对话框的应用程序。
暂时只定两个控件,一个“打开”按钮,一个Picture控件。
功能简述:通过“打开”按钮,调用通用open对话框,来打开磁盘上的位图文件。并将位图显示在picture控件中。
相关文件如下:
对话框头文件:finaltestdlg.h
对话框类实现:finaltestdlg.cpp
通过打开对话框获取的文件名保存在filename。
下面描述的方法也是从网上找到的,程序调试运行都没有错误,就是不能将图片显示到picture控件中。
1. 在对话框头文件finaltestdlg.h中添加CBitmap m_bmp; 创建一个对象。
2. 在初始化对话框函数BOOL CFinaltestDlg::OnInitDialog()中添加了加载位图,获取位图信息,调整位图大小的代码。
如下:(前面关于位图的代码是加入的,其他代码由MFC生成)
BOOL CFinaltestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//位图加载
if(m_bmp.m_hObject!=NULL)
m_bmp.DeleteObject();
HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),filename,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION ¦LR_LOADFROMFILE);
if (hbmp==NULL)
return FALSE;
//获取加载的位图信息
m_bmp.Attach(hbmp);
DIBSECTION ds;
BITMAPINFOHEADER &bminfo = ds.dsBmih;
m_bmp.GetObject(sizeof(ds),&ds);
int cx = bminfo.biWidth; //获取图像宽度
int cy = bminfo.biHeight; //获取图像高度
//调整图像大小符合空间要求,使得其正好显示一张图片
CRect rect;
GetDlgItem(IDC_STATIC1)->GetWindowRect(&rect);
ScreenToClient(&rect);
GetDlgItem(IDC_STATIC1)->MoveWindow(rect.left,rect.top,cx,cy,true); //调整大小
// Add "About…" menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
3. 将位图绘制到picture控件,代码如下:
void CFinaltestDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
//以下代码为手动添加
CPaintDC dc2(GetDlgItem(IDC_STATIC1));
CRect rcclient;
GetDlgItem(IDC_STATIC1)->GetClientRect(&rcclient);
CDC memdc;
memdc.CreateCompatibleDC(&dc2);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc2,rcclient.Width(),rcclient.Height());
memdc.SelectObject(&bitmap);
CWnd::DefWindowProc(WM_PAINT,(WPARAM)memdc.m_hDC,0);
CDC maskdc;
maskdc.CreateCompatibleDC(&dc2);
CBitmap maskbitmap;
maskbitmap.CreateBitmap(rcclient.Width(),rcclient.Height(),1,1,NULL);
maskdc.SelectObject(&maskbitmap);
maskdc.BitBlt(0,0,rcclient.Width(),rcclient.Height(),&memdc,rcclient.left,rcclient.top,SRCCOPY);
CBrush brush;
brush.CreatePatternBrush(&m_bmp);
dc2.FillRect(rcclient,&brush);
dc2.BitBlt(rcclient.left,rcclient.top,rcclient.Width(),rcclient.Height(),&memdc,rcclient.left,rcclient.top,SRCPAINT);
brush.DeleteObject();
}
PS:我试着把上面的2段位图操作代码分别添加到两个函数中,然后在点击open通用对话框“打开”的时候调用函数,也行不通。
如下:void CFinaltestDlg::OnOpenFile()
{
// TODO: Add your control notification handler code here
char szFileters[] = "Image Files (*.bmp) ¦*.txt ¦All files (*.*) ¦*.* ¦ ¦";
CFileDialog opendlg (TRUE, "bmp", "*.bmp",OFN_FILEMUSTEXIST ¦ OFN_HIDEREADONLY, szFileters, this);
if (opendlg.DoModal() == IDOK)
{
filename = opendlg.GetPathName();
BOOL LoadImage();
void displayPic();
}
}
希望高手赐教啊。我现在想转到使用文档窗口来操作了,后面还有很多事要做……..可用分就那么点了,少了点见谅,哈哈
不难,待我给你两个示例。10分钟不到就可以解决。
你现在的工程应该是这个样子的:
http://www.functionx.com/visualc/bitmaps/DisplayFromFile.htm
你想要实现这样的:
http://www.functionx.com/visualc/views/DisplayBitmap.htm
对吧
非常感谢,呵呵。节省了不少时间,现在基本不用为界面发愁了。
开始算法了,
是,找对例子参考,可以节省很多时间。