1、..\\当前目录的上级目录,.\当前目录;CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath() + _T("skin\\") + SeleteSkin)设置的为当前目录,用..\,那么当前目录的上级目录即为对应的xml文件
2.对于非可视化编程,可以通过自己调用creat函数,creat一个button在对话框上显示!
3.每写一个函数之前都要判断传入的参数的正确性,习惯对非常类型参数用const引用类型
4.while((nCut = string.find_first_of(L";")) != string.npos)
5.程序连接失败,用到DLL,需要把lib文件复制到目录下,Linker:Input:QKLogSvr.lib;C/C++:Additonal Include Directories(依赖的文件所在目录)http://www.cnblogs.com/Common;
6.LocalFree:释放指定的本地内存中的对象和它的句柄无效。
7.FormatMessage:将GetLastError得到的错误信息(这个错误信息是数字代号)转化成字符串信息的函数
8.用GetActiveWindow得到的是有焦点的ie窗口,用GetForegroundWindow得到是最前面的窗口。例如,你登录了QQ,QQ的界面一直都是在最前面的,但你的光标选择的是别的程序,如果你要得到QQ的句柄的话,你用GetForegroundWindow()就可以得到了,如果你想得到你当前光标选中的窗口,那你用GetActiveWindow()就可以了
9.自己的窗口没有输入焦点但是想要当前焦点窗口的键盘输入消息,可以使用Win32 API函数AttachThreadInput()来解决这个问题。AttachThreadInput把一个线程(idAttach)的输入消息连接到另外线程(idAttachTo)。
10.键盘按下、弹起都发送消息,lParam & 0x80000000判断键盘是按下还是弹起
11.消息拦截,可以通过消息钩子,比如webBrowser控件,在和主窗口通信时,可以通过消息钩子!
12.任务栏的显示与隐藏:
HWND hTrayWnd = FindWindow(L"Shell_TrayWnd",NULL);
HWND hStartWnd =FindWindowExW(hTrayWnd,NULL,L"Button", _T("开始"));
if (hStartWnd == NULL)
{
hStartWnd = FindWindow(L"Button", _T("开始"));
}
::ShowWindow(hTrayWnd,SW_HIDE);
::ShowWindow(hStartWnd,SW_HIDE);
13.在窗口最小化时(先发送最小化消息,点击任务栏图标,发送还原消息)Windows会给窗口发送WM_SIZE消息,OnSize函数的wParam参数值:
#define SIZE_RESTORED 0
#define SIZE_MINIMIZED 1
#define SIZE_MAXIMIZED 2
#define SIZE_MAXSHOW 3
#define SIZE_MAXHIDE 4
14.断点无法中断程序问题:鼠标放在感叹号的地方会有提示什么原因
VS的话在Tools -> Options -> Debugging -> General -> Require source files to exactly match the original version
去掉Require source files to exactly match the original version的对勾。
15.查找文件,若没有,则生成xml文件
std::ifstream askfile;
setlocale(LC_ALL,"Chinese-simplified");//设置中文环境
askfile.open(m_strPanelXml.c_str(),std::ios::_Nocreate);
if (askfile == NULL)
{
LogFunc("DebugLog.txt", LOG_KEYINFO, "Cann't find the file", m_strPanelXml.c_str());
//不存在,则创建
std::ofstream outCreat(m_strPanelXml.c_str(),std::ios_base::out);
outCreat << "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
outCreat.seekp(0,std::ios::end);
outCreat <<"<xml>\n <Version Val=\"20120101000001\" \/>\n<\/xml>\n";
outCreat.close();
LogFunc("DebugLog.txt", LOG_KEYINFO, "Create the file", m_strPanelXml.c_str());
}
else
{
askfile.close();
}
setlocale(LC_ALL,"C");
outCreat.close();
16.WS_EX_TOOLWINDOW,带有这个属性的窗口有以下特点:
1. 不在任务栏显示。
2. 不显示在Alt+Tab的切换列表中。
3. 在任务管理器的窗口管理Tab中不显示。
我们可能会出于某种目的会为我们的窗口设置这个属性,但有一个副作用,就是这个窗口被拖动时,可以被拖动到任务栏里面去。
图片中,任务栏后面那个模糊的身影,就是我那悲催的窗口。
17.解决VS2008每次Build都会重新编译连接,浪费时间的问题:
设置工程属性,为以下选项:
C/C++ -> Code Generation -> Enable Minimal Rebuild: Yes(/Gm)
C/C++ -> Genera -> Debug Information Format: Program Database for Edit & Continue (/ZI), 或者 Program Database (/Zi)
18.microsoft的vc默认的是__cdecl方式,而windows API则是__stdcall,如果用vc开发dll给其他语言用,则应该指定__stdcall方式
19.一个DLL在内存中只有一个实例
DLL程序和调用其输出函数的程序的关系:
1)、DLL与进程、线程之间的关系
DLL模块被映射到调用它的进程的虚拟地址空间。
DLL使用的内存从调用进程的虚拟地址空间分配,只能被该进程的线程所访问。
DLL的句柄可以被调用进程使用;调用进程的句柄可以被DLL使用。
DLLDLL可以有自己的数据段,但没有自己的堆栈,使用调用进程的栈,与调用它的应用程序相同的堆栈模式。
2)、关于共享数据段
DLL定义的全局变量可以被调用进程访问;DLL可以访问调用进程的全局数据。使用同一DLL的每一个进程都有自己的DLL全局变量实例。如果多个线程并发访问同一变量,则需要使用同步机制;对一个DLL的变量,如果希望每个使用DLL的线程都有自己的值,则应该使用线程局部存储(TLS,Thread Local Strorage)。
20.vector 模拟出了一个动态数组,本身是一个“将元素置于动态数组中加以管理”的一个抽象概念;
对于 vector 而言,它配置了比实际容量更多的内存,它的容量很重要:一旦需要重新配置内存,和 vector 相关的所有 references、pointers、iterators都会失效。重新配置内存很耗时间。
对于 vector 容器,可以通过 reserve 进行重新分配内存,来增加容量,但是不能通过它减少容量, std::vector<T>(v).swap(v) 可以完成减少容量的工作。
对于vector 中,c.at (idx)、c[idx]、c.front()、c.back()中,只有 c.at (idx) 进行了范围检查,当越界时会抛出 out_of_range 异常,其它操作均未进行检查。因此,再使用的时候,需要确保索引有效
vector 保证了 vector 所有元素分布于连续的空间中,因此 保证了对于vector内的任意合法索引
21.图层窗口的碰撞检测是基于窗口的形状和透明度的。这意味着窗口区域中颜色为关键色或者alpha颜色分量为0的地方会忽略鼠标消息。然而,如果图层窗口有WS_EX_TRANSPARENT 扩展样式,图层窗口的形状会被忽略,并且鼠标事件会传递给图层窗口之下的其他窗口。
DWORD dwNewLong = GetWindowLong(m_hWnd, GWL_EXSTYLE);
dwNewLong |= WS_EX_TRANSPARENT | WS_EX_LAYERED;
SetWindowLong(m_hWnd, GWL_EXSTYLE, dwNewLong);
22.窗口不显示的时候获取窗口位图
HDC hDcDest = GetDC(m_hWndDest);
HDC hMemDestDc = CreateCompatibleDC(hDcDest);
HBITMAP hBmpDest = CreateCompatibleBitmap(hDcDest,m_rcDest.right - m_rcDest.left,m_rcDest.bottom-m_rcDest.top);
SelectObject(hMemDestDc,hBmpDest);
SendMessage(m_hWndDest,WM_PRINTCLIENT,(WPARAM)hMemDestDc,PRF_CHECKVISIBLE | PRF_CLIENT | PRF_ERASEBKGND | PRF_CHILDREN);
23.SetWindowLongPtr:设置指定窗口属性,或者把指定的一个值设置到窗口的额外存储空间
如下:把一个指针变量存储到一个窗口额外存储空间 (32位的值),可以存储句柄或者指针
CStartAnimation* pThis = static_cast<CStartAnimation*>(lpcs->lpCreateParams);
::SetWindowLongPtr(hWnd, GWLP_USERDATA, reinterpret_cast<LPARAM>(pThis));
24.慎用sleep()函数,如果在退出主程序时,创建的其他线程中有一个线程调用了sleep(60000),那么主程序会在1分钟之后才退出,期间点击应用程序快捷方式,是启动不了应用程序的。
25.HttpSendRequest(hRequest,0,0,chSendData,strlen(chSendData)),是阻塞式请求,如果服务器出问题的话,主线程阻塞,窗口无法移动,问题很严重。
解决办法:创建线程进行请求,把HttpSendRequest放入线程中用
26.#if !defined(AFX_TESTDLG_H__777FEB41_7B80_11D5_9D41_0000E878A1DB__INCLUDED_)
#define AFX_TESTDLG_H__777FEB41_7B80_11D5_9D41_0000E878A1DB__INCLUDED_
表示定义一个宏,用于可以防止头文件的重复包含;
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
_MSC_VER 是一个预定义宏,指的是编译器的版本。VC++6.0的版本是1200,VC++5.0的为1000。_MSC_VER > 1000指的是编译器要VC++5.0以上的版本。
#pragma once 当在别的实现文件里包涵这个.h文件是只编译一次,只包涵一次!只有VC++5.0以上版本的编译器才支持这条指令。
27. BOOL IntersectRect (LPCRECT lprcDst, LPCRECT lpRect1, LPCRECT lpRect2 );
返回值:如果交不为空,则返回非零值;否则,如果交为空则返回0。
28.VS2008查找文件失败:No files were found to look in. Find was stopped in progress
解决办法:按下Ctrl+Scroll Lock