Archive for the ‘平台’ Category

Disk

星期四, 16 7 月, 2009

初始化对话框:

    TCHAR cBuffer[256];
    DWORD nSize = sizeof(cBuffer);
    ZeroMemory(cBuffer, nSize);
    GetUserName(cBuffer, &nSize);//获取用户信息
    MessageBox(NULL, cBuffer, TEXT(“用户信息”), MB_OK);
    GetOsVersion();//获取系统版本信息
    DWORD nSeconds = GetTickCount();
    ZeroMemory(cBuffer, nSize);
    wsprintf(cBuffer, “系统已启动%d秒”, nSeconds/1000);//获取系统启动时间
    MessageBox(NULL, cBuffer, TEXT(“系统信息”), MB_OK);
 GetDiskType(“C:”); //获取磁盘C类型
    GetDiskFreeSpaceInfo(“C:”);//获取磁盘C空间信息

自定义函数:

void GetOsVersion()
{
    OSVERSIONINFO osvi;
    TCHAR* strOSVersion;
    ZeroMemory(&osvi, sizeof(osvi));
    osvi.dwOSVersionInfoSize = sizeof(osvi);
    GetVersionEx(&osvi);
    //首先判断是NT架构的还是旧架构
    switch(osvi.dwPlatformId)
    {
    case VER_PLATFORM_WIN32_NT:
        if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0)
        {
            strOSVersion = TEXT(“Windows 2000”);
        }
        else if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1)
        {
            strOSVersion = TEXT(“Windows XP”);
        }
        else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0)   
        {
         strOSVersion = TEXT(“Windows Vista”);  
        }
        else if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
        {
            strOSVersion = TEXT(“Windows NT”);
        }
        break;
    case  VER_PLATFORM_WIN32_WINDOWS:
        if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
        {
            strOSVersion = TEXT(“Windows 98”);
        }
        else if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
        {
            strOSVersion = TEXT(“Windows ME”);
        }
        else
        {
            strOSVersion = TEXT(“Windows 95”);
        }
        break;
    default:
        break;
 }
 MessageBox(NULL,strOSVersion, TEXT(“系统信息”), MB_OK);
}

void GetDiskType(LPCTSTR lpRootPathName)
{
 UINT uType = GetDriveType(lpRootPathName);               
  switch(uType)
 {
  case DRIVE_UNKNOWN:
   MessageBox(NULL,TEXT(“未知磁盘类型”),””,MB_OK);
   break;
  case DRIVE_NO_ROOT_DIR:
   MessageBox(NULL,TEXT(“磁盘名无效”),””,MB_OK);
   break;
     case DRIVE_REMOVABLE:
            MessageBox(NULL,TEXT(“可移动磁盘”),””,MB_OK);
   break;
  case DRIVE_FIXED:
   MessageBox(NULL,TEXT(“固定磁盘”),””,MB_OK);
     break;
  case DRIVE_REMOTE:
   MessageBox(NULL,TEXT(“网络磁盘”),””,MB_OK);
    break;
  case DRIVE_CDROM:
   MessageBox(NULL,TEXT(“光驱”),””,MB_OK);
   break;
  case DRIVE_RAMDISK:
   MessageBox(NULL,TEXT(“RAM”),””,MB_OK);
   break;
  default:
   MessageBox(NULL,TEXT(“GetDriveType的非法返回值”),””,MB_OK);
 }
}

void GetDiskFreeSpaceInfo(LPCSTR lpDirectoryName)
{
    ULARGE_INTEGER nFreeBytesAvailableToCaller;
    ULARGE_INTEGER nTotalNumberOfBytes;
    ULARGE_INTEGER nTotalNumberOfFreeBytes;
    if(GetDiskFreeSpaceEx(lpDirectoryName, &nFreeBytesAvailableToCaller, &nTotalNumberOfBytes, &nTotalNumberOfFreeBytes))
    { 
     TCHAR cInfo[256];
     wsprintf(cInfo, “磁盘%s总大小:%I64dG 空闲空间:%I64dG 可用空间:%I64dG”, lpDirectoryName, nTotalNumberOfBytes.QuadPart/1024/1024/1024, nTotalNumberOfFreeBytes.QuadPart/1024/1024/1024, nFreeBytesAvailableToCaller.QuadPart/1024/1024/1024);
     MessageBox(NULL, cInfo, TEXT(“磁盘信息”), MB_OK);
    }
    else
    {
     MessageBox(NULL, TEXT(“获取磁盘信息失败”), TEXT(“错误”), MB_OK | MB_ICONASTERISK);
    }
}

关于ULARGE_INTEGER:

http://www.rupeng.com/forum/thread-409-1-1.html

http://blog.csdn.net/feilong0519/archive/2008/10/26/3153010.aspx

Clock

星期二, 14 7 月, 2009

初始化对话框时设置定时器SetTimer(hwnd, 1, 1000, TimerProc);

时间到后回调的处理函数:

VOID CALLBACK TimerProc(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)
{
 SYSTEMTIME stTime;
 GetLocalTime(&stTime);
 TCHAR cResult[256];
 wsprintf(cResult, TEXT(“%d-%02d-%02d %02d:%02d:%02d”), stTime.wYear, stTime.wMonth, stTime.wDay, stTime.wHour, stTime.wMinute, stTime.wSecond);
 SetDlgItemText(hwnd, IDC_EDTTIME, cResult);
}

wsprintf参考资料:http://baike.baidu.com/view/849487.htm

Clock

ComboBox

星期一, 13 7 月, 2009

ComboBox(下拉菜单)控件在资源编辑器里进行设置。但它的项的添加、删除以及其他处理需要通过函数来实现。

SetDlgItemMessage

  函数功能:该函数把一个消息发送给指定的对话框中的控制。

  函数原型:LONG SendDlgItemMessage(

  HWND hDlg, // handle of dialog box

  int nIDDlgItem, // identifier of control

  UINT Msg, // message to send

  WPARAM wParam, // first message parameter

  LPARAM lParam // second message parameter

  );

  参数:

  hDlg:指定含有控制的对话框。

  nIDDigItem:指定接收消息的控制的标识符。

  Msg:指定将被发送的消息。

  wParam:指定消息特定的其他信息。

  lParam:指定消息特定的其他信息。

  返回值:返回值指定消息处理的结果,且依赖于发送的消息。

  备注:SendDlgItemMessage函数直到消息已经被处理时才返回。

  使用SendDlgItemMessage函数同从一个指定的控制中检索句柄和调用SendMessagge函数一样。

  速查:WindowsNT3.1及以上版本;Windows95及以上版本;WindowsCE1.0及以上版本;头文件:winuser.h;库文件:user32.lib Unicode:在Windows NT上实现为UnicodeANSI两种版本。

ComboBox的操作

添加项:

填入Combo最简单的方法是借助CB_ADDSTRING消息:SendDlgItemMessage (hwnd,IDC_CBO1, CB_ADDSTRING, 0, (LPARAM) szString) ;

确定目前选项的索引:iIndex = SendDlgItemMessage (hwnd,IDC_CBO1, CB_GETCURSEL, 0, 0) ;如果没有项目被选中,那么从函数中传回的iIndex值为CB_ERR

删除项:

在指定索引值的同时使用LB_DELETESTRING参数,可以从项清单中删除对应项:SendDlgItemMessage (hwnd,IDC_CBO1, LB_DELETESTRING, iIndex, 0) ;

取得有多少项:

iCount = SendDlgItemMessage (hwnd,IDC_CBO1, LB_GETCOUNT, 0, 0) ;

选定某一项SendDlgItemMessage (hwnd,IDC_CBO1, LB_SETCURSEL, iIndex, 0) ;iParam设定为-1则取消所有选择。

WavPlayer对话框版

星期一, 13 7 月, 2009

定义全局变量

OPENFILENAME ofn;
TCHAR szFile[MAX_PATH];
int play = 0;

处理过程

void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
 ZeroMemory(&ofn, sizeof(ofn));
 ofn.lStructSize = sizeof(ofn);
 ofn.lpstrFile = szFile;
 //ofn.lpstrFile[0] = TEXT(‘\0’);
 ofn.nMaxFile = sizeof(szFile);
 ofn.lpstrFilter = TEXT(“*.wav\0*.wav\0”);
 ofn.nFilterIndex = 1;
 ofn.lpstrFileTitle = NULL;
 ofn.nMaxFileTitle = 0;
 ofn.lpstrInitialDir = NULL;
 ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
    switch(id)
    {
     case IDC_BTNOPEN:
    if(GetOpenFileName(&ofn))
    {
     SetDlgItemText(hwnd, IDC_EDTPATH, szFile);
     SetDlgItemText(hwnd, IDC_EDTSTATIC, TEXT(“
已打开“));
     play = 1;
    }
     break;
     case IDC_BTNPLAY:
      if(play)
      {
       //PlaySound(szFile, hAppInstance, SND_FILENAME | SND_ASYNC);
       PlaySound(szFile, NULL, SND_FILENAME | SND_ASYNC);
       SetDlgItemText(hwnd, IDC_EDTSTATIC, TEXT(“
播放“));
      }
     break;
     case IDC_BTNSTOP:
      if(play)
      {
       //PlaySound(szFile, hAppInstance, SND_FILENAME | SND_ASYNC);
       PlaySound(NULL, NULL, SND_FILENAME | SND_SYNC);
       SetDlgItemText(hwnd, IDC_EDTSTATIC, TEXT(“
停止“));
      }
     break;
        default:break;
    }
}

Windows程序主要是OS与函数以及函数与函数的相互调用,因此在写WavPlayer对话框版时,要注意到变量的作用域以及全局变量的定义。在Main_OnCommand里定义变量打开wav文件后,按播放,ofnszFileplay又被初始化,导致无法播放。

全局变量的定义是在一个.cpp的文件中定义,再在一个.h的文件中使用关键字extern进行声明,其他需要使用该全局变量的文件#include该头文件即可。

GetWindowLong从窗口句柄取得执行实体句柄:HINSTANCE ai = (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);

PlaySound用于播放嵌入式wav资源文件时,其中要用到第二个参数hmodPlaySound(TEXT(“IDW_MUSIC”),appInstance,SND_RESOURCE|SND_ASYNC| SND_LOOP);

问题:

ofn.lpstrFile[0] = TEXT(‘\0’);这句是将ofn.lpstrFile所指字符串置零,起到初始化的作用。在VC6.0里,通过调试查看其和szFile的值是正确的路径。
但在用C-Free写的这个程序里,发现X盘路径是“\000:……”,显示出来确实是“X:……”,但是用在PlaySound里却无法播放wav文件。
去掉了ofn.lpstrFile[0] = TEXT(‘\0’);就可以了。为什么呢?

 

 

WavPlayer对话框版

对话框程序

星期日, 12 7 月, 2009

对话框程序是窗口程序的子集。窗口程序大部分的工作由对话框程序执行。

对话框的相关设置在工程的.dlg文件里,使用资源编辑器可进行对话框设置。

设置对话框控件及其属性。一般常设置控件的Name和Caption属性。Name是对话框控件的标识,在C-Free里它的宏定义在rsrc.inc文件里,其有一定的命名规则。

对话框菜单设置好后,在对话框Menu属性中添加菜单。

Image控件注意Type和Image属性。

EditText控件注意xStyle属性。

资源最好保存在工程下。

对话框设置好后,需要在main.cpp中写处理函数。

注意要#include “rsrc.inc”。

按钮的点击在Main_OnCommand中。

void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
 int iDrivesNum = 0;
 TCHAR cStr[10] = “IHGFEDCBA”;
    switch(id)
    {
  case IDC_BTNGO:
   TCHAR cR[256];
   GetDlgItemText(hwnd, IDC_EDTR, cR, sizeof(cR)/sizeof(TCHAR));
   float fR = atof(cR);
   fR = 3.1415926*fR*fR;
   gcvt(fR, 8, cR);
   SetDlgItemText(hwnd, IDC_EDTRESULT, cR);
  break;
  case IDC_BTNINFO:
   DWORD dInfo = GetLogicalDrives(); 
   TCHAR cInfo[256];
   TCHAR cResult[256];
   itoa(dInfo, cInfo, 2);
   for(int i = lstrlen(cInfo)-1; i >= 0; i–)
   {
    if(cInfo[i] == ‘1’)
    {
     cResult[iDrivesNum] = cStr[i];
     iDrivesNum++;   
     //TCHAR cTemp = cStr[i];
     //lstrcat(cResult, &cTemp);
     //为什么会出现特殊字符?
    }
   }
   cResult[iDrivesNum+1] = ‘\0’;
   SetDlgItemText(hwnd, IDC_EDTINFO, cResult);
  break;
        default:break;
    }

}

问题部分是因为lstrcat是连接字符串(字符指针)的,不能用来直接连接char。

参考资料:

lstrcat http://baike.baidu.com/view/1906745.htm

strcat http://baike.baidu.com/view/1028534.htm

strncat http://baike.baidu.com/view/1028544.htm

问题部分改为

    if(cInfo[i] == ‘1’)
    {
      iDrivesNum++;   
     TCHAR* cTemp = &cStr[i];
     strncat(cResult, cTemp, 1);
     //为什么只在第一个位置出现特殊字符?
    }

ZeroMemory(cResult, sizeof(cResult));

Dialog