MFC点滴积累

(1)_T()和_TEXT()区别:
目的是为了对UNICODE码做区分,若定义了_UNICODE标志符则: 
  有宏#define   __T(x) L##x   //##为粘贴符号 
  否则:#define__T(x)   x 
  _TEXT()的定义与   __T()相同: 
  #define   _T(x)   __T(x) 
  #define   _TEXT(x)   __T(x) 
  UNICODE为区别于8位ASCII码的16位编码形式  
  当定义了宏UNICODE时,_TEXT("a")就变成了L"a";否则,就是"a". 
  _T和_TEXT一样。 
  写字符串常量时加上这个宏可以使你在把程序改为Unicode程序时比较容易。

(2)CNetMsgServerDlg   *dlg=(CNetMsgServerDlg*)   AfxGetApp()->GetMainWnd(); 
   请问上面的语句中 AfxGetApp()和GetMainWnd()表示什么意思?  
    AfxGetApp   --   取应用程序实例指针 
      GetMainWnd   --   取主窗口对象指针 
        这两个函数可以合成一个:  AfxGetMainWnd();
标注:
 AfxGetApp()取得指向当前工程的CWinApp对象的指针, 
  GetMainWnd()函数返回CWnd指针

(3)TRACE,TRACE0, TRACE1, TRACE2, TRACE3, AfxDump 都是干什么的?TRACE有什么用?
摘自MSDN:
Debug mode输出调试信息
Debug 方式编译时输出调试信息,当Release方式编译时就不输出了。
代替 printf("error message"); 一个很好的方法。
以下用法在VC中用F5调试,在调试窗口中会显示出调式值出来
用法一(TRACE)

    // example for TRACE
    int i = 1;
    char sz[] = "one";
    TRACE( "Integer = %d, String = %s/n", i, sz );
    // Output: 'Integer = 1, String = one'
用法二(TRACE0)
    // example for TRACE0
    TRACE0( "Start Dump of MyClass members:" );
用法三(TRACE1)
    // example for TRACE1
    int i = 1;
    TRACE1( "Integer = %d/n", i );
    // Output: 'Integer = 1'
用法四(TRACE2)
    // example for TRACE2
    int i = 1;
    char sz[] = "one";
    TRACE2( "Integer = %d, String = %s/n", i, sz );
    // Output: 'Integer = 1, String = one'
在调试窗口中可看到输出结果。

用afxDump在Debug方式下查看值(afxDump)
int nValue = 100;
#ifdef _DEBUG  
    afxDump << "File could not be opened " << nValue << "/n";
#endif
DEBUG 输出值:File could not be opened 100

TRACE0, TRACE1, TRACE2, TRACE3~~~~~~~上面有用法,用法的不同在于它们的输出参数不同。
而afxDump则直接与流符号“<<”来输出信息,输出的参数多个,与流符号“<<”的操作是完全相同的。
afxTraceEnabled则用来对TRACE0, TRACE1, TRACE2, TRACE3宏是否有用。
afxTraceEnabled = FALSE;  // 表TRACE无效
afxTraceEnabled = TRUE;  // 表TRACE有效

(4)运行时候出现fatal error C1071 unexpected end of file found in comment什么原因?
错误原因如下:    /*  */ 不完整 或是
/*控制打印左侧的 * 号*/
具体原因我说不出来,据说是因为某些特殊中文字符在某些字符集下会被处理成特殊的转义序列, 并且GBK字符集中尾字符还包含了C标准的转义字符 0x5C /'/' , 在这些情况下, 转义字符后跟 */ 或者是单行注释的换行都会出错, 特别是在非中文的系统下编译的时候这种情况特别严重 ...
注释里有中文等字符的时候, 记得在单行注释最后加个空格, 多行注释 */ 前加一个空格 ...
当然最好的是注释都用英文 , over ...

(5)怎么去掉状态栏 / 菜单栏 / 工具栏, 修改标题等

//   去掉菜单和修改标题

方法一:

BOOL CMFChomeworkApp::InitInstance()

{

     m_pMainWnd->ShowWindow(SW_SHOW);

     // 去掉菜单和修改标题

     AfxGetMainWnd()->SetMenu(NULL);

     AfxGetMainWnd()->SetWindowText("Sort");

     m_pMainWnd->UpdateWindow();

}

方法二:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 

{ 

                  ............. 

                  ............. 

     this->SetWindowText("sfefef");     //加这句 

     return 0; 

}   

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&   cs) 

{ 

     if( !CFrameWnd::PreCreateWindow(cs)) 

     return FALSE; 

     //   TODO:   在此处通过修改   CREATESTRUCT   cs   来修改窗口类或 

     //   样式 

        cs.style   &=   ~FWS_ADDTOTITLE;       //加这句 

     return TRUE; 

}

方法四:

原理: 主窗口的创建实际上是由Create函数来创建的, Create函数最终是调用CreateWindowEx函数

故可以重载 C**FramWnd 中的Create函数

:

BOOL CMainFrame::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle , const RECT& rect , CWnd* pParentWnd , LPCTSTR lpszMenuName , DWORD dwExStyle , CCreateContext* pContext)

{

     // TODO: 在此添加专用代码和/或调用基类

     lpszClassName = NULL;

     lpszWindowName = "+++";

     dwStyle = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_VSCROLL;

     pParentWnd = NULL;

     lpszMenuName = NULL;

     dwExStyle = NULL;

     pContext = NULL;

     return CFrameWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, lpszMenuName, dwExStyle, pContext);

}

则可将标题进行修改为: +++

:

(1)如果同时用了前面几种方法,最终的标题是由方法一决定的,原因是产生窗口是由以下几行代码决定:

    BOOL CMyWinApp:: InitInstance()

{

    m_pMainWnd = new CMyFramWnd; // 调用构造函数,而构造函数调用Create函数

    m_pMainWnd->ShowWindow(m_nCmdShow);

    m_pMainWnd->UpdateWindow();

    return TRUE;

}

(2)另外还有一种方法就是在资源文件中修改.修改.rc文件中的String Table中的第一项: IDR_MAINFRAME 128 *****,其中*****就是你所要改的字符,当然也可以把.rc文件用.txt文件打开后再修改

 

//  隐藏工具栏

    if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CLIPCHILDREN |/* WS_CHILD |*//* WS_VISIBLE | */CBRS_TOP

        | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||

        !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))

(6)如何设置按钮字体大小?
.h中加入 CFont m_font ;然後 .cpp中初始化m_font . CreateFont ( 24, // nHeight 0, // nWidth 0, // nEscapement 0, // nOrientation FW_NORMAL, // nWeight FALSE, // bItalic FALSE, // bUnderline 0, // cStrikeOut ANSI_CHARSET, // nCharSet OUT_DEFAULT_PRECIS, // nOutPrecision CLIP_DEFAULT_PRECIS, // nClipPrecision DEFAULT_QUALITY, // nQuality DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily "Times New Roman"); // lpszFacename SendMessageToDescendants(WM_SETFONT,(WPARAM)HFONT(m_font),MAKELPARAM(TRUE,0 ));

可以让所有控件的字体大小改变的.如果不想這样,去掉SendMessageToDescendants好了.
例如:   
m_font.CreateFont (13, 0, 0, 0, FW_NORMAL, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, "宋体");
SendMessageToDescendants(WM_SETFONT,(WPARAM)HFONT(m_font),MAKELPARAM(TRUE,0 ));

如果我想单独让某个控件m_Button的文字改变,可以这样做:
m_Button.SetFont(&m_font);    其它控件用法类似.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值