触摸屏租赁
Touch screen rental
广告机租赁
Advertising rental
机器人租赁
Robot leasing
 当前位置:首页 > > 文字转换为位图并保存实例

一、新建一对话框led111,加入图像控件,IDIDC_SHOW_WND,类型:位图。

加入编辑框,IDC_EDIT1,加放按钮,IDIDC_SAVE_SEAL,标题:保存图片。

加入组织框,IDIDC_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;

       //创建相容的bitmapdc

       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;      

}


工作室地址:重庆石桥铺电脑城B座 | 微信:z35544216 | 网址:www.35544216.com