分享
 
 
 

一些基础:VC编程经验和错误

王朝vc·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

文件操作

1、UNICODE文件开头标识:0Xfeff;

#define SETUNICODE(pFile) (fputwc(0xfeff, pFile))

2、TEXT("")功能符能转换代码值,而不仅仅表示宽字符,例如:

TCHAR tzBuf[126];

CHAR czBuf[126];

memset(tzBuf, 0, 126*sizeof(TCHAR));

memset(czBuf, 0, 126);

wsprintf(tzBuf, TEXT("阿三asga"));

sprintf(czBuf, "阿三asga");

或者:

TCHAR tzBuf[126] = TEXT("阿三asga");

CHAR czBuf[126] = "阿三asga";

结论:

地址tzBuf:963f,4e09,0061,0073,0067,0061,0000

地址czBuf:b0,a2,c8,fd,61,73,67,61,00

3、部分设备自带文本编辑器无法识别中文字符,无论是ANSI或者UNICODE格式;

4、读取和写入UNICODE文本时,需要使用"b"修饰符,如"rb"、"wb",不受fgets和fgetws的影响;

5、输出格式控制符说明:

Single-byte character with printf functions h c or C

Single-byte character with wprintf functions h c or C

Wide character with printf functions l c or C

Wide character with wprintf functions l c or C

Single-byte – character string with printf functions h s or S

Single-byte – character string with wprintf functions h s or S

Wide-character string with printf functions l s or S

Wide-character string with wprintf functions l s or S

易发生错误一:

sscanf(buf, TEXT(“%d”), var); //遗忘”&”

sscanf(buf, TEXT(“%d”), &var);

易发生错误二:

Template<class T> class mytem操作时,如果在头文件中仅仅声明class myclass,那么如下操作导致:

Mytem<myclass> m_Mytem;

可能出错。已遇上的错误:myclass中使用VirtualAlloc分配内存时,sizeof(myclass)的值不确定,导致分配内存失败。

关于Combobox的使用:

Combobox有Dropdown和Droplist两种Type,对于Droplist来说,OnSelchange()中使用UpdateData()可以获得用户选择的项,而对于Dropdown来说,OnSelchange()中必须先使用m_CtrlCombo.SetSel(m_CtrlCombo.GetSel()),然后使用UpdateData()才可以获取用户选择的项。

要善于使用SHE处理问题,如记录文件读取:

FILE* pFile = fopen(strFileName, “r”);

do

{

__try

{

fgets(czBuf, LINENUM, pFile);

//do your things here…

}

__except(EXCEPTION_EXECUTE_HANDLER)

{

//continue or break?

}

}while(!feof(pFile));

fclose(pFile);

使用位图缓冲区绘图:

//定义位图:

CBitmap m_Bitmap;

//装载位图或者初始化位图:

//装载位图:

m_Bitmap.LoadBitmap(IDB_BITMAP1);

/****初始化位图**********

CClientDC ClientDC(this);

m_Bitmap.CreateCompatibleBitmap(&ClientDC, 32, 32);

//**********************/

//初始化内存设备句柄:

CClientDC ClientDC(this); //显示设备句柄

CDC MemDC;

MemDC.CreateCompatibleDC(&ClientDC);

//位图装入内存设备描述表:

MemDC.SelectObject(&m_Bitmap);

//使用内存设备操作位图:

MemDC.PatBlt(0, 0, 32, 32, WHITENESS);//刷墙

MemDC.Ellipse(2, 2, 30, 30);//画圆

//显示位图:OnDraw(CDC* pDC,…)

BITMAP BM;

m_Bitmap.GetObject(sizeof(BM), &BM);

pDC->BitBlt(

0,

0,

BM.bmWidth,

BM.bmHeight,

&MemDC,

0,

0,

SRCCOPY);

//其他位图操作函数:

//PatBlt(int x, int y, int nWidth, int nHeight, DWORD dwRop);

//StretchBlt(int x, int y, int nWidth, int nHeight, CDC* pSreDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop);

读取CF卡ID号:

#include <winioctl.h>

typedef struct _STORAGE_IDENTIFICATION {

DWORD dwSize;

DWORD dwFlags;

DWORD dwManufactureIDOffset;

DWORD dwSerialNumOffset;

} STORAGE_IDENTIFICATION, *PSTORAGE_IDENTIFICATION;

TCHAR tzCFCardID[22];

HANDLE hCard = CreateFile(TEXT("DSK1:"), //设备标识DISK1由查询注册表获得

GENERIC_READ|GENERIC_WRITE,

0,

NULL,

OPEN_EXISTING,

0,

NULL);

if(hCard)

{

int i = 0;

PSTORAGE_IDENTIFICATION pStoreInfo;

pStoreInfo=(STORAGE_IDENTIFICATION *)LocalAlloc(LMEM_ZEROINIT,3000);

DWORD dwGetBytes;

if (DeviceIoControl(hCard,

CTL_CODE(0x0007, 0x0709, METHOD_BUFFERED, FILE_ANY_ACCESS), // 关键行:指定IOCTL

NULL,

0,

(LPVOID)pStoreInfo,

3000,

&dwGetBytes,

NULL)

!=FALSE)

{

if(dwGetBytes > 0)

{

i = 0;

int j = 0;

if(pStoreInfo->dwSerialNumOffset < dwGetBytes)

{

BYTE* SerialNo=(((BYTE *)pStoreInfo)+pStoreInfo->dwSerialNumOffset);

while (SerialNo[i]!=0 && i<(int)(dwGetBytes-pStoreInfo->dwSerialNumOffset) && i<22)

{

if(SerialNo[i] < '0' || SerialNo[i] > 'z')

{

j++;

}

else

{

tzCFCardID[i - j]=(TCHAR)SerialNo[i];

}

i++;

}

}

tzCFCardID[i - j]=0;

}

}

else

{

wsprintf(tzError, TEXT("查询储存卡ID失败,错误号%lu!"), GetLastError());

AfxMessageBox(tzError);

LocalFree(pStoreInfo);

CloseHandle(hCard);

return FALSE;

}

LocalFree(pStoreInfo);

CloseHandle(hCard);

//说明:有些卡是没有卡号的,当初折磨了我很久:)

关键代码段运行时间测试

__int64 FileTimeToQuadWord(PFILETIME pft)

{

return (Int64ShllMod32(pft->dwHighDateTime, 32) | pft->dwLowDateTime);

}

union LTIME

{

int nTime[2];

__int64 lTime;

};

FILETIME ftKernelTimeStart, ftKernelTimeEnd;

FILETIME ftUserTimeStart, ftUserTimeEnd;

FILETIME ftDummy;

__int64 qwKernelTimeElapsed, qwUserTimeElapsed,

qwTotalTimeElapsed;

int nTimes;

LTIME KernelTime, UserTime, TotalTime;

void TimeStart()

{

GetThreadTimes(GetCurrentThread(), &ftDummy, &ftDummy,

&ftKernelTimeStart, &ftUserTimeStart);

}

void TimeEnd()

{

GetThreadTimes(GetCurrentThread(), &ftDummy, &ftDummy,

&ftKernelTimeEnd, &ftUserTimeEnd);

qwKernelTimeElapsed = FileTimeToQuadWord(&ftKernelTimeEnd) -

FileTimeToQuadWord(&ftKernelTimeStart);

qwUserTimeElapsed = FileTimeToQuadWord(&ftUserTimeEnd) -

FileTimeToQuadWord(&ftUserTimeStart);

/*

LARGE_INTEGER liStart, liEnd;

liStart.HighPart = ftUserTimeStart.dwHighDateTime;

liStart.LowPart = ftUserTimeStart.dwLowDateTime;

liEnd.HighPart = ftUserTimeEnd.dwHighDateTime;

liEnd.LowPart = ftUserTimeEnd.dwLowDateTime;

qwUserTimeElapsed = liEnd.QuadPart - liStart.QuadPart;

//*/

qwTotalTimeElapsed = qwKernelTimeElapsed + qwUserTimeElapsed;

nTimes++;

KernelTime.lTime = KernelTime.lTime + (qwKernelTimeElapsed - KernelTime.lTime)/nTimes;

UserTime.lTime = UserTime.lTime + (qwUserTimeElapsed - UserTime.lTime)/nTimes;

TotalTime.lTime = TotalTime.lTime + (qwTotalTimeElapsed - TotalTime.lTime)/nTimes;

}

void TimeReport()

{

FILE* pFile = fopen("TestTime.txt", "a+");

fprintf(pFile, "Test Description :\n");

fprintf(pFile, "Total Times:%d\n", nTimes);

fprintf(pFile, "Kernel Time Elapsed:%d, %d\n", KernelTime.nTime[1], KernelTime.nTime[0]);

fprintf(pFile, "User Time Elapsed:%d, %d\n", UserTime.nTime[1], UserTime.nTime[0]);

fprintf(pFile, "Total Time Elapsed:%d, %d\n\n", TotalTime.nTime[1], TotalTime.nTime[0]);

fclose(pFile);

}

void InitTestTime()

{

nTimes = 0;

KernelTime.lTime = 0;

UserTime.lTime = 0;

TotalTime.lTime = 0;

}

代码替换链接

#pragma comment( lib, "opengl32.lib" ) // 链接时使用OpenGL32.lib

列表操作

图标设置

m_AttTypeImageList.Create(IDB_ATTRIBUTETYPE, 16, 0, FALSE);

m_CtrlListPos.SetImageList(&m_AttTypeImageList, LVSIL_SMALL);

专栏操作

LV_COLUMN lvc;

lvc.mask = (LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM);

lvc.fmt = LVCFMT_LEFT;

TCHAR* Caption[6] = {TEXT("点名"),

TEXT("工程X"), TEXT("工程Y"),

TEXT("工程H"), TEXT("天线高"),

TEXT("描述")};

for(int i = 0; i<6; i++)

{

lvc.pszText = Caption[i];

if(i == 0) lvc.cx = 60;

else lvc.cx = 100;

lvc.iSubItem = i;

m_CtrlListPos.InsertColumn(i, &lvc);

}

记录操作

LV_ITEM lvi;

lvi.mask = LVIF_TEXT|LVIF_IMAGE;

lvi.pszText = pDPos->m_tzName;

lvi.iItem = i;

lvi.iSubItem = 0;

if(…)

lvi.iImage = 0;

else

lvi.iImage = 1;

m_CtrlListPos.SetItem(&lvi);

TCHAR cc[20];

_stprintf(cc, TEXT("%.3lf"), pDPos->m_x);

m_CtrlListPos.SetItemText(lvi.iItem, 1, cc);

_stprintf(cc, TEXT("%.3lf"), pDPos->m_y);

m_CtrlListPos.SetItemText(i, 2, cc);

_stprintf(cc, TEXT("%.3lf"), pDPos->m_z);

m_CtrlListPos.SetItemText(i, 3, cc);

_stprintf(cc, TEXT("%.3lf"), pDPos->m_dAntH);

m_CtrlListPos.SetItemText(i, 4, cc);

m_CtrlListPos.SetItemText(i, 5, pDPos->m_tzAttribute);

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有