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界面开发小技巧

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

VS2010之MFC小技巧(一)

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

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

mfc 对话框常用小技巧

1. 在任务栏隐藏对话框       ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW); 2. 使对话框为顶层窗口    ...

iOS开发:小技巧积累

1、获取全局的Delegate对象,这样我们可以调用这个对象里的方法和变量: [(MyAppDelegate*)[[UIApplication sharedApplication] delega...

iOS开发:小技巧积累

1、获取全局的Delegate对象,这样我们可以调用这个对象里的方法和变量: [(MyAppDelegate*)[[UIApplication sharedApplication] delega...

Android编程小技巧积累

【方便的IDE设置】 eclipse(MyEclipse)关闭鼠标移动提示代码功能: eclipse(MyEclipse)-->window-->Java-->Editor-->Hovers-->...

iOS开发:小技巧积累

1、获取全局的Delegate对象,这样我们可以调用这个对象里的方法和变量: [(MyAppDelegate*)[[UIApplication sharedApplication] delega...

积累的VC编程小技巧之编辑框

本文载自http://www.cppblog.com/wrhwww/archive/2008/04/02/46083.html 1.如何让对话框中的编辑框接收对话框的消息 ////////////...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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