MFC常见问题处理

来源:互联网 发布:如何查看淘宝消费记录 编辑:程序博客网 时间:2024/05/22 12:51

1、按回车或ESC键对话框关闭:

这种情况主要是由于回车键响应OnOK()函数、ESC键响应OnCancel()函数而引起的,解决方法是在消息传递时过滤掉这两个键盘消息。

BOOL CMyDlg::PreTranslateMessage(MSG* pMsg) 
{
    if(pMsg -> message == WM_KEYDOWN)
   {
        if(pMsg -> wParam == VK_ESCAPE)
           return TRUE;
       if(pMsg -> wParam == VK_RETURN)
             return TRUE;
    } 

     return CDialog::PreTranslateMessage(pMsg);
}

2、创建一个弹出式新窗口,但任务栏里却多了一个标题栏:

CString szClassName = AfxRegisterWndClass( CS_CLASSDC |CS_SAVEBITS |CS_HREDRAW |CS_VREDRAW,    0, (HBRUSH)(COLOR_BTNFACE+1), 0 ); 

if( !m_ToolTip.CreateEx( 0, szClassName, _T(""), WS_VISIBLE | WS_POPUP | WS_BORDER, rect.left + 10, rect.top + 10, 200, 100,    this->GetSafeHwnd(), 0, NULL ) ) 
   return;
问题就出在this->GetSafeHwnd()上了,如果你传的这个this不恰当就会导致上述症状的出现。

3、微调按钮关联错误:

我们在使用微调按钮时有时候会出现在微调按钮旁边的编辑控件与之不关联的情况,这主要是对它的关联条件理解错误导致的。

微调按钮并不是把离它最近的控件作为伙伴的,伙伴的选择是以tab顺序为参照的,伙伴控件的tab顺序必需紧挨着按钮控件,并且比它小。

同时不要忘了选中它的Auto buddy和Set buddy integer属性。

4、CView类的派生类使用时产生的_CrtIsValidHeapPointer(pUserData)错误:

void CMyView::PostNcDestroy() 
{   
// CFormView::PostNcDestroy(); 注释掉这行   
   }  

分析(高手的观点,非本人观点):

MFC的文档/视结构下View是在堆中创建的,所以要在窗口销毁时同时销毁View对象。
而不带文档的View是在栈上创建的(可以在Frame类里见到类似CChildView m_wndView;的定义),就不需要delete this了。

5、一个ActiveX多个对象的消息响应:

只要Ctrl + W然后对每个对象设置消息响应函数即可。

6、在字符后输出定位不准:

这种情况应该是使用了CDC::GetTextMetrics函数,这个函数获得的字符宽度为平均值,所以不够精确,要想精确定位建议使用CDC::GetTextExtent函数。

7、map中的4786警告的消除:

当我们在使用map时,在编译的时候会给出warning C4786的警告,去处的方法是在包含STL的头文件之前应用#pragma warning(disable:4786)这个预编译指令。

8、从CView类派生具有滚动条的类:

在你的view的PreCreateWindow中添加 
cs.style=cs.style ¦WS_HSCROLL ¦WS_VSCROLL;

9、GlobalAlloc和malloc的区别:

在Windows   3.X的时代,分配的内存可以有两种,全局的和局部的,例如GlobalAlloc和LocalAlloc。但在Win32的时代这些函数已经被废弃了,现在的内存只有一种就是虚存。在Win32中所有的进程所使用的内存区域是相互隔离的,每个进程都拥有自己的地址空间。也就是说没有区别。

10、结构体中填入结构的大小与结构的扩充有什么关系呢:

以后API升级时会将这个结构变得比原来大,增加一些字段以增加功能,但是API本身要分辨出是旧的结构还是新结构,对很多api来说,提供参数都是结构的地址,它必须要通过结构的大小来判断。

11、如何在程序中设置Tab顺序:

首先需要设置WS_TABSTOP属性。其次,调用::SetWindowPos( 窗口句柄, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );这样可以改变它们的zOrder顺序(当然在参数中你不能加入SWP_NOZORDER,否则将不会改变tab   order的顺序),先调用SetWindowPos的控件tab   order的顺序在最后,后调用的在最前。

12、如何改变CListCtrl的高度:

CListCtrl控件的每行高度是由每行的字体高度决定的,因此,如果我们想改变每行的高度,我们可以改变控件的字体大小来改变。先创建一个字体,然后选中字体:m_cListCtrl.SetFont( &font );

13、判断文件是否存在:

虽然判断文件是否存在有很多办法,但有些方法写起来相对麻烦,而且有些还不支持UNICODE编码(例如ifstream,当然你也可以用wifstream,但通用编程就很麻烦了)。
    CFileStatus fs;   
    if( !CFile::GetStatus(_T(".\\data\\Config.ini"), fs ) )   
    {   
        MessageBox( _T("Config.ini文件不存在.") );
        return false;
    }

    或
     ::GetFileAttributes( fileInfo.tempPath ) != (DWORD)-1;

14、知道设备上下文句柄,如何获取它相应的设备上下文指针:

CDC *pDC = CDC::FromHandle( hDC );


转帖:http://hi.baidu.com/clxye/blog/item/4b9117276347f707908f9d7a.html

原创粉丝点击