分享

vs2008 MFC 开发问题汇总

 Frank_Chia 2010-07-17

VS2008 MFC 开发问题汇总

 

1、在自定义工具栏时,发现菜单的标题有问题,于是修改工具栏的标题,发现在工具栏创建后调用SetWindowText()根本不起效果。就好象有自动记忆功能一样。解决:

        Handle WM_NCPAINT message,重绘非客户区,在其中修改标题就可以了。

 

       2、网上“用VS2008 Feature Pack 修改您现有的Visual C++的程序界面”有很多,在用以下在CMainFrame::OnCreate()函数的最后部分,添加代码设定当前界面的风格:

      CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007));

      CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007Luna_Blue);

系统将会出现“Cannot load Style”错误!

      调试了很长时间,才找出原因:

4 #if !defined _AFXDLL

5 TRACE(_T("\r\nImportant: to enable the Office 2007 look in static

link,\r\n"));

6 TRACE(_T("include afxribbon.rc from the RC file in your

project.\r\n\r\n"));

7 ASSERT(FALSE);

8 #endif

    需要在方案的RC文件中include afxribbon.rc资源。

     3、问题: 关于vs2008 MFC 类库设计程序界面的问题: 我在"菜单资源"中修改了一些菜单的标题,同时又添加了几个菜单项,但在程序编译运行后我的修改没有起作用,菜单没变化!

    VS2008集成了BCG类库,设计的程序允许用户在运行时动态修改菜单项,所以它每次运行后都会记住上次的菜单项,这样你的修改就不起作用了。要解决这个问题,只需要在运行时选择菜单“View|Toolbars|Customize”,然后在对话框中选择Menu标签,然后点击Reset就可以了。

    4、在VS2008 MFC Feature Pack类库设计程序界面时,修改工具条也会出现无法更新的问题。

    和以上同理,只需要在运行时将自定义工具栏的对话框打开,在其中选择toolbars选项卡,点击Reset All按钮即可实现即时更新。

    5、关于工具条隐藏的问题。

    隐藏工具栏用CFrameWndExShowWindow(SW_HIDE)ShowPane(FALSE, ...)均可。

    如果程序开始就需要将某个工具条tool隐藏,在OnCreate()中建立工具条后(tool.CreateEx),不能习惯用DockPane(&tool);否则,无论如何这个工具条将会显示你Dock的位置上。

   6、整数转换为字符串,不够前面补0,如3转换为字符串时为"003"

    CString   str;  

    int   n=3;  

    str.Format("%03d",n);

   7、解决在VS2008中“要求源文件和版本匹配......”的问题

   今天在Visual Studio 2008中调试某个程序时遇到一个奇怪问题

 

   就是在某个源文件中设置的断点老是无效,提示“当前不会命中断点。源代码与原始版本不同”信息

 

   清理项目、重编项目、重新拷贝原文件都解决不了问题

 

   1)“工具”,“选项”,“调试”,“要求源文件与原始版本完成匹配”去掉勾。我没有用这种方法,总觉得将勾掉不太安全。

 

   2)通过重新格式化出问题的源文件亦可以解决,即在VS2005中选择 “编辑”-“高级”-“设置选定内容的格式”。我用这个方法解决,将源文件全部选定,设置格式即可!

 

  8oracle10g含有BLOB字段的表用ADO打不开!

 

   用的是微软的那种oracle连接字符串MSDAORA.1!!   要用oracle的才能正常打开含有blob字段的记录集,即用以下这种:  

  m_pConn->Open(L"Provider=OraOLEDB.Oracle.1;User   ID=pkuwh_za;password=a;Data   Source=223;Persist   Security   Info=False",L"",L"",adOpenUnspecified);

 

   Oracle   provider   for   OLE   DB   支持BLOB字段,但是对字符数据类型的支持较弱。。比如,如果某个字段为一串的空格的话,读取的时候会出现异常。  

  Microsoft   OLE   DB   Provider   for   Oracle   对字符数据类型的支持很强,不会出现上面说的那种情况,唯一的缺点就是不支持BLOB字段。

 

  9、客户端使用oracle10g XE,但是在MFC ADO无法使用连接字符建立连接!

 

  我使用的连接字符串为“Provider=OraOLEDB.Oracle.1;Data Source=XE;Password=****;User ID=sys;Persist Security Info=True”,呵呵,明眼人可能发现我使用的用户名为sys,在网上一阵查找,才知道oracle在程序中是不能用systemsysdba用户连接数据库的。在oracle XE中新建一相应权限的用户,建立连接即可。

 

 10、用PL/SQL进行oracle的备份与恢复很方便。菜单->Tools->export objects即可将需要的各种对象(表、视图、包等)保存。在需要恢复时,只需菜单->Tools->import objects即可。不过我第一次在备份后进行恢复时,没有成功。后来发现,我在备份时,连所属系统的表、视图等一起备份了,在恢复时,是肯定不成功的。在备份时应该用菜单->Tools->export user objects

 

 11、很长时间没有用Win32 console了,用CL.exe时竞出现了“缺少mspdb80.dll.....”的错误!

 

   PATH环境变量中添加“C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE”即可。

 

 12CVSListBox控件很好,失去焦点并切换切换有如下规律:

 

1、在任意item之间切换(包括删除、移动),先是失去焦点,即iRow=-1;然后再切换成对应Item

2、如果使用Browse按钮,在程序中弹出对话框,则控件失去焦点,即iRow=-1

3、失去焦点并切换是在OnAfterMoveItemDown之前发生,所以必须在移动后重新定位并显示内容。

4、失去焦点并切换是在OnBeforeRemoveItem之后发生,所以必须设置当前的删除状态为真,确保在切换为-1时,不触动保存。

 

13、从OracleSQLServer中取得注释:

 

最近在研究根据表结构生成Java文件的工具,在取得表的字段时如何取得表的各种信息和注释,这个问题困扰了我,经多方搜寻找到如下资料备用: oracle user_tab_comments;表注释 user_col_comments;表字段注释 以上两个只能获取自己用户的表的注释信息,如果要访问自己能够访问的其他用户的表,则需要使用: all_tab_comments;表注释 all_col_comments;表字段注释 当然,如果有DBA权限,则可以使用 dba_tab_comments;表注释 dba_col_comments;表字段注释 dba*all*最好指定owner条件。

 

14、关于vs 2008 MFC xp风格问题

 

stdafx.h添加如下试试:

 

引用:

#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")

 

 15、VS2008里MFC读入文件内容加入combobox的问题
combobox.addstring遇到的问题

string strtmp;
CString strpha;

ifstream in("..\\data\\Volt.txt");
if(in.is_open())
{
while ( getline(in,strtmp) )
}

最后combobox里显示出来的是乱码= =
------------------------------------------------------------------------
从你使用_T宏看来,这个程序是可以运行在Unicode上的,而你使用的std::string则包含了单字节的ANSI字符串,c_str()返回char*
而CString的Format按照Unicode的wchar_t*进行解释,因此乱码。如果是新版的MFC或者ATL程序的话,可以使用ANSI到Unicode的转换宏CA2T(strtm.c_str()),这样保证了无论是编译为ANSI还是Unicode都是正确的。

16、发现引入了msvcr90.dll(如果是Debug版本,应该是msvcr90d.dll)。这应该是VS2008的一个bug。

解决方案如下:

  1. 在Project\Properties\Configuration Properties\Project Defaults\Use of MFC中,选择Use MFC in a Static Library
  2. 编译,编译不通过没关系
  3. 在Project\Properties\Configuration Properties\Project Defaults\Use of MFC中,选择Use Standard Windows Libraries(就是把设置改回去)
  4. 编译

这时候再用dumpbin查看引入库,就没有msvcr90.dll了。

17、VS2008 mfc菜单问题
(1)你在获取之前应该先装载一下MENU;  menu.LoadMenu(IDR_MENU_ID);

(2)GetSubMenu(0),0代表菜单下第一个ID。 而你的ID_FILE_OPEN是否为第一个呢.

(3)下面是我做小菜单的一小段:
 CMenu m,*p;
 m.LoadMenu(IDR_MENU);
 p = m.GetSubMenu(0;
CPoint oPoint;
GetCursorPos(&oPoint);
p->TrackPopupMenu(TPM_LEFTALIGN,oPoint.x,oPoint.y,this);

18、如何在静态文本中显示系统时间
void OnTimer( UINT_PTR nIDEvent )
{
    CTime time = CTime::GetCurrentTime();
    CString sTime = time.Format( __TEXT("%Y-%m-%d, %H:%M:%S") );
    SetDlgItemText( IDC_STATIC_TEXT, sTime );
}

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多