读高中的时候,我的数学老师经常对我说“花很短的时间总结一下,你往往会有很大的收获”。虽然10多年过去了,老师的这句话我还依然记在心头。于是我也时常对自己说“花个时间总结一下,你会有很大的收获”。09年底时本打算在春节期间抽个时间把以往有用的东西好好整理一下,结果过年的时候发现自己大部分时间在外地。也罢,我就在平时抽个空写点东西吧。
1.在OnPaint里用CTime::GetCurrentTime获取到系统时间不随系统时间变化的原因是什么?
答:程序是不会自动刷新的,需要在OnTimer中进行处理。
2.请问如何用edit自动转换输入的进制数,比如我输入16进制的数字,按确定后就转成10进制。
答1:CString str;
int iVal;
GetDlgItemText(IDC_EDIT1, str);
sscanf(str, _T("%x"), &iVal);
答2:CString str;
int iVal;
GetDlgItemText(IDC_EDIT1, str);
iVal = _tcstoul(str, NULL, 16);
str.Format(_T("%d"), iVal);
SetDlgItemText(IDC_EDIT1, str);
3.使用Image image(L"sunflower.jpg");,程序报错是怎么回事?
答:一、确认一下文件路径;2.需要对gdi+环境初始化:
定义成员变量
GdiplusStartupInput m_gdiplusStartupInput;
ULONG_PTR m_pGdiToken;
程序启动时:
GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL);
程序退出时:
GdiplusShutdown(m_pGdiToken);
4.链接错误
答:链接错误是因为链接器找不到相应符号的实现,一般是缺少c/cpp文件,或缺少lib库.对于缺少c/cpp文件的,把文件加入到工程中;对于缺少lib库的,在链接选项中添加相应lib或加入预处理指令 #pragma comment(lib, "yourlib.lib")
5.如何判断字符串中有多少个字?一个字母,空格,一个汉字都算一个字。
答:使用下面的代码试试
int GetTotal(CString Feedback)
{
char* buf = new char[Feedback.GetLength()+1];
int i=0, n=0;
unsigned char p;
memset(buf, 0, Feedback.GetLength()+1);
sprintf(buf, Feedback);
while(n<Feedback.GetLength())
{
p = buf[n];
if(p>0x7f)
i+=1;
n++;
}
delete [] buf;
return Feedback.GetLength()-i+i/2;
}
6.VS2008,如何才能不使用#include “stdafx.h”
答:可以在工程属性中设置,选择不使用预编译头.
7.vc2005中找不到msflexgrid控件.
答:工程->右键->添加类->activex 中的mfc类->combobox列表中选 microsoft flexgrid control v6.0
8.vc2008中CTime::Format函数的问题.
CTime t = CTime::GetCurrentTime();
CString str1=t.Format("%Y年%m月%d日 星期%w);
在VC2008中,str1为空,去掉中文就得到正确值,VC6中没这问题,怎么回事?
答:#include <locale.h>
_tsetlocale(LC_ALL, _T( "Chinese-simplified"));
CTime t=CTime::GetCurrentTime();
CString str1=t.Format("%Y年%m月%d日星期%w");
9.浏览文件对话框如何创建?
答:CString str;
BROWSEINFO bi;
char name[MAX_PATH];
ZeroMemory(&bi,sizeof(BROWSEINFO));
bi.hwndOwner=GetSafeHwnd();
bi.pszDisplayName=name;
bi.lpszTitle="Select folder";
bi.ulFlags=BIF_USENEWUI;
LPITEMIDLIST idl=SHBrowseForFolder(&bi);
if(idl==NULL)
return;
SHGetPathFromIDList(idl,str.GetBuffer(MAX_PATH));
str.ReleaseBuffer();
10.exe形式的com组件在.net下可以调用吗?如何调用?
答:添加引用,然后在对象浏览器中可以看到.net为我们生成的包装类。
AxcomnameClass obj = new AxcomnameClass();
如果是clr的话,使用托管指针comnameClass^ obj = gcnew comnameClass();
11.Wince下不支持GetModuleFileNameEx,如何获取其他程序的路径?
答:据说GetModuleFileName可以得到,用Process ID作为参数,调用 GetModuleFileName((HMODULE) dwProcessID, tzPath, MAX_PATH) ,要不你试试?
12.电脑一直都能注册debug版的xx.ocx,但突然现在就不行了。出现LoadLibrary(xx.ocx)失败 - 一个或数个参数无效。为何出现这种情况?
答:查看一下依赖库
13.MFC如何显示各种常见格式图片?
答:使用gdi+的Image或ATL的CImage(vc6不支持)。
14.vc9(vc2008)中如何添加组件和控件?
答:一、可以在工具箱中点击右键->选择项,然后可把相应的组件放置到工具箱中,
使用的时候像常规控件那样拖拽就行了;二、解决方案视图->添加类->tlb中的mfc类,或activex中的mfc类。
15.如何把彩色图像变成灰度图像?
答:参看http://blog.youkuaiyun.com/sjdev/archive/2010/01/23/5249373.aspx
16.有什么方法可以在桌面上像桌面歌词一样textout出文字来?
答:桌面歌词不是直接在桌面上画的,应该是在一个透明的窗体上绘制的。
参看代码http://download.youkuaiyun.com/source/1707118
17.如何将61秒让,以00:01:01的格式输出?
我使用代码
CString str;
str.Format("%d:%d:%d",hour,minute,second);
pDC->TextOut(str);
这样做的话输出 0:1:1 和标准格式不一样
答:给你个标准答案,一般人我不告诉他:
CTime tm(61);
CString tmp = tm.FormatGmt(_T("%H:%M:%S"));
18:在mfc扩展dll中使用::LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1))加载失败。
答:不要使用AfxGetInstanceHandle,把DllMain中的hInstance缓存一下传递过去。
19:vc2008如何打开内存查看窗口?我在调试->窗口菜单中没找到。
答:在调试状态下,找找看。
20:char ans[128]; 被赋值后如何再次初始化?
答:方法很多,memset,strcpy等。如果你只是想简单地把它置空,可以 *ans = 0;
注:只选取了一部分论坛回复。部分回复答案的正确性有待验证,希望这些东西能对你有帮助。如果哪个地方有错误,可以在我的博客上留言,我会及时修正。