(MFC下),我在Dialog中绘制了一张图,请问如何将它保存起来,譬如保存在d盘??

作者&投稿:革舍 (若有异议请与网页底部的电邮联系)
这个实现比较烦,给个函数给你吧,这个是我屏幕截图用的函数。
只能保存为位图,当然你也可以用GDI+,如楼上所说,但是你要有该类库
参数:传入要保存的文件名,和保存的位图句柄
bool CopyScreenDlg::SaveBmpToFile(LPCSTR lpFileName,HBITMAP hBitmap)
{
//lpFileName 为位图文件名
HDC hDC;
//设备描述表
int iBits;
//当前显示分辨率下每个像素所占字节数
WORD wBitCount;
//位图中每个像素所占字节数
//定义调色板大小, 位图中像素字节大小 , 位图文件大小 , 写入文件字节数
DWORD dwPaletteSize=0,dwBmBitsSize,dwDIBSize, dwWritten;
BITMAP Bitmap;

BITMAPFILEHEADER bmfHdr; //位图属性结构

BITMAPINFOHEADER bi; //位图文件头结构
//位图信息头结构
LPBITMAPINFOHEADER lpbi;
//指向位图信息头结构
HANDLE fh, hDib, hPal;
HPALETTE hOldPal=NULL; //定义文件,分配内存句柄,调色板句柄

//计算位图文件每个像素所占字节数
iBits=24;
if (iBits<=1) wBitCount=1;
else if (iBits<=4 ) wBitCount =4;
else if (iBits<=8 ) wBitCount =8;
else if (iBits<=32) wBitCount =24;

//计算调色板大小
if (wBitCount<=8) dwPaletteSize=(1<<wBitCount)*sizeof(RGBQUAD);

//设置位图信息头结构
GetObject(hBitmap, sizeof(BITMAP),(LPSTR)&Bitmap);
bi.biSize=sizeof(BITMAPINFOHEADER);
bi.biWidth=Bitmap.bmWidth;
bi.biHeight=Bitmap.bmHeight;
bi.biPlanes=1;
bi.biBitCount= wBitCount;
bi.biCompression=BI_RGB;
bi.biSizeImage=0;
bi.biXPelsPerMeter= 0;
bi.biYPelsPerMeter= 0;
bi.biClrUsed=0;
bi.biClrImportant=0;

dwBmBitsSize= ((Bitmap.bmWidth*wBitCount+31)/32)*4*Bitmap.bmHeight;

//为位图内容分配内存
hDib =GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));
lpbi =(LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi=bi;

//处理调色板
hPal=GetStockObject(DEFAULT_PALETTE);
if(hPal)
{
hDC=GetDC()->GetSafeHdc();
hOldPal=SelectPalette(hDC,(HPALETTE)hPal,FALSE);
RealizePalette(hDC);
}
//获取该调色板下新的像素值
GetDIBits(hDC,hBitmap,0,(UINT)Bitmap.bmHeight,(LPSTR)lpbi+sizeof(BITMAPINFOHEADER)+dwPaletteSize,(BITMAPINFO *)lpbi,DIB_RGB_COLORS);
//恢复调色板
if(hOldPal)
{
SelectPalette(hDC,hOldPal,TRUE);
RealizePalette(hDC);
}
//创建位图文件
fh=CreateFile(lpFileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL);
if (fh==INVALID_HANDLE_VALUE) return FALSE;

//设置位图文件头
bmfHdr.bfType = 0x4D42; // "BM"
dwDIBSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize;
bmfHdr.bfSize= dwDIBSize;
bmfHdr.bfReserved1=0;
bmfHdr.bfReserved2=0;
bmfHdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwPaletteSize;
//写入位图文件头
WriteFile(fh,(LPSTR)&bmfHdr,sizeof(BITMAPFILEHEADER), &dwWritten,NULL);
//写入位图文件其余内容
WriteFile(fh,(LPSTR)lpbi,dwDIBSize,&dwWritten,NULL);
//清除
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);
return TRUE;

}

如果是在内存中用BitBlt绘制的,那么可以使用gdi +的Griphics.Save函数保存到文件,支持很多种保存格式,否则的话,可以先构造一个Bitmap,然后GetPiexl取得所以的像素,然后再保存

用java判断d盘下,图片名是否相同,另存为,如果相同就另存为别的名称,这个应该用java怎么写!~

my Chinese input is broken....
you can use file.exists() method to judge if your image name is already existed.
here is an example from my project, using SaveDialog frame.
private void saveAs(){if(image != null){JFileChooser jfc=new JFileChooser("."); jfc.setFileSelectionMode(JFileChooser.FILES_ONLY); FileNameExtensionFilter filter1 = new FileNameExtensionFilter("*.png", "png"); FileNameExtensionFilter filter2 = new FileNameExtensionFilter("*.jpg", "jpg"); FileNameExtensionFilter filter3 = new FileNameExtensionFilter("*.jpeg", "jpeg"); jfc.addChoosableFileFilter(filter1); jfc.addChoosableFileFilter(filter2); jfc.addChoosableFileFilter(filter3); jfc.setAcceptAllFileFilterUsed(false); jfc.setFileFilter(filter1); jfc.setSelectedFile(new File("2D_Code")); int returnVal = jfc.showSaveDialog(MainFrame.this); if(returnVal == JFileChooser.APPROVE_OPTION) { File file = jfc.getSelectedFile(); String tmp = jfc.getFileFilter().getDescription(); String imgType = tmp.substring(tmp.lastIndexOf(".") + 1, tmp.length()); String filename = file.getPath() + "." + imgType; file = new File(filename); if(file.exists()) { int i = JOptionPane.showConfirmDialog(this, "File exists! Overwrite it?","Attention",JOptionPane.OK_OPTION); if(i != JOptionPane.OK_OPTION) return; } try {ImageIO.write(image, imgType, file);JOptionPane.showMessageDialog(this, "Successfully saved!");} catch (IOException e1) {JOptionPane.showMessageDialog(this, "Failed saving.");e1.printStackTrace();} }} else {JOptionPane.showMessageDialog(this, "No image generated!");}}

在MFC中给对话框中设置背景图片,方法有多种,这里整理了三种,具体操作如下:


方法一:
1、声明成员变量CBrush m_brush;
2、在InitDialog中添加代码:
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1); //这个IDB_BITMAP1要自己添加
m_brush.CreatePatternBrush(&bmp);
3、重载对话框的OnCtlColor,改最后的返回值:
return (HBRUSH)m_brush;

方法二:
把下面这段代码加进OnPaint()里就行了
CPaintDC dc(this);
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1); //这个IDB_BITMAP1要自己添加
CBrush brush;
brush.CreatePatternBrush(&bitmap);
CBrush* pOldBrush = dc.SelectObject(&brush);
dc.Rectangle(0,0,200,200); // 这些参数可以调整图片添加位置和大小
dc.SelectObject(pOldBrush);

方法三:使用StretchBlt()函数,具有图像自适应窗体功能
CPaintDC dc(this);
CBitmap m_bmpBK;
m_bmpBK.LoadBitmap(IDB_BITMAP1);
CRect rect;
GetClientRect(&rect);//获得目标尺寸,即窗口客户区的坐标
BITMAP bitMap;//位图结构体
m_bmpBK.GetBitmap(&bitMap);//获得原图片尺寸
CDC dcMem; //目标DC
dcMem.CreateCompatibleDC(&dc); //创建与dc兼容的内存DC
dcMem.SelectObject(&m_bmpBK);//将位图对象m_bmpBK选入内存DC
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY);

mfc 在一个Dialog上点击了一个按钮,弹出一个popup属性的窗口,想这个...
答:在主对话框中,通过类向导添加一个 WM_MOVE的消息处理,见截图:然后在WM_MOVE的消息响应函数中通过调用API函数:SetWindowPos()来设置你那个popup窗口的位置,这样就能达到你想要的效果了。

MFC如何在对话框中输入文字
答:void c**view::oninitialupdate(){ cformview::oninitialupdate();/ 加入你要的初始化代码*/ getparentframe()->recalclayout();resizeparenttofit();} 在cformview中,通过跟踪可发现程序不会去调用cdialog::oninitdialog(),在cformview::create(**)中有如下语句createdlg(m_lpsztemplatename,pparent...

MFC,在子dialog中通过调用GetParent来获得父窗口指针,然后父窗口调用相 ...
答:那个地方窗口句柄为空,应该是你在调用这个接口前调用了父窗口的销毁函数吧;除了要销毁窗口的MFC资源外,还应该删除这个指针,否则会造成内存泄露;这么写真奇葩

C++ MFC向dialog中添加内容.
答:回答:在你画红框的地方拖一个静态文本框,然后把字写静态文本框上就可以了

在MFC中的OnInitDialog中写下如下语句:this->MoveWindow(0,0,40...
答:你这几个产生效果的最终都是调用的都是对话框类的MoveWindow,替换成以下语句效果一样:MoveWindow(0,1,400,300);0,0点的问题,在正常情况下都不会发生,除非你有多屏设置或者其它影响屏幕坐标的特殊设置,这个应该不是程序问题。加作用于::符号,本身就是有问题的,系统会容错纠正为上述语句使用。

...对话框的dialog1中添加一个dialog2,但是在dialog2中找不到OnInitDia...
答:在Dialog2中, 通过类向导增加虚函数, 选择OninitDialog

MFC中Dialog中加了控件为什么不显示
答:设置空件的visible属性

MFC Dialog 中怎么获取button的CDC和rect???急!!!
答:假设m_btnSend为CButton类型的控件变量,则取该button设备上下文指针和客户区大小的代码如下:CDC *pDC = m_btnSend.GetDC();CRect ret;m_btnSend.GetClientRect(&ret);

...编写的MFC程序中,在一个对话框的OnInitDialog中初始化ListControl控...
答:操作错误的可能原因两个:1.你的列表控件风格未设置报表格式。2.你把对话框的CDialogEx::OnInitDialog();扔了,里面要创建子窗口(资源控件)的。你的列表控件因此未创建窗口,你调用InsertColoumn()自然引发断言m_hWnd!=NULL。

mfc dialog中能嵌入另外一个dialog吗
答:可以的,把嵌入的对话框作为子对话框。