| 
 一、新建一对话框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;        
} 
 |