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的小技巧

  • 2012年04月11日 09:31
  • 107KB
  • 下载

mfc开发小技巧

  • 2014年09月05日 17:10
  • 2KB
  • 下载

MFC界面开发小技巧

1、在单文档工程中更新视图 关键函数:Invalidate(BOOL bErase = TRUE); 简介:用于重新执行OnDraw()。当参数为默认的true时,擦除并重画;当参数为false时...
  • nemyth
  • nemyth
  • 2014年11月28日 00:10
  • 605

VS2010之MFC小技巧(一)

这两天忙着整云台控制界面,里面涉及到comobox和Edit control的使用。其中comobox最烦人的,莫过于box的初始化,而Edit Control最烦人的,莫过于控件中输入值后,如何获取...

mfc 对话框常用小技巧

1. 在任务栏隐藏对话框       ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW); 2. 使对话框为顶层窗口    ...
  • ylo523
  • ylo523
  • 2015年02月10日 08:59
  • 218

matlab 编程小技巧积累

nargin, nargout 指示输入、输出参数的个数 Number of function arguments unique 找出矩阵中不同元素 Find unique elements o...

iOS开发:小技巧积累

4人收藏此文章, 我要收藏发表于2个月前 , 已有391次阅读 共0个评论 1、获取全局的Delegate对象,这样我们可以调用这个对象里的方法和变量: [(MyAppDelega...

IOS 小技巧积累(持续更新)

1. 使用@property和@synthesize声明一个成员变量,给其赋值是时要在前面加上"self.",以便调用成员变量的setmember方法。       直接调用成员变量并且给其赋值...

IOS开发小技巧积累

一些经常会用到的开发小技巧,转载来自双子座的博客 1、获取全局的Delegate对象,这样我们可以调用这个对象里的方法和变量: [(MyAppDelegate*)[[UIApplicati...

xcode学习:小技巧积累

1、获取全局的Delegate对象,这样我们可以调用这个对象里的方法和变量: [(MyAppDelegate*)[[UIApplication sharedApplication] delega...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC小技巧积累
举报原因:
原因补充:

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