现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

学习VC++的30条小经验

2012-08-16 09:36 工业·编程 ⁄ 共 3439字 ⁄ 字号 暂无评论

1.在进行数据交换时一个子窗口可以和两种类型的变量相关联,一种是控件,另一种是数据类型。故可以通过控件控制子窗口,数据类型可以接收子窗口的值。

2.MB_ICONINFORMATION   :An icon consisting of an “i” in a circle appears in the message box.

3.CTabCtrl是一个直接从CWnd派生来的类.

4.如何把int转换成CString?如何把DWORD转换为CString?
答:int   i=123;
   CString   str;
   str.Format( "%d ",i);

DWORD dwPid = 1234;
CString str;
str.Format(_T("%d"),dwPid);

5.用到的函数
CStatusBar::SetPaneInfo()

6.当用户的鼠标 移动到一个菜单项时,Windows发送WM_MENUSELECT和菜单项的ID。然后需要自己添加消息声明,消息映射,以及消息响应函数OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu)。

意思是框架发送WM_SETMESSAGESTRING消息到自身,用WPARAM传递命令ID。SETMESSAGESTRING 是MFC的一个私有消息,它在afxpriv.h中定义。这个消息在状态条窗格中设置 要显示的文本。你可以用WPARAM传递资源串的ID,或者用LPARAM传递实际的串

7.error C2065: 'WM_SETMESSAGESTRING' : undeclared identifier
这个错误是编写一个在状态栏中加载进度条时出现的错误,解决方法如下:
在StaAfx.h 中加入#include <afxpriv.h> 头文件

8.如果你编译一个程序为ANSI方式,_T实际不起任何作用。而如果编译一个程序为UNICODE方式,则编译器会把"Hello"字符串以UNICODE方式保存。

_T和_L的区别在于,_L不管你是以什么方式编译,一律以UNICODE方式保存

9.NM_CLICK 这个是鼠标左键点击CListCtrl控件客户区时激发的消息,可以在里面做点击的处理

10.结束进程和结束窗口是有区别的
SendMessage(),发送WM_CLOSE消息来关闭指定的窗口。
GetWindowText(),获得窗口标题,通过下标在句柄数组里面获得窗口句柄
GetWindowThreadProcessId(HWND hWnd,LPDWORD lpdwProcessId),通过窗口的句柄获得进程ID。
OpenProcess(DWORD fdwAccess,BOOL fInherit,DWORD IDProcess),获得窗口句柄对应的进程句柄。
BOOL GetExitCodeProcess(HANDLE hProcess,LPDWORD lpExitCode)通过进程句柄获得进程结束码。
TerminateProcess(HANDLE hProcess, DWORD uExitCode),通过进程结束码结束进程。
注意:1.窗口句柄与窗口对应的进程句柄不一样。
      2.SendMessage是结束一个窗口,TerminateProcess可以结束此进程以及其产生的所有线程。

11.WM_CLOSE:关闭按钮,alt+F4;
WM_DESTROY:在消息循环里释放对象及内存等;
WM_QUIT:结束消息循环;

12.UNICODE转换问题,在VC2005中主要使用UNICODE编码,需要这样写:
strMemStat.Format(_T("%d"), 255);
在UNICODE或者ASCII编码都能使用。

13.如何使用psapi.lib?
答:psapi.lib复制到vc++6.0的lib目录下(如:C:/Program Files/Microsoft Visual Studio/VC98/Lib),psapi.h复制到Include目录下(如:C:/Program Files/Microsoft Visual Studio/VC98/Include)便可使用,psapi.dll一般在system32目录下会自带,所以可以不做操作

在vc中使用时,需加入以下代码:

#include <psapi.h>  
#pragma   comment(lib,"psapi.lib")

14.若桌面打开的窗口的图标句柄为空,如何获得对应的图标?
答:获得该窗口的句柄IsWindow()-->窗口对应的进程ID"GetWindowThreadProcessId()"-->由进程ID得到进程句柄OpenProcess()-->进程对应的可执行文件的路径GetModuleFileNameEx()-->获得图标ExTractIcon()

15.如何动态改变tabCtrl控件的大小?
答:tabCtrl也是一个窗口,获得该窗口的句柄GetSafeHwnd(),然后MoveWindow()或者SetWindowPos(); 就OK了.

16.GetFirstSelectedItemPosition和GetNextSelectedItem如何用??
答:

17.如何引用Hook.dll?
答:见《VC++深入详解》p744

18.如何得到屏幕宽度和高度?
答:GetSystemMetrics函数。

19. extern关键字表面函数是在外部定义,而_declspec(dllimport) 表明函数是从动态链接库中引入的。__declspec(dllexport)   声明一个导出函数,一般用于dll中
__declspec(dllimport)   声明一个导入函数,一般用于使用某个dll的exe中

20.如何调用DLL中的函数?
答:1.隐式链接加载;2.动态加载GetProcAddress

21.如果你需要截获WM_CREATE消息,必需配合使用WH_CBT钩子。
你去看看MFC的源代码,因为Windows上WM_CREATE是由CreateWindow触发,截获WM_CREATE的时候还没有有效的窗口句柄,函数CreateWindow还没有完全完成自己定义的消息不能跨进程发送,用RegisterWindowMessage注册自定义消息才行。
WH_GETMESSAGE类型Hook的是PostMessage发送的消息;SendMessage发送的消息要用WH_CALLWNDPROC类型才能Hook到。
在窗口创建、销毁之前系统都会调用挂上了WH_CBT的钩子函数

22.如何把CString转换为LPSTR?
答:CString   tmp= "abcde ";
LPSTR lpstr;
lpstr =  (LPSTR)(LPCTSTR)tmp   //经过这样的强制转换。

23.内存分配记录,堆分配,栈分配。。
答:一个函数内定义的局部变量就是分配在栈上的,函数退出时,移动栈指针,这些分配的临时变量的空间就收回了。

24.根据窗口句柄如何获取窗口对象指针?
答:CWnd   *cWnd   =   CWnd::FromHandle(m_hWnd);

25.使ListCtrl里面的某一项处于选中状态?
答:1.在主对话框的OnInitDialog()的返回值要设定return FALSE;
2.在我的程序里面添加如下代码
m_list11.SetFocus();      //ListCtrl控件获得焦点
m_list11.SetItemState(0, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);

26.在窗口失去焦点时会触发WM_KILLFOCUS消息。

27.调节窗口大小,父窗口会刷新底色的。。办法:把父窗口的clip children设置成True

28.如何通过进程ID获得进程句柄?
答:通过OpenProcess()这个API。

29._bstr_t如何转换为CString?
答:_bstr_t   vt;
CString   sValue;
sValue.Format( "%s ",(LPCTSTR)vt);

30.Win32子系统是由csrss.exe来管理的
csrss.exe   >   Client   Server   Runtime   Process   客户服务器Runtime进程
csrss.exe是Windows   2000的核心进程,您通常在用户模式下无法终止该进程

给我留言

留言无头像?