zoukankan      html  css  js  c++  java
  • MFC学习问题总结

    1.学习MFC添加位图,无法获取其ID

    1).点击视图->其他窗口->资源视图,你会发现“无法在此窗口显示”,找到resource.h文件,关闭即可重新走一遍上面的过程就会发现可以打开了。

    2).资源视图,右键->添加资源->新建Bitmap,然后在新建的bitmap上随便画点东西,保存,点开bitmap文件,就会看到有了IDB_BITMAP1当然也可以在最下面属性窗口进行修改,保存,完了之后,程序可能仍然会显示“未能识别的标识符”等等,不用管,重新编译,即可通过,重新画图就可以了。

    2.如何添加消息响应和成员变量?项目->类向导。

    3.MoveToEx()与MoveTo()的区别

    CDC::MoveTo 

    CPoint MoveTo( int x, int y );CPoint MoveTo( POINT point );

    Return:The x- and y-coordinates of the previous position as a CPoint object

    :MoveTo由CDC类的对象调用,可以输入点的位置或点类,返回前一点的位置。

    MoveToEx()

    BOOL MoveToEx(

      HDC hdc,          // handle to device context
      int X,            // x-coordinate of new current position
      int Y,            // y-coordinate of new current position
      LPPOINT lpPoint   // old current position
    );
    ,为全局函数,调用时使用::符号,功能->移动到当前点的位置,保存前一点的位置。
     4.如何添加PopUpMenu()控件?
    VS2008,10,12,13中似乎都没有PopUpMenu控件,如何添加呢?我们可以变通一下,找到类向导->选择View类,添加WM_CONTEXTMENU,编辑代码,就会发现出来了一个OnContextMenu函数(),并在其中添加:
    if (point.x == -1 && point.y == -1) 
     { 
      CRect rect; 
      GetClientRect(rect); 
      ClientToScreen(rect); 
      point = rect.TopLeft(); 
      point.Offset(5, 5); 
     } 
     CMenu menu; 
     VERIFY(menu.LoadMenu(CG_IDR_POPUP_TYPING_TEST_VIEW));        //CG_IDR_POPUP_TYPING_TEST_VIEW为菜单ID,不唯一每个人建的不一样名称也不一样 
     CMenu* pPopup = menu.GetSubMenu(0); 
     ASSERT(pPopup != NULL); 
     CWnd* pWndPopupOwner = this; 
     while (pWndPopupOwner->GetStyle() & WS_CHILD)  pWndPopupOwner = pWndPopupOwner->GetParent(); 
     pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,pWndPopupOwner); 
    }
    5.如何对新建的IDR_MENU1菜单的菜单项添加响应函数?
    :资源视图-》点开IDR_MENU1->显示-》右键-》添加事件处理程序,自行修改类和函数名即可。
    6.VS2013无法直接删除成员函数?
    :找到指定的成员函数,需要修改三处,
    1)//void CMFC03View::OnShow()

    //{
    // // TODO: 在此添加命令处理程序代码
    // MessageBox(_T("View Show"));
    //}

    2)//afx_msg void OnShow();

    3)//ON_COMMAND(ID_ABC_32773, &CMFC03View::OnShow)

     7.类型转换
    一般的转换方式,强制转换:如类型T1转换为类型T2,T2=(T2)T1;
    非一般的转换方式:
    const char->LPCSTR: LPCSTR =_T(const char);
         UINT->CString   :CString=wchar_t(UINT);
     8.在孙鑫的MFC第八讲对话框编程中大家可能会遇到:
    1     int num1, num2, num3;
    2     char ch1[10], ch2[10], ch3[10];
    3     GetDlgItem(IDC_EDIT1)->GetWindowText(ch1, 10);
    4     GetDlgItem(IDC_EDIT2)->GetWindowText(ch2, 10);
    5     num1 = atoi(ch1);
    6     num2 = atoi(ch2);
    7     num3 = num1 + num2;
    8     itoa(num3, ch3, 10);
    9     GetDlgItem(IDC_EDIT3)->SetWindowText(ch3);

    编译出错:

    错误 1 error C2664: “void CWnd::GetWindowTextW(CString &) const”: 无法将参数 1 从“char [10]”转换为“LPTSTR” c:usersdocumentsvisual studio 2013projectsmfc05mfc05mfc05dlg.cpp 97 1 MFC05

    错误 2 error C2664: “void CWnd::GetWindowTextW(CString &) const”: 无法将参数 1 从“char [10]”转换为“LPTSTR” c:usersdocumentsvisual studio 2013projectsmfc05mfc05mfc05dlg.cpp 98 1 MFC05

    错误 3 error C2664: “void CWnd::SetWindowTextW(LPCTSTR)”: 无法将参数 1 从“char [10]”转换为“LPCTSTR” c:usersdocumentsvisual studio 2013projectsmfc05mfc05mfc05dlg.cpp 103 1 MFC05

    原因总结:字符集配置不同。

    改正方法:

    1     int num1, num2, num3;
    2     TCHAR ch1[10], ch2[10], ch3[10];/*16个字节的字符,宽字符*/
    3     GetDlgItem(IDC_EDIT1)->GetWindowText((ch1), 10);
    4     GetDlgItem(IDC_EDIT2)->GetWindowText((ch2), 10);
    5     num1 = _ttoi(ch1);/*转换宽字符的字符串为整数,#define _ttoi _wtoi*/
    6     num2 = _ttoi(ch2);
    7     num3 = num1 + num2;
    8     _itot(num3, ch3, 10);/*转换整数为宽字符字符串 #define _itot _itow*/
    9     GetDlgItem(IDC_EDIT3)->SetWindowText(ch3);

     9.VS2013里面并没有WM_INITDIALOG消息,怎么添加消息响应函数呢?

    方法:选择视图->类视图,其他窗口->属性管理器,在类视图里面找到相应的CDialog类,选中,属性管理器下面显示的内容就会发生变化,点击绿色的小正方体(第六个图标),就会发现很多函数名,其中之一就是OnInitDialog,编辑代码即可。

    10.编译出错:Run-Time Check Failure #2 - Stack around the variable 'ch' was corrupted.

        原因:使用的数组越界,如定义ch[5],若使用ch[5],就会出现此问题

        修改方法:数组扩大或查看使用数组下标是否越界。

    11.使用#include <fstream.h>,运行时会出现error C1083: 无法打开包括文件: “fstream.h”: No such file or directory

        修改方法:#include <fstream>
                      using namespace std;

    12.字符常量不能在MessageBox()函数中输出,解决方法char ch[10];CString str(ch);MessageBox(str);

    13.在进行socket编程的时候,在同一个解决方案下的客户端和服务端两个程序只能执行一个,解决方法:打开两个VC,分别运行客户端和服务端,则可以实现客户端和服务端之间的通信。

     

     
  • 相关阅读:
    gradle平级项目引用
    java使用ssh访问Linux的项目jscraft
    debian更新源时找不到公钥的解决办法
    debian系在线安装软件apt-get命令族
    vim打造开发IDE
    Mysql主从同步配置
    byte[] 转Hex String
    记录一次条件比较多的SQL查询语句
    LruCache的缓存策略
    LinkedHashMap的实现原理
  • 原文地址:https://www.cnblogs.com/ljwan1222/p/4939483.html
Copyright © 2011-2022 走看看