MFC小技巧积累

原创 2013年12月02日 18:16:20

1.WinDef.h中定义了MAX_PATH :


#define MAX_PATH          260


WinBase.h中定义了GetModuleFileName:(获取程序的全路径完整名称)


WINBASEAPI
DWORD
WINAPI
GetModuleFileNameA(
    __in_opt HMODULE hModule,
    __out_ecount_part(nSize, return + 1) LPSTR lpFilename,
    __in     DWORD nSize
    );


WINBASEAPI
DWORD
WINAPI
GetModuleFileNameW(
    __in_opt HMODULE hModule,
    __out_ecount_part(nSize, return + 1) LPWSTR lpFilename,
    __in     DWORD nSize
    );


#ifdef UNICODE
#define GetModuleFileName  GetModuleFileNameW
#else
#define GetModuleFileName  GetModuleFileNameA
#endif // !UNICODE


2.GetModuleFileName与MAX_PATH结合使用获取程序的绝对路径全名称

wchar_t buff[MAX_PATH];

GetModuleFileName(AfxGetInstanceHandle(), buff, MAX_PATH);


3.DirNameOf宏:获取全路径中路径部分,不包含文件名

#define DirNameOf(string) (string).Mid(0, (string).ReverseFind(L'\\') + 1)


4.WinUser.h中定义了wsprintf:


WINUSERAPI
int
WINAPIV
wsprintfA(
    __out LPSTR,
    __in __format_string LPCSTR,
    ...);
WINUSERAPI
int
WINAPIV
wsprintfW(
    __out LPWSTR,
    __in __format_string LPCWSTR,
    ...);
#ifdef UNICODE
#define wsprintf  wsprintfW
#else
#define wsprintf  wsprintfA
#endif // !UNICODE


5.

wsprintf 用法

wsprintf:
Writes formatted data to the specified buffer. Any arguments are converted and copied to the output buffer according to the corresponding format specification in the format string. The function appends a terminating null character to the characters it writes, but the return value does not include the terminating null character in its character count.
If the function succeeds, the return value is the number of characters stored in the output buffer, not counting the terminating null character.


wsprintf接收三个参数,第一个参数,是缓冲区,第二个参数是格式,第三个参数是根据格式对应的各个参数值。调用wsprintf(,,),那么,就完成了字符串内容到缓冲区的拷贝。

6. wsprintf用法举例子--用于进行跟踪调试。

#define TraceDebug(text, param) \
{ \
wchar_t tracebuf[256]; \
wsprintf((LPTSTR)tracebuf, _T(text), (param)); \
OutputDebugString((LPCTSTR)tracebuf); \
}


7. WinBase.h有对于OutputDebugString的定义:


WINBASEAPI
VOID
WINAPI
OutputDebugStringA(
    __in_opt LPCSTR lpOutputString
    );
WINBASEAPI
VOID
WINAPI
OutputDebugStringW(
    __in_opt LPCWSTR lpOutputString
    );
#ifdef UNICODE
#define OutputDebugString  OutputDebugStringW
#else
#define OutputDebugString  OutputDebugStringA
#endif // !UNICODE


8.


在C/C++中,宏定义是由define完成的,define中有三个特殊的符号值得我们注意:

1. #:在宏展开的时候会将#后面的参数替换成字符串,如:

  #define p(exp) printf(#exp);

   调用p(asdfsadf)的时候会将#exp换成"asdfsadf"

2. ##:将前后两个的单词拼接在一起。例如《The C Programming Language》中的例子:

  #define cat(x,y) x##y

  调用cat(var, 123)展开后成为var123.

3. #@:将值序列变为一个字符

  #define ch(c) #@c

  调用ch(a)展开后成为'a'.

自己写了一小段测试程序:

#define A(a,b) a##b
#define B(a) #a
#define C(a) #@a

#include <iostream>

using namespace std;

void main()
{
int v = 0,v1 = 1,v12 = 2;//v stands for var
cout << A(v1,2) << endl;
cout << B(v1) << endl;
cout << C(v) << endl;
}

结果为:

1

v1

v

在c++面对对象化编程还可以这样用:

#define A

public://此处加一些成员,并且可以在成员名上用##下一些功夫

class Object

{

     A

};


9.tchar.h中有如下定义:


#define __T(x)      L ## x

#define _T(x)       __T(x)
#define _TEXT(x)    __T(x)


/* Program */


#define _tmain      wmain
#define _tWinMain   wWinMain
#define _tenviron   _wenviron
#define __targv     __wargv

10.非常不错的博客网站。

有百度登录分析。

http://www.crifan.com/


11.

#pragma deprecated()接一个函数名字,可以指定该函数过期了。调用过期函数,编译器会警告。警告是4995.

要去掉这个警告,可以通过代码中的这个操作:

#pragma marning(disable : 4995)

也可以在VS中配置。


You can use #pragma warning as shown on that MSDN page:

#pragma warning(disable: 4995)

Or, you can turn the warning off for the whole project in the project's properties (right click project -> Properties -> C/C++ -> Advanced -> Disable Specific Warnings). On the command line, you can achieve the same effect using/wd4995.


// C4995.cpp
// compile with: /W3
#include <stdio.h>

// #pragma warning(disable : 4995)
void func1(void)
{
    printf("\nIn func1");
}

int main() 
{
    func1();
    #pragma deprecated(func1)
    func1();   // C4995
}

MFC 小技巧积累

wchar_t buff[MAX_PATH]; GetModuleFileName(AfxGetInstanceHandle(), buff, MAX_PATH);
  • xiaguamanshu
  • xiaguamanshu
  • 2013年12月01日 12:04
  • 775

【小技巧积累】

截屏:win7系统  按Win+R调出运行对话框,输入 sinppingtool 即可调出系统自带的截屏工具...
  • yang332233
  • yang332233
  • 2016年12月10日 16:16
  • 140

怎样在工作中积累自己的资源!?

从业十多年,打交道的客户都比较认可我这个人,但是由于从事行业的原因,很多是人走茶凉,基本都不怎么联系了。现在静下来反思,其实也有自己的原因,一方面太过专注于工作,对客户在生活其他方面的交流较少,大家除...
  • xiaoniqiu
  • xiaoniqiu
  • 2015年07月12日 23:16
  • 286

小技巧积累

 QQ在线状态 代码生成器
  • song530061187
  • song530061187
  • 2007年04月20日 17:41
  • 263

程序员如何积累编程技术或编程经验?

工作中总是被问到程序员如何积累编程技术或编程经验?首先我认为编程是一门实践性的很强的艺术,所以貌似唯有实践才能积累。然而把它当作一个个人软件过程(PSP)的问题,总感觉是有一些规律、规则或建议可以解答...
  • liulihuo_gyh
  • liulihuo_gyh
  • 2015年11月08日 20:25
  • 681

应该积累知识还是应该积累经验???

我常常思考的问题!!
  • henth
  • henth
  • 2006年02月02日 09:42
  • 401

【Get深一度】信号 相干

相干性与关联性 一、举例 “很多脉冲的雷达回波的相加过程称为雷达脉冲积累;就像“长江后浪推前浪,一浪接一浪”;脉冲积累必须对包络检波器之前的正交分量进行, 称为“相干 积累”。 相干积累保...
  • u013346007
  • u013346007
  • 2017年02月26日 16:56
  • 350

软件技术积累-问题引出之一

软件技术积累-问题引出之一
  • suweisoft
  • suweisoft
  • 2012年11月24日 07:38
  • 301

MFC中窗口收到WM_PAINT消息是如何处理的,什么情况下产生WM_PAINT消息

处理过程:  (1)BeginPaint开始画,就是用白刷去掉原窗口  (2)GetClientPaint获得窗口显示区域和尺寸等信息并绘制  (3)EndPaint释放绘图句柄。  产生WM...
  • hezikui1987
  • hezikui1987
  • 2013年10月16日 11:33
  • 1033

你必看的一个老程序员积累的20条编程经验

你必看的一个老程序员积累的20条编程经验 程序员 1. 估算解决问题所需要的时间。 不要怕,承认吧!我曾见过一些程序员为了解决...
  • sunyllove
  • sunyllove
  • 2016年11月30日 10:09
  • 772
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC小技巧积累
举报原因:
原因补充:

(最多只允许输入30个字)