zoukankan      html  css  js  c++  java
  • 使用VC2005一些问题及解决方案(二)

    VC遇到的以及解决了的问题(二)

    1,控件和变量相关联之后,没有发生数据交换:

    当控件和一个变量相关联之后,控件与成员变量的数据交换是通过DoDataExchange函数来完成的,然而程序中并不直接调用这个函数,二十通过调用UpdateData函数来调用它的!!UpdateData函数是的参数是TRUE的时候从空间得到成员变量的值,参数是FALSE时候,使用成员变量的值初始化控件。


    2,在VC2005中如何添加WM_INITDIALOG响应

    这个响应应该是重写虚函数:OnInitDailog()来获得。


    3, 在VC2005中给工具栏按钮添加消息映射的方法

    在VC6.0中很简单类向导直接添加就行了,但是在VC2005中无论属性页中还是右键点击都不能添加消息事件处理,只有两种方法:

    1,按照类向导添加的代码自己写就行了,三个需要修改的地方,函数声明,消息映射,函数定义。
    2,在菜单中建立同样ID的菜单项,通过这个菜单项来添加。

    开始我很郁闷,这么麻烦,后来想想这个修改也是为了程序的严格,直白说就是工具栏的按钮都应该和菜单栏的功能对应才好。


    4, VC中删除工具栏按钮

    按Delete键只能清除按钮图标的颜色,要删除按钮只要把按钮用鼠标拖出工具栏就行了。


    5, VC中给菜单项添加复选标记

    给当前按钮添加一个UpdateView的事件处理,如下:

    void CMainFrame::OnUpdateViewNewtoolbar(CCmdUI *pCmdUI)
    {
    // TODO: 在此添加命令更新用户界面处理程序代码
    pCmdUI->SetCheck(m_newToolBar.IsWindowVisible());
    }


    6,在VC2005中自定义一个消息时候出现错误:error C2440: “static_cast”: 无法从“void (__thiscall CMainFrame::* )(void)”转换为“LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)”的问题解决:

    在定义时候我就是用:

    头文件MainFrm.h:  
       
    #define   UM_PROGRESS   WM_USER+1   //定义消息  
       
    afx_msg   void   OnProgress();   //   生成的消息映射函数  
       
    源文件MainFrm.cpp:  
       
    //消息映射  
    BEGIN_MESSAGE_MAP(CMainFrame,   CFrameWnd)  
    ON_MESSAGE(UM_PROGRESS,OnProgress)  
    END_MESSAGE_MAP()  
       
    //消息实现  
    void   CMainFrame::OnProgress()  
    {  
    //todo:  
    }  

    然后出现如上的错误原因是: VC6.0编译器有个BUG,就是允许你用:afx_msg void OnProgress();我们应该把函数改成LRESULT OnProgress(WPARAM, LPARAM).
    这样问题就解决了。然而MFC中一些向导生成的有许多是用void的,其实这个很多是继承了虚函数的,具体要参见MFC底层代码。注意定义函数时候的返回值(返回一个0就行)。

    7,一个优先级注意的地方:
    (CMainFrame*)GetParent()->m_wndStatusBar.SetWindowText(str);意味着:(CMainFrame*)(GetParent()->m_wndStatusBar.SetWindowText(str))。
    所以要是调用CMainFrame的m_wndStatusBar,应该:((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);还注意m_wndStatusBar的访问权限要是public。


    8,如何读取一个Eidt控件里面多行的浮点数据,并将它每行存到一个Vector容器中。

    CString strLine;
    int lineCount, lineLen;
    vector<double> array;

    lineCount = m_edit.GetLineCount();
    this->m_calculate.array.clear();

    for (int i = 0; i < lineCount; i++)
    {
       lineLen = m_edit.LineLength(m_edit.LineIndex(i))+1;
       m_edit.GetLine(i, strLine.GetBuffer(lineLen), lineLen);
       strLine.ReleaseBuffer(lineLen);
       this->m_calculate.array.push_back(atof(strLine));
    }

    注意:上面的代码参考自MSDN:http://msdn.microsoft.com/zh-cn/library/s7zy7cwk(VS.80).aspx,但是,源代码中第10行是:
    lineLen = m_edit.LineLength(m_edit.LineIndex(i))
    这是每当第一行数据只有1位的时候,例如5,变成了0。我加了一个1,之后就没有类似问题了。


    9,下面附加一些MFC中和标准库中类型转换的问题:

    CString转换为int, double...
    int: _wtoi(CString*) long int: _wtol(CString*) double/float: _wtof(Cstring*)

    CString和double相互转换:
    CString m;
    double num = atof(m);
    m.format("%f",num);

    10,有关C++ int,char,string,CString类型转换

    转自: http://blog.sina.com.cn/s/blog_4c22ff8d01000ati.html [查看原文]

    C++ int,char,string,CString类型转换(整理总结)

    #include <string> //使用C++标准库的string类时
    using namespace std; //同上

    #include <sstream>
    #include <iostream>
    #include <stdlib.h>    //要将string类和int类型直接转换最好有这些包含,

                           //因为自己写一个转换函数比较方便,函数定义参考如下

    string getstring ( const int n )

    {

        std::stringstream newstr;
        newstr<<n;
        return newstr.str();

    }            

    string 转 CString
    CString.format(”%s”, string.c_str());

    char 转 CString
    CString.format(”%s”, char*);

    char 转 string
    string s(char *);

    string 转 char *
    char *p = string.c_str();

    CString 转 string
    string s(CString.GetBuffer());

    1,string -> CString
    CString.format(”%s”, string.c_str());
    用c_str()确实比data()要好.
    2,char -> string
    string s(char *);
    只能初始化,在不是初始化的地方最好还是用assign().
    3,CString -> string
    string s(CString.GetBuffer());
    GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.

    《C++标准函数库》中说的
    有三个函数可以将字符串的内容转换为字符数组和C―string
    1.data(),返回没有”\0“的字符串数组
    2,c_str(),返回有”\0“的字符串数组
    3,copy()

    ―――――――――――――――――――――

    CString与int、char*、char[100]之间的转换- -

    CString与int、char*、char[100]之间的转换- -

    CString互转int

    将字符转换为整数,可以使用atoi、_atoi64或atol。
    而将数字转换为CString变量,可以使用CString的Format函数。如
    CString s;
    int i = 64;
    s.Format(”%d”, i)
    Format函数的功能很强,值得你研究一下。

    void CStrDlg::OnButton1()
    {
    // TODO: Add your control notification handler code here
    CString
    ss=”1212.12″;
    int temp=atoi(ss);
    CString aa;
    aa.Format(”%d”,temp);
    AfxMessageBox(”var is ” + aa);
    }

    sart.Format(”%s”,buf);

    CString互转char*

    ///char * TO cstring
    CString strtest;
    char * charpoint;
    charpoint=”give string a value”;
    strtest=charpoint;

    ///cstring TO char *
    charpoint=strtest.GetBuffer(strtest.GetLength());

    标准C里没有string,char *==char []==string

    可以用CString.Format(”%s”,char *)这个方法来将char *转成CString。要把CString转成char *,用操作符(LPCSTR)CString就可以了。

    CString转换 char[100]

    char a[100];
    CString str(”aaaaaa”);
    strncpy(a,(LPCTSTR)str,sizeof(a));

  • 相关阅读:
    二叉树中序遍历
    前序遍历
    配置免秘钥登录
    pip安装
    zookeeper C client API 和zkpython 的安装
    安装 Java
    json递归查询
    php 编译安装
    docker 中 安装配置 mysqlcluster(arm)
    glibc编译安装
  • 原文地址:https://www.cnblogs.com/CCBB/p/1443428.html
Copyright © 2011-2022 走看看