VC常用数据类型及使用转换详解

来源:互联网 发布:和漫画软件下载 编辑:程序博客网 时间:2024/06/05 05:15

一、常用数据类型列表

VC常用数据类型列表(1)

 

Type

Default Size

Description

 

说明:这些基础数据类型对于MFC还是API都是被支持的

boolean

unsigned 8 bit ,

取值TRUE/FALSE

byte

unsigned 8 bit,

整数,输出按字符输出

char

unsigned 8 bit,

字符

double

signed 64 bit

浮点型

float

signed32 bit

浮点型

handle_t

 

Primitive handle type

hyper

signed 64 bit

整型

int

signed 32 bit

整型

long

signed 32 bit

整型

short

signed 16 bit

整型

small

signed 8 bit

整型

void *

32-bit

指向未知类型的指针

wchar_t

unsigned 16 bit

16位字符,比char可容纳更多的字符

 

 

 

 

VC常用数据类型列表(2)

 

Win32

API

 

 

说明: 这些Win32API支持的简单数据类型主要是用来定义函数返回值,消息参数,结构成员。这类数据类型大致可以分为五大类:字符型、布尔型、整型、指针型和句柄型(?). 总共大概有100多种不同的类型,

 

BOOL/BOOLEAN

 

8bit,TRUE/FALSE

 

布尔变量,实际上是16位UINT

 

BYTE

 

unsigned 8 bit

 

 8位无符号整数

 

BSTR

CComBSTR

_bstr_t

 

32 bit

 

BSTR是指向字符串的32位指针

是对BSTR的封装

是对BSTR的封装

 

CHAR

 

8 bit

 

(ANSI)字符类型

 

COLORREF

 

32 bit

 

RGB颜色值索引 整型

 

DWORD

 

unsigned 32 bit

 

整型

 

FLOAT

 

float型

 

float型

 

HANDLE

 

 

 

32位的无符号整数,用作Windows系统所建立的某个对象的句柄,使该句柄就相当于引用该对象。

 

HBITMAP

 

 

 

bitmap句柄

 

HBRUSH

 

 

 

brush句柄

 

HCURSOR

 

 

 

cursor句柄

 

HDC

 

 

 

设备上下文句柄

 

HFILE

 

 

 

OpenFile打开的File句柄

 

HFONT

 

 

 

font句柄

 

HHOOK

 

 

 

hook句柄

 

HKEY

 

 

 

注册表键句柄

 

HPEN

 

 

 

pen句柄

 

HWND

 

 

 

32位的无符号整数,用作窗口句柄,使该句柄就相当于引用该窗口。

 

 

 

HINSTANCE

 

 

 

32位的无符号整数,用作实例句柄

 

VC常用数据类型列表(3)

 

INT

 

--------

 

--------

 

UINT

 

 

 

定义一个新的Win32数据类型,它会把一个参数强制转换成Windows3.x应用中的16位值或Win32应用中的32位值

 

LONG

 

--------

 

32位带符号整数

 

LONGLONG

 

 

 

64位带符号整型

 

LPARAM

 

32 bit

 

消息参数

 

LPBOOL

 

 

 

BOOL型指针

 

LPBYTE

 

 

 

BYTE型指针

 

LPCOLOREF

 

 

 

COLORREF型指针

 

LPCSTR/LPSTR/PCSTR

 

 

 

指向8位(ANSI)字符串类型指针

 

LPCWSTR/LPWSTR/PCWSTR

 

 

 

指向16位Unicode字符串类型

 

LPCTSTR/LPTSTR/PCTSTR

 

 

 

指向一8位或16位字符串类型指针

 

LPSTR

 

 

 

一个32位,指向字符(字符串)数据的指针

 

LPVOID

 

 

 

指向一个未指定类型的32位指针

 

LPDWORD

 

 

 

指向一个DWORD型指针

 

其他相似类型: LPHANDLE、LPINT、LPLONG、LPWORD、LPRESULT

PBOOL、PBOOLEAN、PBYTE、PCHAR、PDWORD、PFLOAT、PHANDLE、PINT、PLONG、PSHORT……

说明:(1)在16位系统中 LP为16bit,P为8bit,在32位系统中都是32bit(此时等价)

(2)LPCSTR等 中的C指Const,T表示TCHAR模式即可以工作在ANSI下也可UNICODE

 

SHORT

 

usigned

 

整型

 

其他UCHAR、UINT、ULONG、ULONGLONG、USHORT为无符号相应类型

 

TBYTE

 

 

 

WCHAR型或者CHAR型

 

TCHAR

 

 

 

ANSI与unicode均可

 

VARIANT

_variant_t

COleVariant

 

 

 

一个结构体参考OAIDL.H

_variant_t是VARIANT的封装类

COleVariant也是VARIANT的封装类

 

 

 

 

 

 

 

FARPROC

 

 

 

 指向函数的32位指针

 

WNDPROC

 

 

 

指向一个窗口过程的32位指针

 

WCHAR

 

 

 

16位Unicode字符型

 

WORD

 

 

 

16位无符号整型

 

LOWORD

 

 

 

取一个32位整数的低16位,并应强制转换为short int。

 

WPARAM

 

 

 

消息参数

 

SIZE_T

 

 

 

size_t是针对系统定制的一种数据类型,一般是整形,因为C/C++标准只定义一最低的 位数,而不是必需的固定位数。而且在内存里,对数的高位对齐存储还是低位对齐存储各系统都不一样。为了提高代码的可移植性,就有必要定义这样的数据类型。 一般这种类型都会定义到它具体占几位内存等。当然,有些是编译器或系统已经给定义好的。具体要查看技术手册。

 

MFC

独有

数据

类型

 

下面两个数据类型是微软基础类库中独有的数据类型

 

POSITION

 

标记集合中一个元素的位置的值,被MFC中的集合类所使用

 

LPCRECT

 

指向一个RECT结构体常量(不能修改)的32位指针

 

CString

 

其实是MFC中的一个类

    

同时,为了统一变量的命名,在Windows中,不同类型的变量拥有各自的标准前缀,一般情况如表所示。

不同数据类型的前缀

前缀 数据类型

c 字符(char)

s 短整数(short)

cb 用于定义对象(一般为一个结构)尺寸的整数

n 整数(integer)

sz 以''/0''结尾的字符串

b 字节

f BOOL

w 字(WORD,无符号短整数)

l 长整数(LONG)

h HANDLE(无符号整数)

m_ 类成员变量

fn 函数(function)

dw 双字(DWORD,无符号长整数)

 

二、数据类型转换:

刚接触VC编程的朋友往往对许多数据类型的转换感到迷惑不解,本文将介绍一些常用数据类型的使用。

我们先定义一些常见类型变量借以说明

int i = 100;

long l = 2001;

float f=300.2;

double d=12345.119;

char username[]="http://www.handytech.cn/";

char temp[200];

char *buf;

CString str;

_variant_t v1;

_bstr_t v2;

 

一、其它数据类型转换为字符串

短整型(int)

itoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制

itoa(i,temp,2); ///按二进制方式转换

长整型(long)

ltoa(l,temp,10);

 

二、从其它包含字符串的变量中获取指向该字符串的指针

CString变量

str = "2008北京奥运";

buf = (LPSTR)(LPCTSTR)str;

BSTR类型的_variant_t变量

v1 = (_bstr_t)"程序员";

buf = _com_util::ConvertBSTRToString((_bstr_t)v1);

 

三、字符串转换为其它数据类型

strcpy(temp,"123");

 

短整型(int)

i = atoi(temp);

长整型(long)

l = atol(temp);

浮点(double)

d = atof(temp);

 

四、其它数据类型转换到CString

使用CString的成员函数Format来转换,例如:

整数(int)

str.Format("%d",i);

浮点数(float)

str.Format("%f",i);

字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值

str = username;

 

五、BSTR、_bstr_t与CComBSTR

CComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。

char *转换到BSTR可以这样: BSTR b=_com_util::ConvertStringToBSTR("数据");///使用前需要加上头文件comutil.h

反之可以使用char *p=_com_util::ConvertBSTRToString(b);

 

六、VARIANT 、_variant_t 与 COleVariant

VARIANT的结构可以参考头文件VC98/Include/OAIDL.H中关于结构体tagVARIANT的定义。

对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:

VARIANT va;

int a=2001;

va.vt=VT_I4;///指明整型数据

va.lVal=a; ///赋值

 

对于不马上赋值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:

 

unsigned char bVal; VT_UI1

short iVal; VT_I2

long lVal;VT_I4

float fltVal;VT_R4

double dblVal;VT_R8

VARIANT_BOOL boolVal;VT_BOOL

SCODE scode;VT_ERROR

CY cyVal;VT_CY

DATE date;VT_DATE

BSTR bstrVal;VT_BSTR

IUnknown FAR* punkVal;VT_UNKNOWN

IDispatch FAR* pdispVal;VT_DISPATCH

SAFEARRAY FAR* parray;VT_ARRAY|*

unsigned char FAR* pbVal;VT_BYREF|VT_UI1

short FAR* piVal;VT_BYREF|VT_I2

long FAR* plVal;VT_BYREF|VT_I4

float FAR* pfltVal;VT_BYREF|VT_R4

double FAR* pdblVal; VT_BYREF|VT_R8

VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOL

SCODE FAR* pscode;VT_BYREF|VT_ERROR

CY FAR* pcyVal;VT_BYREF|VT_CY

DATE FAR* pdate; VT_BYREF|VT_DATE

BSTR FAR* pbstrVal;VT_BYREF|VT_BSTR

IUnknown FAR* FAR* ppunkVal;VT_BYREF|VT_UNKNOWN

IDispatch FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATCH

SAFEARRAY FAR* FAR* pparray;VT_ARRAY|*

VARIANT FAR* pvarVal;VT_BYREF|VT_VARIANT

void FAR* byref;VT_BYREF

 

 

_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。

例如:

long l=222;

ing i=100;

_variant_t lVal(l);

lVal = (long)i;

 

 

COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:

COleVariant v3 = "字符串", v4 = (long)1999;

CString str =(BSTR)v3.pbstrVal;

long i = v4.lVal;

 

 

七、其它

对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据(DWORD)分解成两个16位数据(WORD),例如:

LPARAM lParam;

WORD lovalue = LOWORD(lParam);///取低16位

WORD hivalue = HIWORD(lParam);///取高16位

对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如:

WORD wvalue;

BYTE lovalue = LOBYTE(wvalue);///取低8位

BYTE hivalue = HIBYTE(wvalue);///取高8位

原创粉丝点击