随笔5

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

转载于:https://www.cnblogs.com/wjl4934/archive/2012/08/13/2636285.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值