MFC+类型转换
- 格式:pdf
- 大小:5.37 MB
- 文档页数:23


色彩鲜艳漂亮的高品质图像,一个个形象的Windows图标,高速运动、活灵活现的三维动画,这些生动的图形无一不显示着程序设计者的艺术才华。
在程序设计中,图像处理已经成了每个程序员的必修课,所以,对于每个程序员来说,熟悉“BMP”、“GIF”、“JPEG”图像格式及具体应用、调色板、图像文件头格式、图像压缩算法等概念似乎已经成了工作中不可缺少的基础知识。
面对如此多的图像格式,如果要全部掌握其具体细节,好像这对程序员有些不公。
在VC中编程显示一幅位图,下列的步骤是不可少的:装入位图、获得位图的大小信息、启用设备环境、位传输,所需的程序代码显得千篇一律的冗长。
如果想要装入的位图另存为其他格式的图像文件……?两个字:头疼!而这一切都是因为GDI本身的局限性所造成。
随着Windows2000的推出,上面的情况有了大大的改观:你可以不必了解每种图像格式的具体含义,照样可以写出多格式图像浏览或转换程序,这一切,全部都依赖于Windows 2000及后继版中所使用的GDI+技术。
首先来看看GDI+的具体技术细节及GDI+编程特点。
Windows2000在用户界面方面包括了几个重大的改进,可能你已经注意到了有阴影的鼠标、渐入的工具条快速提示、透明的窗口、平滑地窗口变化等。
Windows 2000在界面上之所以有这么大的改进,完全是因为Windows2000采用了一种GDI(graphicsdeviceinterface:图形设备接口)。
这种GDI,以前叫GDI2k,现在有了一个更好听的名字:GDI+。
GDI+是一种新型的图形设备接口,它的主要特点在于它能够创建全新的用户桌面体系、能够轻易地完成二维或三维的图形处理,为桌面带来一种数字化的图片。
GDI 同时也提供了增强的图形处理技术,如常见的:alphablending、纹理、贴图、增强的文本及图片显示技术。
实际上,GDI 主要的特色就在于强调通过硬件加速来达到良好的视觉感受!同传统的GDI不同,GDI+中引入了对COM(组件对象模型)技术的支持,通过COM技术,GDI+简化了对图像文件的访问(打开、保存)程序:通过调用COM组件来实现的,GDI+扮演的只是指挥者,而非操作员。
MFC实现简易数据类型转换器[资料](可编辑)(文档可以直接使用,也可根据实际需要修改使用,可编辑推荐下载)MFC实现简易数据类型转换器©Free Copy最大支持32位无符号整数,支持直接拷贝数据,操作极为简便;先选择进制,键盘输入或拷贝进去一个数,再点击其它进制单选按钮,即可实现转换并显示,同时显示文本框获得焦点。
项目文件名称:Convert完整实现文件代码:在类中,添加成员jinzhi,用于记录当前正在显示的进制添加函数char *dectobin(unsigned long dec,int len) 用于将十进制整数转换为字符串,len为字符串长度// ConvertDlg.cpp : implementation file///***************************************************************************** ******* 简易进制转换器*******by 杜运福*****************************************************************************/ #include "stdafx.h"#include "Convert.h"#include "ConvertDlg.h"#include "string.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CConvertDlg dialogCConvertDlg::CConvertDlg(CWnd* pParent /*=NULL*/): CDialog(CConvertDlg::IDD, pParent){//{{AFX_DATA_INIT(CConvertDlg)m_Num = _T("");m_Ridio = 1; //初始化为十进制//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CConvertDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CConvertDlg)DDX_Text(pDX, IDC_Num, m_Num);DDX_Radio(pDX, IDC_Hex, m_Ridio);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CConvertDlg, CDialog)//{{AFX_MSG_MAP(CConvertDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_Hex, OnHex) //非别是事件映射十六进制ON_BN_CLICKED(IDC_Ten, OnTen) //十进制ON_BN_CLICKED(IDC_Eight, OnEight)//八进制ON_BN_CLICKED(IDC_Two, OnTwo) //二进制//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CConvertDlg message handlers////////////////////////////////////////////////////////////////////////////BOOL CConvertDlg::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 dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization herejinzhi = 10;UpdateData(FALSE);return FALSE; // return TRUE unless you set the focus to a control}void CConvertDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// If you add a minimize button to your dialog, you will need the code below// to draw the icon. For MFC applications using the document/view model,// this is automatically done for you by the framework.void CConvertDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}// The system calls this to obtain the cursor to display while the user drags// the minimized window.HCURSOR CConvertDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}/**************************************************将十进制转换为二进制字符串**入口参数:dec:待转换的整数** len:目标二进制位数**出口参数:转换得到的字符串的指针************************************************/char * CConvertDlg::dectobin(unsigned long dec,int len){int i=0;static char buf[256];memset(buf,0,256);memset(buf,0,len);while(dec!=0){buf[i++]=dec%2+48;dec=dec/2;}return strrev(buf);}//十六进制void CConvertDlg::OnHex(){UpdateData();GetDlgItem(IDC_Num)->SetFocus(); //首先设置文本框为焦点char *strnum; //用于存放文本框的字符串unsigned long num=0,quan=1; //数值与权值int i,len; //局部变量与字符长度if(jinzhi != 16) { //上次选择不是16进制时,才进行下面操作strnum=new char[100]; //先分配内存memset(strnum,0,99);len = m_Num.GetLength(); //获取字符串长度m_Num.MakeReverse(); //先逆序,准备按权计算其十进制数转换strnum = (LPSTR)(LPCTSTR)m_Num; //强行转换为字符串if(jinzhi == 10) //当前显示的是10进制?{for(i=0;i<len;i++){num += (strnum[i]-48)*quan;quan *= 10;}}else if(jinzhi == 8) //当前显示的是8进制?{for(i=0;i<len;i++){num += (strnum[i]-48)*quan;quan *= 8;}}else if(jinzhi == 2) //当前显示的是2进制?{for(i=0;i<len;i++){if((strnum[i]=='0')||(strnum[i]=='1')){num += (strnum[i]-48)*quan;quan *= 2;}}}if(num != 0){strnum = ultoa(num,strnum,16); //用函数将整数转换成16进制形式字符串m_Num = strnum;}else m_Num = "";} //将数值转换为16进制到此完成m_Num.MakeUpper(); //字符串中小写字母大写输出jinzhi = 16;UpdateData(FALSE);}//十进制void CConvertDlg::OnTen(){UpdateData();GetDlgItem(IDC_Num)->SetFocus(); //首先设置文本框为焦点char *strnum;unsigned long num=0,quan=1;int i,len;if(jinzhi != 10) {strnum=new char[100];memset(strnum,0,99);len = m_Num.GetLength();m_Num.MakeReverse();strnum = (LPSTR)(LPCTSTR)m_Num;if(jinzhi == 16) //当前显示的是16进制?{for(i=0;i<len;i++){if((strnum[i]>='0')&&(strnum[i]<='9')){num += (strnum[i]-'0')*quan;}else if((strnum[i] >= 'a')&&(strnum[i] <= 'f')) //进行小写字母的处理{num += (strnum[i]-'a'+10)*quan;}else if((strnum[i] >= 'A')&&(strnum[i] <= 'F')) //进行大写字母的处理{num += (strnum[i]-'A'+10)*quan;}quan *= 16;}}else if(jinzhi == 8) //当前显示的是8进制?{for(i=0;i<len;i++){num += (strnum[i]-48)*quan;quan *= 8;}}else if(jinzhi == 2) //当前显示的是2进制?{for(i=0;i<len;i++){if((strnum[i]=='0')||(strnum[i]=='1')){num += (strnum[i]-48)*quan;quan *= 2;}}}if(num != 0){strnum = ultoa(num,strnum,10); //用函数将整数转换成10进制形式字符串m_Num = strnum;}else m_Num = "";} //将数值转换为10进制到此完成jinzhi = 10;UpdateData(FALSE);}//八进制void CConvertDlg::OnEight(){UpdateData();GetDlgItem(IDC_Num)->SetFocus(); //首先设置文本框为焦点char *strnum;unsigned long num=0,quan=1;int i,len;if(jinzhi != 8) {strnum=new char[100];memset(strnum,0,99);len = m_Num.GetLength();m_Num.MakeReverse();strnum = (LPSTR)(LPCTSTR)m_Num;if(jinzhi == 16){for(i=0;i<len;i++){if((strnum[i]>='0')&&(strnum[i]<='9')){num += (strnum[i]-'0')*quan;}else if((strnum[i] >= 'a')&&(strnum[i] <= 'f')){num += (strnum[i]-'a'+10)*quan;}else if((strnum[i] >= 'A')&&(strnum[i] <= 'F')){num += (strnum[i]-'A'+10)*quan;}quan *= 16;}}else if(jinzhi == 10){for(i=0;i<len;i++){num += (strnum[i]-48)*quan;quan *= 10;}}else if(jinzhi == 2){for(i=0;i<len;i++){if((strnum[i]=='0')||(strnum[i]=='1')){num += (strnum[i]-48)*quan;quan *= 2;}}}if(num != 0){strnum = ultoa(num,strnum,8); //用函数将整数转换成8进制形式字符串m_Num = strnum;}else m_Num = "";}jinzhi = 8;UpdateData(FALSE);}//二进制void CConvertDlg::OnTwo(){UpdateData();GetDlgItem(IDC_Num)->SetFocus(); //首先设置文本框为焦点char *strnum;unsigned long num=0,quan=1;int i,len,temp;if(jinzhi != 2) {strnum=new char[100];memset(strnum,0,99);len = m_Num.GetLength();m_Num.MakeReverse();strnum = (LPSTR)(LPCTSTR)m_Num;if(jinzhi == 16){for(i=0;i<len;i++){if((strnum[i]>='0')&&(strnum[i]<='9')){num += (strnum[i]-'0')*quan;}else if((strnum[i] >= 'a')&&(strnum[i] <= 'f')){num += (strnum[i]-'a'+10)*quan;}else if((strnum[i] >= 'A')&&(strnum[i] <= 'F')){num += (strnum[i]-'A'+10)*quan;}quan *= 16;}}else if(jinzhi == 10){for(i=0;i<len;i++){num += (strnum[i]-48)*quan;quan *= 10;}}else if(jinzhi == 8){for(i=0;i<len;i++){num += (strnum[i]-48)*quan;quan *= 8;}}strnum = dectobin(num,36); //八位十六进制为32位二进制m_Num = strnum;len = m_Num.GetLength();temp = len;while(len > 4) //从后向前依次每个4个二进制数插入一个空格符{m_Num.Insert(len-4,' ');len -= 4;}len = m_Num.GetLength();while(temp%4){m_Num.Insert(0,'0'); //在最前端补0,使4位对齐temp += 1;}}if(num == 0) m_Num = "";jinzhi = 2;UpdateData(FALSE);。
MFC视图切换全总结交流的朋友请加我QQ:451072182我的百度空间:/%BB%B6stephen/home单纯视图之间的切换单文档多视图切换是我在学习MFC中遇到的一个老大难问题,在今天总算是一一破解了。
我觉得视图切换分为三个等级,第一是在未切分窗格的情况下切换视图类;第二是在分割窗格的一个窗格内实行视图切换;第三是在分割窗格和未分割之间的切换和视图切换。
在MFC创建SDI的伊始,MFC默认的视图类是CView,如果CView 满足你的需求,可以直接单击finish,如果你不想让CView成为你的默认视图类,你可以在下图这个地方修改。
如果你忘记了修改默认的视图类这也没关系,我们可以在代码中改变:在App类里面有个函数叫InitInstance(),在这里面有一段代码CSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(Cprogram8Doc),RUNTIME_CLASS(CMainFrame),RUNTIME_CLASS(CView1)); //这里更改你的默认视图类,注意不要忘记包含头文件哦if (!pDocTemplate)return FALSE;AddDocTemplate(pDocTemplate);说完了默认视图类的更改,我们现在进入主题。
1、首先创建你需要切换的视图类,AddClass进入或者创建一个控件然后AddClass创建控件关联类,后者适用于Form之类的控件。
2、控制之处,比如菜单项单击、单击鼠标什么的,我是使用菜单项来切换窗口的void CMainFrame::OnView1(){// TODO: Add your command handler code hereSwitchToForm(IDD_FORMVIEW1);}void CMainFrame::OnView2(){// TODO: Add your command handler code hereSwitchToForm(IDD_FORMVIEW2);}3、SwitchToForm这个函数主要用于视图切换在这个函数中主要做以下几个动作:1、获得当前视图类指针和需要转换的视图类指针,如果是第一次使用需要New一个,并且与文档类关联;2、改变活动视图;3、显示新视图和隐藏旧视图;4、设置控件ID;5、调整框架视图。
mfc 标准表达式中数据类型不匹配当你在MFC(Microsoft Foundation Classes)或其他C++编程环境中遇到“数据类型不匹配”的错误,这通常意味着你在某处尝试将一种数据类型用作另一种不兼容的数据类型。
以下是一些可能导致此错误的常见原因和解决方法:类型转换错误:如果你尝试将一个整数转换为字符串,但没有正确地进行转换,你可能会遇到这种错误。
解决方法:使用适当的转换函数,如std::to_string或std::stringstream。
函数参数不匹配:如果你调用一个函数并传递了错误类型的参数,你可能会收到此错误。
解决方法:检查函数的声明,确保你传递的参数类型与函数期望的参数类型匹配。
操作符重载问题:如果两个对象类型都重载了某个操作符,并且这两个对象的类型不兼容,你可能会看到此错误。
解决方法:检查重载的操作符,并确保它们的用法是正确的。
容器或数组的使用:如果你尝试从容器中获取或修改元素,但使用的索引或迭代器类型与容器中的元素类型不匹配,你可能会看到此错误。
解决方法:确保你使用的索引、迭代器或指针的类型与容器中的元素类型匹配。
模板编程问题:在模板编程中,如果你尝试使用不兼容的类型作为模板参数,你可能会看到此错误。
解决方法:确保模板参数的类型与预期的使用场景相匹配。
外部库或框架:如果你的代码与外部库或框架的某些部分不兼容,特别是数据类型方面,你可能会看到此错误。
解决方法:检查外部库或框架的文档,确保你正确地使用了它们。
编译器或环境问题:有时,编译器或开发环境的问题也可能导致此类错误。
解决方法:尝试更新编译器或开发环境,或者查看相关的官方文档和社区支持。
为了更准确地诊断和解决问题,最好查看具体的错误消息和代码上下文。
这通常会提供关于哪个部分或哪一行代码导致错误的更多信息。