一、新建一对话框led111,加入图像控件,ID:IDC_SHOW_WND,类型:位图。
加入编辑框,IDC_EDIT1,加放按钮,ID:IDC_SAVE_SEAL,标题:保存图片。
加入组织框,ID:IDC_FONT_STYLE
二、添加私有型protected成员函数CreateBmp(CBitmap *bitmap),类型为:void。
三、添加私有型protected成员函数DrawSubText1(CDC *MemDC),类型为:void。
四、在成员函数CreateBmp(CBitmap *bitmap)中加入代码如下:
void CLed111Dlg::CreateBmp(CBitmap *bitmap)
{
CClientDC dc(this);
//设置内存CDC
CDC MemDC;
//创建相容的bitmap和dc
bitmap->CreateCompatibleBitmap(&dc, 198, 198);
MemDC.CreateCompatibleDC(&dc);
MemDC.SelectObject(bitmap);
//在内存DC中绘制图章
DrawSubText1(&MemDC);
//将创建图片保存在内存中
MemDC.SelectObject(bitmap);
MemDC.DeleteDC();
}
五、建立类向导,加入成员变量如下:
。。。。。。。。。。。。。。。。。。。。。。。
// Dialog Data
//{{AFX_DATA(CLedDlg)
enum { IDD = IDD_LED_DIALOG };
CStatic m_picture;
CString m_strSub1Text;
CString m_strStyle;
//}}AFX_DATA
。。。。。。。。。。。。。。。。。。。。。。。。
六、在类CLed111Dlg添加成员变量如下:
public:
CBitmap m_pBitmap;
int m_nSub1Pos;
int m_nSub1Width;
int m_nSub1Height;
LOGFONT* m_lf;
CLed111Dlg(CWnd* pParent = NULL); // standard constructor
七、在led111Dlg.cpp中修改代码如下
。。。。。。。。。。。。。。。。。。。。。。。。
CLed111Dlg::CLed111Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CLed111Dlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CLed111Dlg)
m_strSub1Text = _T("中华人民共和国");
m_nSub1Height = 55;
m_nSub1Width = 18;
m_nSub1Pos = 20;
m_lf = new(LOGFONT);
m_strStyle = _T("幼圆");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
。。。。。。。。。。。。。。。。。。。。。
八、在成员函数OnInitDialog()加入代码如下:
BOOL CLed111Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 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
CreateBmp(&m_pBitmap);
m_picture.SetBitmap((HBITMAP)m_pBitmap.Detach());
return TRUE; // return TRUE unless you set the focus to a control
}
九、在类CLed111Dlg添加公共类成员函数UpdateShow(),类型:void并加入代码如下:
void CLed111Dlg::UpdateShow()
{
m_pBitmap.DeleteObject();
CreateBmp(&m_pBitmap);
//在picture控件中显示位图
m_picture.SetBitmap((HBITMAP)m_pBitmap.Detach());
}
十、双击编辑框,添加成员函数OnChangeEdit1(),并加入代码如下:
void CLed111Dlg::OnChangeEdit1()
{
UpdateData(TRUE);
UpdateShow();
}
十一、 在类CLed111Dlg添加私有型成员变量如下:
。。。。。。。。。。。。。。。。。。
protected:
CString m_strFile;
HICON m_hIcon;
。。。。。。。。。。。。。。。。。
十二、 双击按钮,添加成员函数OnSaveSeal(),并加入代码如下:
void CLed111Dlg::OnSaveSeal()
{
// TODO: Add your control notification handler code here
CFileDialog filedlg(FALSE);
int structsize=0;
DWORD dwVersion;
//检测目前的操作系统,GetVersion具体用法详见MSDN
dwVersion=GetVersion();
// 如果运行的操作系统是Windows NT/2000
if(dwVersion<0x80000000)
structsize = 88;//显示新的文件对话框
else
//运行的操作系统Windows 95/98
structsize = 76;//显示老的文件对话框
filedlg.m_ofn.lpstrFilter = "*.bmp";
filedlg.m_ofn.lStructSize=structsize;
if(filedlg.DoModal()==IDOK)
{
m_strFile = filedlg.GetPathName() + ".bmp";
UpdateData(FALSE);
SaveBitmapToFile(m_picture.GetBitmap(), (char*)(LPCTSTR)m_strFile); //(这行必须在相/关成员函数SaveBitmapToFile(HBITMAP hBitmap, LPSTR lpFileName)添加后才写入。)
}
}
十三、 在类CLed111Dlg添加私有类成员函数UpdateShow(),类型:BOOL码如下:
BOOL CLed111Dlg::SaveBitmapToFile(HBITMAP hBitmap, LPSTR lpFileName)
{
//设备描述表
HDC hDC;
//当前分辨率下每象素所占字节数
int iBits;
//位图中每象素所占字节数
WORD wBitCount;
//定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;
//位图属性结构
BITMAP Bitmap;
//位图文件头结构
BITMAPFILEHEADER bmfHdr;
//位图信息头结构
BITMAPINFOHEADER bi;
//指向位图信息头结构
LPBITMAPINFOHEADER lpbi;
//定义文件,分配内存句柄,调色板句柄
HANDLE fh, hDib, hPal,hOldPal=NULL;
//计算位图文件每个像素所占字节数
hDC = CreateDC("DISPLAY", NULL, NULL, NULL);
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
DeleteDC(hDC);
if (iBits <= 1)
wBitCount = 1;
else if (iBits <= 4)
wBitCount = 4;
else if (iBits <= 8)
wBitCount = 8;
else
wBitCount = 24;
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.biClrImportant = 0;
bi.biClrUsed = 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(NULL);
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, (HPALETTE)hOldPal, TRUE);
RealizePalette(hDC);
::ReleaseDC(NULL, 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;
}
|