返回列表 发帖

【教学视频】《C语言也能干大事》第九节:自己动手写Windows优化大师

《C语言也能干大事》已经录制第二版,不推荐初学者学习这里的旧版,因此请到下面的地址( http://www.rupeng.com/forum/forum-52-1.html )学习第二版。

在线观看视频(非清晰版):


清晰版

如鹏电骡(verycd)下载站:http://www.verycd.com/topics/2800166/

高清版
不提供下载

板书:
1、如何修改文字的颜色呢?这块要涉及到比较复杂的东西,不过其实可以先用画图板画一个文字图片,然后放上去呀,呵呵。变通嘛
2、下面几个函数只是给大家文档,具体怎么用则需要自己试验。这也是训练大家自学能力和解决问题能力的一步,不能永远让老师“填鸭式教育”。
3、得到驱动器的簇信息、剩余空间大小、总大小
函数原型:
BOOL GetDiskFreeSpaceExA(

LPCSTR lpDirectoryName,


PULARGE_INTEGER lpFreeBytesAvailableToCaller,


PULARGE_INTEGER lpTotalNumberOfBytes,


PULARGE_INTEGER lpTotalNumberOfFreeBytes


);

lpDirectoryName是驱动器的名称。
lpFreeBytesAvailableToCaller
是用户可用的磁盘空间。
lpTotalNumberOfBytes
是磁盘总共的空间。
lpTotalNumberOfFreeBytes
是磁盘空闲的空间。以上都是字节为单位。

lpFreeBytesAvailableToCaller
不一定等于lpTotalNumberOfFreeBytes。操作系统里边可以设置某个用户可以用的最大磁盘,比如说磁盘还有100G可用,但是我限制用户yzk最多能用20G硬盘,因此如果用yzk登录的话只有不到20G的可用空间。因此lpTotalNumberOfFreeBytes>=lpFreeBytesAvailableToCaller
PULARGE_INTEGER64位的整数,也就是“大整数BigInteger”,因为int32位的,如果用int表示磁盘空间的话最多能表示232次方也就是2G。现在的磁盘都超过了2G了,所以要用64位的大整数来表示。
1)示例代码:
  1.                   int i;
  2.                    scanf("%d",&i)

  3.          ULARGE_INTEGER nFreeBytesAvailable;
  4.          ULARGE_INTEGER nTotalNumberOfBytes;
  5.          ULARGE_INTEGER nTotalNumberOfFreeBytes;
  6.          if (GetDiskFreeSpaceEx("C:",
  7.                &nFreeBytesAvailable,
  8.                &nTotalNumberOfBytes,
  9.               &nTotalNumberOfFreeBytes))
  10.          {
  11.                TCHAR  chBuf[256];
  12.                wsprintf(chBuf,"当前用户可用:%I64d,总大小:%I64d,当前可用空间:%I64d\r\n",
  13.                    nFreeBytesAvailable,
  14.                    nTotalNumberOfBytes,
  15.                     nTotalNumberOfFreeBytes);
  16.                MessageBox(NULL,chBuf,"",MB_OK);
  17.          }
  18.                     else
  19.                     {
  20.                              MessageBox(NULL,"获取失败","",MB_OK|MB_ICONASTERISK);
  21.                     }
复制代码



注意这里wsprintf的用法,wsprintfprintf类似,不过wsprintf是将结果打印到字符串中,而不是屏幕中。“%I64d”和printf中的“%d”一样,它表示此处是64位大整数的占位符。
我们在向着Windows优化大师一步步前进。耶!!!
2)课后作业:

上面代码的显示效果很难看,请以MB或者GB的形式显示结果。而且如果结果小于1G则以MB为单位显示,否则以GB为单位显示。

4、得到磁盘的类型(只介绍,自己课下练习)

UINT GetDriveType(




  LPCTSTR lpRootPathName // root directory


  );


  函数功能:判断磁盘类型


  参数说明


  lpRootPathName 包含了根目录路径的字符串指针


  返回值:


  DRIVE_UNKNOWN 未知的磁盘类型


  DRIVE_NO_ROOT_DIR 说明lpRootPathName是无效的


  DRIVE_REMOVABLE 可移动磁盘


  DRIVE_FIXED 固定磁盘


  DRIVE_REMOTE 网络磁盘


  DRIVE_CDROM 光驱


DRIVE_RAMDISK RAM
1)示例代码:

  1.          UINT t = GetDriveType("c:");               
  2.          switch (t)
  3.          {
  4.          case DRIVE_UNKNOWN:
  5.                    MessageBox(NULL,TEXT("未知磁盘类型"),"",MB_OK);
  6.                    break;
  7.          case DRIVE_NO_ROOT_DIR:
  8.                    MessageBox(NULL,TEXT("磁盘名无效"),"",MB_OK);
  9.                    break;
  10.          case DRIVE_REMOVABLE:
  11.                    MessageBox(NULL,TEXT("可移动磁盘"),"",MB_OK);
  12.                    break;
  13.          case DRIVE_FIXED:
  14.                    MessageBox(NULL,TEXT("固定磁盘"),"",MB_OK);
  15.                    break;
  16.          case DRIVE_REMOTE:
  17.                    MessageBox(NULL,TEXT("网络磁盘"),"",MB_OK);
  18.                    break;
  19.          case DRIVE_CDROM:
  20.                    MessageBox(NULL,TEXT("光驱"),"",MB_OK);
  21.                    break;
  22.          case DRIVE_RAMDISK:
  23.                    MessageBox(NULL,TEXT("RAM"),"",MB_OK);
  24.                    break;
  25.          default:
  26.                    MessageBox(NULL,TEXT("GetDriveType的返回值非法"),"",MB_OK);
  27.          }
复制代码


思考:在switch语句最后的default不加可以吗?
2)课后作业:
遍历系统中所有逻辑驱动器,如果驱动器是可移动硬盘或者固定硬盘则显示其可用磁盘空间(如果结果小于1G则以MB为单位显示,否则以GB为单位显示)。此题综合了前边学的所有知识点。
5、得到当前登录用户名:
BOOL GetUserName(LPWSTR lpBuffer, LPDWORD nSize);
参数含义:
lpBuffer是获取名称的字符缓冲区。
pcbBuffer是一个DWORD的指针,进入的时候指的是缓冲区的大小,方法返回后指的是帐号的长度。

TCHAR chBuf[256];


DWORD dwRet = sizeof(chBuf)/sizeof(TCHAR);


ZeroMemory(chBuf,256);// ZeroMemory
用来将缓冲区chBufn个字符初始化为0

//
获取当前登录用户的名称

GetUserName(chBuf,&dwRet);


MessageBox(NULL,chBuf,"",MB_OK);

6、得到内存信息:
为什么不像GetDiskFreeSpaceEx那样用很多参数?潜规则:一个函数的参数不要多于5个。

  1. VOID GlobalMemoryStatus(LPMEMORYSTATUS);
  2. #include <windows.h>
  3. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  4.                    PSTR szCmdLine, int iCmdShow)
  5. {
  6.          MEMORYSTATUS memStatex;
  7.          const int nBufSize = 512;
  8.          TCHAR chBuf[nBufSize];
  9.          GlobalMemoryStatus(&memStatex);
  10.          
  11.          ZeroMemory(chBuf,nBufSize);
  12.          
  13.          //内存使用率。
  14.          wsprintf(chBuf,TEXT("内存使用率: %u%%兆\n"),memStatex.dwMemoryLoad);
  15.          MessageBox(NULL,chBuf,"",MB_OK);
  16.          
  17.          //总共物理内存。
  18.          wsprintf(chBuf, TEXT ("总共物理内存: %u兆\n"),memStatex.dwTotalPhys/(1024*1024) );
  19.          MessageBox(NULL,chBuf,"",MB_OK);
  20.          
  21.          //可用物理内存。
  22.          wsprintf(chBuf, TEXT ("可用物理内存: %u兆\n"),memStatex.dwAvailPhys/(1024*1024) );
  23.          MessageBox(NULL,chBuf,"",MB_OK);
  24.          
  25.          //全部的虚拟内存。
  26.          wsprintf(chBuf, TEXT ("全部的内存: %u兆\n"),memStatex.dwTotalVirtual/(1024*1024));
  27.          MessageBox(NULL,chBuf,"",MB_OK);


  28.          //看一下这个算法有什么需要完善的地方?(这是笔试、面试重点)
  29.          //1、计算1024*1024的地方太多了,应该用一个常量定义1024*1024的值
  30.          //这样一处修改,别的地方就修改了
  31.          //2、1024*1024写成 1048576不更好吗?省得每次都计算,节省时间???
  32.          //NO!还记得《编译原理》那门课中讲的编译器优化吗?编译器会自动将1024*1024
  33.          //帮我们在编译时算成 1048576,所以这里保留了可读性,同时又不失快速,嘻嘻
  34.          //这两天更应该注意,都是常考点。   
  35.          return 0 ;
  36. }
复制代码


Phys
physical。物理的。

Avail
Available。可用的。
Virtual:虚拟的。

你的内存是1G,这个就是物理内存。操作系统还会把硬盘的一个文件模拟成一个内存,这个内存就是虚拟内存。尽量避免数据在虚拟内存中,因为硬盘访问速度非常慢。你开一个游戏的时候,同时把word最小化,windows就有可能把word的内存数据放到虚拟内存中,把游戏的内存放到物理内存中。windows里边c:/ pagefile.sys(需要关闭打开文件夹选项的“隐藏操作系统的文件”)

联系以及复习操作系统这门课中关于虚拟内存的章节,面试时可能会考。
课上练习:思考这两个问题,并且完成优化。联想一道笔试题。
7、取得操作系统的版本:
BOOL GetVersionExW(LPOSVERSIONINFOW);
讲取得版本的方式,然后让学生写下面的代码:

  1.     OSVERSIONINFO osvi;
  2.     TCHAR * strOSVersion;
  3.     ZeroMemory( &osvi, sizeof( osvi ) );
  4.     osvi.dwOSVersionInfoSize = sizeof( osvi );
  5.     GetVersionEx(&osvi);
  6.     //首先判断是NT架构的还是旧架构的
  7.     switch (osvi.dwPlatformId)
  8.     {
  9.     case VER_PLATFORM_WIN32_NT:
  10.         if (osvi.dwMajorVersion == 5&&osvi.dwMinorVersion == 0)
  11.         {
  12.             strOSVersion = TEXT("Windows 2000");
  13.         }
  14.         else if (osvi.dwMajorVersion == 5&&osvi.dwMinorVersion == 1)
  15.         {
  16.             strOSVersion = TEXT("Windows XP");
  17.         }
  18.         else if(osvi.dwMajorVersion == 6&&osvi.dwMinorVersion == 0)   
  19.         {
  20.                                      strOSVersion = TEXT("Windows Vista");   
  21.         }
  22.         else if (osvi.dwMajorVersion == 4&&osvi.dwMinorVersion == 0)
  23.         {
  24.             strOSVersion = TEXT("Windows NT");
  25.         }
  26.         break;
  27.     case  VER_PLATFORM_WIN32_WINDOWS:
  28.         if (osvi.dwMajorVersion == 4&&osvi.dwMinorVersion == 10)
  29.         {
  30.             strOSVersion = TEXT("Windows 98");
  31.         }
  32.         else if (osvi.dwMajorVersion == 4&&osvi.dwMinorVersion == 90)
  33.         {
  34.             strOSVersion = TEXT("Windows ME");
  35.         }
  36.         else
  37.         {
  38.             strOSVersion = TEXT("Windows 95");
  39.         }
  40.         break;
  41.     default:
  42.         break;
  43. }
复制代码

8、得到系统自启动以来的毫秒数:
DWORD GetTickCount(void);
1这个函数其实是返回pc8253rtc的中断次数。对于1000HZ的配置来说,49天翻转一次。
2
DWORD dwStart = GetTickCount();


TCHAR buf[256];


wsprintf(buf,"
自系统启动以来%d",dwStart/1000);

MessageBox(NULL,buf,"",MB_OK);

3)计算自系统启动以来有多少天、多少小时、多少分。
为什么休眠以后会重置?联系计算机组成原理、数字电路这门课。

9、取得复选按钮的是否选中:
SendDlgItemMessage
SendMessage (hwnd, BM_GETCHECK, 0, 0)
设置复选按钮是否选中:
SendMessage(hwndCancelBtn,BM_SETCHECK,FALSE,0);

课上练习:怎么实现点击按钮让复选框在“选中”、“未选中”中切换呢?


[Error] D:\俺的文档\C-Free\Projects\ctrl002\main.cpp:59: error: redeclaration of `BOOL bChecked'
declare:声明。declaration:声明(名)。redo:重做,redraw:重绘,repeat:重复
redeclaration:重复声明
括号是变量的作用域
Case语句哪怕只有一个行,也要加大括号。好的习惯。

[Error] D:\GREENI~1\MINGW3~1.5\include\winuser.h:3909: error: too many arguments to function `LONG SendDlgItemMessageA(HWND__*, int, UINT, WPARAM, LPARAM)'
too many arguments to function
arguments:参数
function:函数
太多的参数给函数。
6、隐藏、显示、禁用、启用控件:
隐藏:ShowWindow (hwndChild, SW_HIDE) ;
显示:ShowWindow(hwndEdtName,SW_NORMAL);
判断控件是否可见:IsWindowVisible (hwndChild) ;
禁用控件:EnableWindow (hwndChild, FALSE) ;
启用控件:EnableWindow(hwndEdtName,TRUE);
判断控件是否可用:IsWindowEnabled (hwndChild) ;



本节课代码下载(请在听完课后再下载,课上的代码要自己敲出来,而不是直接拷贝老师的代码): ctrl002.rar (13.43 KB)

作业分析

C_Free太不稳定了啊....写了两天天的代码都成了乱码.....老子....
        这个作业基本上发了两天时间,主要是细节方面比较麻烦。
我在这几个问题上浪费了太多时间:
(1)wsprintf()这个函数不能打印浮点型,刚开始我用wsprintf(sDri,"%.3f",i)这个函数打印磁盘空间容量的时候总是只打印f出来啊,我刚开始总以为i的值弄错了,...最后还是一步步的检查出来了。
(2)显示磁盘信息的时候 “以MB或者GB的形式显示结果。而且如果结果小于1G则以MB为单位显示,否则以GB为单位显示”,针对这个问题还是比较麻烦的啊,你要打印GB,MB这些字符,我最后把磁盘空间信息和“GB”,“MB”这些字符组成了一个字符串,在一个函数里面判断结果是否小于1.0而赋值不同的字符串。
我在处理这个问题的时候,处理字符串复制刚开始我用了 指针赋值  结果总是打印一个字符串的信息,刚开始没有想到,到处找错(光在这个错误上就花了两到三个小时,汗。。。),最后还是一步一步断点找出来的啊(通过这个问题,我也渐渐发现了取断点很有用啊)。以后复制字符串一定要用strcat()。

虽然是很简单的一个作业题,但是我还是用了十几个小时,不好还好问题总算解决了。
最后还是要谴责下c_free,我搞了这么长的时间都成了乱码,哎。。咋说呢。。。
还好 exe文件在,不过最后还增添的几个功能代码还没实现,界面很丑陋


[ 本帖最后由 ysur 于 2009-8-8 21:42 编辑 ]
QQ截图未命名.jpg

优化大师.rar (18.28 KB)

优化大师

1

评分人数

    • 杨中科: 感谢分享,加油!!!鹏币 + 5

TOP

老师那个控件是否可见那个可见可以这样用减少代码
1.jpg
2009-7-21 22:23

查了下
#define SW_HIDE 0
#define SW_NORMAL 1
那么我这样写
ShowWindow(hwnd,!bVisible);
下面if判断就可以省略去了。老师看看这样可以的吧应该。
1

评分人数

坚持就是胜利~~~~~

TOP

非常支持这种教学方式,感觉学到的东西多,而且也更踏实!:)
文中有一处错误:就是在讲GetDriveType这个函数的示例代码中,default后面少了break;

TOP

先将就发以后在改进吧
TT_QRF)UDYKAAP4OUXS(OB9.jpg

9节.rar (43.64 KB)

TOP

原帖由 wanghepeng10 于 2009-3-22 21:59 发表
先将就发以后在改进吧


非常棒

TOP

问题

打开别人C-Free 的工程代码出现这个是为什么?
1.JPG

TOP

原帖由 wanghepeng10 于 2009-3-23 21:26 发表
打开别人C-Free 的工程代码出现这个是为什么?


看这篇文章:如何运行别人的C-Free工程     http://www.rupeng.com/index.php/viewthread-518

TOP

dongle

原来是这样的问题啊,看懂了,谢谢老师。

TOP

教作业了! 虽然有点晚 。。看了wanghepeng10的多学了2个函数 呵呵~ 得到win目录和得到计算机名字  不能上传图片了。。
#include
#include
#include "main.h"
#include "dialogs.h"
#include "resource.h"
#include "rsrc.inc"

BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
//BEGIN MESSAGE CRACK
HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
//END MESSAGE CRACK
}

return FALSE;
}

////////////////////////////////////////////////////////////////////////////////
// Main_OnInitDialog
BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
// Set app icons
HICON hIcon = LoadIcon((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE) ,MAKEINTRESOURCE(IDI_ICONAPP));
SendMessage(hwnd, WM_SETICON, TRUE, (LPARAM)hIcon);
SendMessage(hwnd, WM_SETICON, FALSE, (LPARAM)hIcon);
SetTimer(hwnd,0,1000,ti);//系统时间
SetTimer(hwnd,1,1000,ti1);//系统启动时间
yonghuming(hwnd);//用户名
SetTimer(hwnd,2,1000,ti2);//内存信息
banben(hwnd); //得到系统版本
name(hwnd); //得到计算机名字
mulu(hwnd); //得到win目录
cipan(hwnd); //得到磁盘信息
return TRUE;
}

////////////////////////////////////////////////////////////////////////////////

void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch(id)
    {
        case IDC_BTN1:
        EndDialog(hwnd, 0);
        break;
        default:break;
    }

}

////////////////////////////////////////////////////////////////////////////////
// Main_OnClose
void Main_OnClose(HWND hwnd)
{
EndDialog(hwnd, 0);
}

/////////////////////////自己定义的函数////////////////////////////////////////////


VOID CALLBACK ti (
HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime) //系统时间
{
SYSTEMTIME time;
TCHAR tim[256];
GetLocalTime(&time);
wsprintf(tim,TEXT("%04d年%02d月%02d日%02d时%02d分%02d秒"),time.wYear,time.wMonth,time.wDay,time.wHour,time.wMinute,time.wSecond);
SetDlgItemText(hwnd,IDC_EDT5,tim);
}
VOID CALLBACK ti1(HWND hwnd,UINT message,UINT iTimerID,DWORD dwTime) //系统启动时间
{
DWORD l1=GetTickCount();
TCHAR s1[256];
DWORD l2,l4,l3;
l2=l1/3600000;
l3=(l1-l2*3600000)/60000;
l4=(l1-l2*3600000-l3*60000)/1000;
wsprintf(s1,TEXT("%d小时%d分%d秒"),l2,l3,l4);
SetDlgItemText(hwnd,IDC_EDT6,s1);
}
VOID yonghuming(HWND hwnd) //用户名
{
TCHAR s2[256];
DWORD l5=sizeof(s2)/sizeof(TCHAR);
ZeroMemory(s2,256);
GetUserName(s2,&l5);
SetDlgItemText(hwnd,IDC_EDT1,s2);
}

VOID CALLBACK ti2 (HWND hwnd,UINT message,UINT iTimeID,DWORD cwTime) //内存信息
{
MEMORYSTATUS s3;
TCHAR s4[512];
ZeroMemory(s4,512);
GlobalMemoryStatus(&s3);
wsprintf(s4,TEXT("%uMB"),s3.dwTotalPhys/1048576);//总物理内存
SetDlgItemText(hwnd,IDC_EDT7,s4);
wsprintf(s4,TEXT("%uMB"),s3.dwAvailPhys/1048576);//可用物理内存
SetDlgItemText(hwnd,IDC_EDT8,s4);
wsprintf(s4,TEXT("%u%%"),s3.dwMemoryLoad); //内存使用率
SetDlgItemText(hwnd,IDC_EDT9,s4);
wsprintf(s4,TEXT("%uMB"),s3.dwTotalVirtual/1048576);//虚拟内存大小
SetDlgItemText(hwnd,IDC_EDT10,s4) ;
wsprintf(s4,TEXT("%uMB"),s3.dwTotalPageFile/1048576);//总页面文件
SetDlgItemText(hwnd,IDC_EDT12,s4);
wsprintf(s4,TEXT("%uMB"),s3.dwAvailVirtual/1048576);//可用虚拟内存
SetDlgItemText(hwnd,IDC_EDT11,s4);
wsprintf(s4,TEXT("%uMB"),s3.dwAvailPageFile/1048576); //可用页面
SetDlgItemText(hwnd,IDC_EDT13,s4);
}
VOID banben(HWND hwnd) //得到系统版本
{
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;
}
SetDlgItemText(hwnd,IDC_EDT3,strOSVersion);
}

VOID name(HWND hwnd) //计算机名字
{
TCHAR s6[256];
DWORD l8=256;
ZeroMemory(s6,256);
GetComputerName(s6,&l8);
SetDlgItemText(hwnd,IDC_EDT2,s6);
}
VOID mulu(HWND hwnd) //win目录
{
TCHAR s7[256];
GetWindowsDirectory(s7,sizeof(s7));
SetDlgItemText(hwnd,IDC_EDT4,s7);
}
VOID cipan(HWND hwnd) //磁盘信息
{
DWORD i=GetLogicalDrives();
int j=0;
while(i!=0)
{
if((i&1)==1)
{
TCHAR s_1[256];
TCHAR s_2[256];
ZeroMemory(s_1,256);
s_1[0]=65+j;
s_1[1]=58;
s_1[2]='\0';
UINT t=GetDriveType(s_1);
switch(t)
{
case DRIVE_UNKNOWN:
wsprintf(s_2,TEXT("%s未知磁盘类型"),s_1);
break;
case DRIVE_NO_ROOT_DIR:
wsprintf(s_2,TEXT("%s磁盘名无效"),s_1);
break;

case DRIVE_REMOVABLE:
wsprintf(s_2,TEXT("%s可移动磁盘"),s_1);
break;

case DRIVE_FIXED:
wsprintf(s_2,TEXT("%s固定磁盘"),s_1);
break;

case DRIVE_REMOTE:
wsprintf(s_2,TEXT("%s网络磁盘"),s_1);
break;

case DRIVE_CDROM:
wsprintf(s_2,TEXT("%s光驱动器"),s_1);
break;

case DRIVE_RAMDISK:
wsprintf(s_2,TEXT("%sRAM"),s_1);
break;
default:
wsprintf(s_2,TEXT("%s :"),s_1);
break;
}
ULARGE_INTEGER a1;
ULARGE_INTEGER a2;
ULARGE_INTEGER a3;

TCHAR s_3[256];
if(GetDiskFreeSpaceEx(s_1,&a1,&a2,&a3))
{
wsprintf(s_3,TEXT("%s:%I64dMB:%I64dMB"),s_2,a2.QuadPart/1048576,a3.QuadPart/1048576);
}
else
{
wsprintf(s_3,TEXT("%s:"),s_2);
}
HWND hwnd1 = GetDlgItem(hwnd,IDC_LST1);
SendMessage(hwnd1,LB_ADDSTRING,0,(LPARAM)s_3);
}
j++;
i=i>>1;
}


}

TOP

未命名.jpg
2009-6-30 10:10

GlobalMemoryStatus这个函数不能显示2G以上的内存...

9.rar (62.13 KB)

TOP

学习一下。。

TOP

控件显示隐藏和vs2005差别比较大,写出来以备参考:
IsWindowEnabled()const;没入口参数怎么办?

void CcheckDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
//可用状态
CWnd *pWnd = GetDlgItem(IDC_CHECK1);
if (pWnd->IsWindowEnabled())
{
  pWnd->EnableWindow(FALSE);
}
else
{
  pWnd->EnableWindow(TRUE);
}

}
void CcheckDlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
//可见状态
CWnd *pWnd = GetDlgItem(IDC_CHECK1);
if (pWnd->IsWindowVisible())
{
  pWnd->ShowWindow(SW_HIDE);
}
else
{
  pWnd->ShowWindow(SW_SHOW);
}
}

TOP

原帖由 soullife 于 2009-7-9 13:47 发表
控件显示隐藏和vs2005差别比较大,写出来以备参考:
IsWindowEnabled()const;没入口参数怎么办?

void CcheckDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
//可用状态
CWnd *pW ...


你的是MFC的用法,不是VS2005和VC6的区别。

TOP

原帖由 杨中科 于 2009-7-9 22:12 发表


你的是MFC的用法,不是VS2005和VC6的区别。


哦,谢谢老师,以前都用VC6,这2天要跟个老师做项目才换的vs2005,我觉得2005和vc6区别还是蛮多的,2005更趋向标准C/C++了,不过正如老师所说一通百通,哈哈,其实工具就是工具,难道在水库里都能游泳,在游泳池里还会被淹死么。。顶杨老师!!

TOP

交作业 好不容易完成了

里面
11.jpg
2009-7-23 11:00

我这里
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
  
switch(id)
{
  case IDC_BTNEXIT:
  {
   int r = MessageBox(hwnd,TEXT("真的要退出吗?"),TEXT("提示"),MB_OKCANCEL|MB_ICONQUESTION|MB_DEFBUTTON2);
   if(r = IDOK)
   {
       Main_OnClose(hwnd);
   }
  }
  break;
  case IDC_BTN1:
  {
   MessageBox(hwnd,TEXT("阿辉制作\n优化大师V1.0版\n日期:2009-7-23"),TEXT("关于"),MB_OK);
  }
  break;
  case IDC_BTN2:
  {
   ShellExecute(hwnd,TEXT("open"),TEXT("http://www.rupeng.com/index.php/4094"),NULL,NULL,SW_SHOWNORMAL);
  }
  break;
  case IDC_BTN3:
  {
   ShellExecute(hwnd,TEXT("open"),TEXT("http://www.rupeng.com"),NULL,NULL,SW_SHOWNORMAL);
  }
  break;
  default:
  {
         MessageBox(hwnd,TEXT("1"),"",0);
   
  }
  break;
  
}
}
这里很奇怪  我还没点按钮他就运行default这里了
老师麻烦看看,谢谢~~
想不通一直
main.cpp上传了 工程太大上传不了
main.rar (3.18 KB)
坚持就是胜利~~~~~

TOP

上面问题已经解决。
坚持就是胜利~~~~~

TOP

LS的哥们 你的 打开程序 就 打开IE 是怎么实现的?

TOP

ShellExecute函数,下面是百度百科的地址请自己查阅详细资料 http://baike.baidu.com/view/1044533.htm

TOP

关键在掌握磁盘信息的这几个API?

TOP

#include <windows.h>
#include <windowsx.h>
#include "main.h"
#include "dialogs.h"
#include "resource.h"
#include "rsrc.inc"
BOOL WINAPI Main_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        //BEGIN MESSAGE CRACK
        HANDLE_MSG(hwnd, WM_INITDIALOG, Main_OnInitDialog);
        HANDLE_MSG(hwnd, WM_COMMAND, Main_OnCommand);
        HANDLE_MSG(hwnd,WM_CLOSE, Main_OnClose);
        //END MESSAGE CRACK
    }
    return FALSE;
}
////////////////////////////////////////////////////////////////////////////////
//  Main_OnInitDialog
BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
    // Set app icons
    HICON hIcon = LoadIcon((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE) ,MAKEINTRESOURCE(IDI_ICONAPP));
    SendMessage(hwnd, WM_SETICON, TRUE,  (LPARAM)hIcon);
    SendMessage(hwnd, WM_SETICON, FALSE, (LPARAM)hIcon);
    GetWVersion(hwnd);
    GetWUserName(hwnd);
    GetWRunTime(hwnd);
   
    GetWPMemTotle(hwnd);
   
    GetAllDiskInfo(hwnd);
    //
    // Add initializing code here
    //
   
    return TRUE;
}
VOID     GetWVersion(HWND hwnd)
{
OSVERSIONINFO oVsi;
TCHAR cRe[256];
ZeroMemory(&oVsi,sizeof(oVsi));
oVsi.dwOSVersionInfoSize=sizeof(oVsi);
GetVersionEx(&oVsi);



switch(oVsi.dwPlatformId)
{
  case VER_PLATFORM_WIN32_WINDOWS:
  strcpy(cRe,("不会吧,还在用98!"));
  break;
  case VER_PLATFORM_WIN32_NT:
  if(oVsi.dwMajorVersion==3&&oVsi.dwMinorVersion==51)
  strcpy(cRe,("WINDOWS NT 3.51"));
  else if(oVsi.dwMajorVersion==3&&oVsi.dwMinorVersion==0)
  strcpy(cRe,("WINDOWS CE 3.0"));
  else if(oVsi.dwMajorVersion==4&&oVsi.dwMinorVersion==0)
  strcpy(cRe,("WINDOWS NT 4.0"));
  else if(oVsi.dwMajorVersion==5&&oVsi.dwMinorVersion==0)
  strcpy(cRe,("WINDOWS 2000"));
  else if(oVsi.dwMajorVersion==5&&oVsi.dwMinorVersion==1)
  strcpy(cRe,("WINDOWS XP"));  
  break;
  default:
  break;
}

  
  SetDlgItemText(hwnd,IDC_EDTVERSION,cRe);
/* typedef struct _OSVERSIONINFOW {
DWORD dwOSVersionInfoSize;
DWORD dwMajorVersion;
DWORD dwMinorVersion;
DWORD dwBuildNumber;
DWORD dwPlatformId;
WCHAR szCSDVersion[128];*/
}
VOID     GetWUserName(HWND hwnd)
{
TCHAR cUserName[256];
DWORD dSize=sizeof(cUserName)/sizeof(TCHAR);
GetUserName(cUserName,&dSize);
SetDlgItemText(hwnd,IDC_EDTUSERNAME,cUserName);
}
VOID     GetWRunTime(HWND hwnd)
{
TCHAR cRe[256];
ZeroMemory(cRe,256);
TCHAR cTemp[256];

DWORD dDay;
DWORD dHour;
DWORD dMinute;
DWORD dSecond;
DWORD dRunTime=GetTickCount()/1000;
dDay=dRunTime/86400;
dHour=dRunTime%86400/3600;
dMinute=dRunTime%86400%3600/60;
dSecond=dRunTime%60;
if(dDay)
{
  itoa(dDay,cTemp,10);
  strcat(cRe,cTemp);
  strcat(cRe,"天");
}
if(dHour)
{
  itoa(dHour,cTemp,10);
  strcat(cRe,cTemp);
  strcat(cRe,"小时");
}
if(dMinute)
{
  itoa(dMinute,cTemp,10);
  strcat(cRe,cTemp);
  strcat(cRe,"分钟");
}
itoa(dSecond,cTemp,10);
  strcat(cRe,cTemp);
  strcat(cRe,"秒");

SetDlgItemText(hwnd,IDC_EDTRUNTIME,cRe);


}
   
VOID     GetWPMemTotle(HWND hwnd)
{
MEMORYSTATUS mStatus;
mStatus.dwLength=sizeof(mStatus);
TCHAR cRe[256];
DWORD dMemtotal;
ZeroMemory(cRe,256);

GlobalMemoryStatus(&mStatus);
dMemtotal=mStatus.dwTotalPhys/(1024*1024);

wsprintf(cRe,TEXT("%d"),dMemtotal);
strcat(cRe," M");
SetDlgItemText(hwnd,IDC_EDTPMEMTOTLE,cRe);
wsprintf(cRe,TEXT("%d"),mStatus.dwMemoryLoad);
strcat(cRe," %");
SetDlgItemText(hwnd,IDC_EDTPMEMLOAD,cRe);

dMemtotal=mStatus.dwTotalPageFile/(1024*1024);
wsprintf(cRe,TEXT("%d"),dMemtotal);
strcat(cRe," M");
SetDlgItemText(hwnd,IDC_EDTVMENTOTLE,cRe);
dMemtotal=(mStatus.dwTotalPageFile-mStatus.dwAvailPageFile)/(1024*1024);
wsprintf(cRe,TEXT("%d"),dMemtotal);
strcat(cRe," M");
SetDlgItemText(hwnd,IDC_EDTVMENLOAD,cRe);

}

VOID GetAllDiskInfo(HWND hwnd)
{
//获取磁盘列表,然后每取得一个就调用一次GetDiskInfo()函数,传递给它一个
//字符串数组和要获取信息的盘符字串,然后将这个数组打印到IDC_EDTDISKINFO控件.
TCHAR cRes[256];
int i,y=0;
DWORD dDriveList = GetLogicalDrives();
//取得所有磁盘列表
TCHAR cDiskList[32];
TCHAR cDiskName[32];
itoa(dDriveList,cDiskList,2);
strrev(cDiskList);
for(i=0;i<sizeof(cDiskList);i++)
{
  if(cDiskList=='1')
  {
   ZeroMemory(cDiskName,32);
   
   cDiskName[y]=i+'A';
   strcat(cDiskName,":");
   GetDiskInfo(cRes,cDiskName);
  }
  else
  {
   ZeroMemory(cDiskName,32);
  }
}


SetDlgItemText(hwnd,IDC_EDTDISKINFO,cRes);
}
VOID GetDiskInfo(TCHAR cRe[],TCHAR cDiskName[])
{
strcat(cRe,"  ");
strcat(cRe,cDiskName);
ULARGE_INTEGER  nTotalBytes;
ULARGE_INTEGER  nFreeBytes;
ULARGE_INTEGER  nUFreeBytes;
TCHAR cTemp[256];

UINT uType = GetDriveType(cDiskName);               
         switch (uType)
         {
         case DRIVE_UNKNOWN:
                   strcat(cRe,TEXT("              \t未知磁盘类型"));
                   break;         
         case DRIVE_NO_ROOT_DIR:
                   strcat(cRe,TEXT("              磁盘名无效"));
                   break;
         case DRIVE_REMOVABLE:
                   strcat(cRe,TEXT("              可移动磁盘"));
                   break;
         case DRIVE_FIXED:
                   strcat(cRe,TEXT("                   固定磁盘"));
                   break;
         case DRIVE_REMOTE:
                   strcat(cRe,TEXT("              \t网络磁盘"));
                   break;
         case DRIVE_CDROM:
                   strcat(cRe,TEXT("              \t光驱"));
                   break;
         case DRIVE_RAMDISK:
                   strcat(cRe,TEXT("              \tRAM磁盘"));
                   break;
         default:
                   MessageBox(NULL,TEXT("GetDriveType的返回值非法"),"",MB_OK);
         }
         if(GetDiskFreeSpaceEx(cDiskName,&nTotalBytes,&nFreeBytes,&nUFreeBytes))
         {
          wsprintf(cTemp,TEXT("          %I64d M          %I64d M"),nFreeBytes.QuadPart/(1024*1024),
          nUFreeBytes.QuadPart/(1024*1024));
          strcat(cRe,cTemp);
          strcat(cRe,"\t");
         }
         
}


////////////////////////////////////////////////////////////////////////////////
//  Main_OnCommand
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch(id)
    {
        case IDC_BTNREBRUSH:
            
            
        break;
        case IDC_BTNQUIT:
            EndDialog(hwnd, id);
        break;
        default:break;
    }
}
////////////////////////////////////////////////////////////////////////////////
//  Main_OnClose
void Main_OnClose(HWND hwnd)
{
    EndDialog(hwnd, 0);
}

运行结果:其它部分正确,磁盘信息那里偶尔多出一行R盘,类型错误.




  C:                   固定磁盘          6212 M          3456 M  
D:                   固定磁盘          127366 M          10721 M  
E:                   固定磁盘          19045 M          1487 M
  R:              磁盘名无效
另一个就是在WINDOWS2003系统上运行显示错误.

还有就是对齐那里,都是用空格或者是'\t'弄的感觉很不整齐,有没有方法弄得整齐点.


对了,想请教下杨老师,有没有办法把这个刷新系统信息的功能添加进去.呵呵.谢谢..


[ 本帖最后由 huhaiand 于 2009-9-20 22:54 编辑 ]
未命名.jpg

wininfo2.rar (10.62 KB)

TOP

看前八课,都是需要两倍于课程的时间去实践。这节课更加了。
要更努力才行。
退一步海阔天空。

TOP

弄了2个上午 终于弄好了 磁盘信息那块费了很多时间 弄的我都要疯了。。。。

4个光驱在不读碟的时候也会显示大小。读了碟片的话 没读碟片的光驱会显示有碟片的最后一个光驱的大小。
不知道是不是我有3个虚拟光驱的原因。。。

源工程文件在附件里面
未命名.jpg

winEX.rar (29.91 KB)

TOP

菜鸟来报个道。。。。。

TOP

看过这个视频很久了,终于有时间吧作业做了。
内存和时间都是动态显示的。
未命名.JPG
2010-1-1 17:33

TOP

学习了,呵呵。
Now!Acting!

TOP

yy.jpg
2010-1-19 18:09
虽然没楼上N位同学做得好,但是我还是要交下作业
顺便问下,为什么那个wsprint函数不能将浮点数打印到缓冲区,每次打印都得出一个f

windows优化大师1.0.rar (463.56 KB)

TOP

顺便问下,为什么那个wsprint函数不能将浮点数打印到缓冲区,每次打印都得出一个f


wsprintf()不支持浮点数的,可以用sprintf()。我开始用wsprintf()也是那样,后来查MSDN才看到没有对浮点数进行操作的说明!

TOP

优化大师的界面中的“叶面文件”应该为“页面文件”

TOP

返回列表