现在的位置: 首页 > 综合 > 正文

MFC点滴积累

2013年10月03日 ⁄ 综合 ⁄ 共 4487字 ⁄ 字号 评论关闭
(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);    其它控件用法类似.

抱歉!评论已关闭.