未知 [信息技术] 一些VC编程经验和错误     阅读:5527  

一些VC编程经验和错误
作者: 不详 编辑: 海韵 发布日期: 2005-05-24 00:00:00 点击量: 5527 来源: haiyun.net
文件操作
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);

[ 海韵 于 2005-05-24 00:00:00  星期二   ]  
相关文章:

网友评论
正在加载评论...


免责申明 | 版权申明 | 联系我们 | 关于
Copyright © 2001-2024 Haiyun.Net All Rights Reserved
地址:深圳市南山区南油天安工业区1栋3楼 邮编:518000
有我可以帮您的吗?QQ:12457275  
粤ICP备05017321号-1