Windows界面开发-如何在对话框中预览位图

Windows界面开发-如何在对话框中预览位图

甜柠檬 发布于 2017-02-10 字数 77 浏览 1601 回复 3

在开发应用程序中,有时需要定制通用对话框,比如需要预览位图的文件对话框

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

甜柠檬 2017-07-04 3 楼

文件打开对话框中的OPENFILENAME结构体中的Flags的设置很重要:
OFN_ALLOWMULTISELECT:这个标志是允许选择多个文件,如果你想选择N个文件,那么这个标志一定要设置。
OFN_ENABLEHOOK:允许lpfnHook为对话框指定一个HOOK函数,用来处理对话框的消息。也就可以拦截我们感兴趣的消息。如:CDN_SELCHANGE
OFN_ENABLESIZING: 这个标志设定后,在对话框右下角会出现一个东东,允许用户随意扩大和缩小对话框
OFN_ENABLETEMPLATE:这个很重要,如果你想加入一个对话框模板做为预览区, 这个标志一定要设置。
OFN_EXPLORER:这个标志是最重要的,如果你想定制对话框模板,利用HOOK函数,对文件进行多选,这个标志必须设定。
OFN_HIDEREADONLY:隐藏只读属性复选框。
OFN_READONLY:设定这标志,会在对话框的下方出现一个“Read Only”的复选框。
OFN_SHOWHELP:设置该标志,在对话框上会显示 “帮助”按钮。

要在打开文件对话框里用户选择了一个文件时获得通知,需要设置标志OFN_ENABLEHOOK。
要添加对话框资源来显示图片,需要设置标志OFN_EXPLORER|OFN_ENABLETEMPLATE

夜无邪 2017-04-14 2 楼

通用的实现步骤如下:

1.从CFileDialog派生一个实现类
2.子类化文件对话框,利用HOOK消息拦截我们感兴趣的CDN_SELCHANGE消息
3.设置CFileDialog::m_ofn的内部成员属性:

m_ofn.Flags |=(OFN_EXPLORER | OFN_ENABLETEMPLATE);
m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FILEOPENPREVIEW);

4.加入一个static控件或者piture用来显示预览图片

下面是两个实现通用对话框实现预览功能的例子,你可以参考一下

http://www.codeproject.com/KB/dialog/bitmappreviewdialog.aspx?msg=1719801&pageflow=Fluid&display=Mobile

http://www.codeproject.com/KB/dialog/imagepreviewdialog.aspx?msg=1072865

灵芸 2017-02-16 1 楼

这个比较简单吧,先通过文件创建位图,然后把位图画到想显示该位图的窗口上就行了,实例代码如下:
BOOL LoadMyBitmap( CString strPath, CBitmap *pBitmap )
{
HBITMAP hb = (HBITMAP)LoadImage(::AfxGetApp()->m_hInstance, strPath, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE );

if (pBitmap->GetSafeHandle())
{
HGDIOBJ tdb = pBitmap->Detach();
::DeleteObject( tdb );
}
if (NULL != hb)
{
BOOL b = pBitmap->Attach( hb );
return TRUE;
}

return FALSE;
}

if (NULL != m_Bmp.m_hObject)
{
m_HeadLeftBmp.GetBitmap(&bmpHeaderLeft);
mem.SelectObject(&m_HeadLeftBmp);
pDC->StretchBlt(0, 0, bmpHeaderLeft.bmWidth, iHeadHeight,
&mem, 0, 0, bmpHeaderLeft.bmWidth, bmpHeaderLeft.bmHeight, SRCCOPY);
pDC->SetBkMode(TRANSPARENT);
}