新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论高级C/C++编程、代码重构(Refactoring)、极限编程(XP)、泛型编程等话题
    [返回] 计算机科学论坛计算机技术与应用『 C/C++编程思想 』 → 用Visual C++编写完整的屏幕保护程序 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 5900 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 用Visual C++编写完整的屏幕保护程序 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 C/C++编程思想 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 用Visual C++编写完整的屏幕保护程序

    屏幕保护程序是一个Win32应用程序,与一般的Win32应用程序不同之处在于:1、扩展名要求为 SCR ;2、命令行要有一定的格式,以便操作系统向其传递信息,如 运行模式,父窗口句柄(Handle to Parent Window)等 ;3、其他一些消息相应方面的要求。本文将首先介绍屏幕保护程序的命令行格式及实现的方法,然后介绍各个相应函数,并通过Window主函数WinMin()勾画出屏幕保护程序的主框架,最后介绍编译步骤和注意事项

      屏幕保护程序的命令行格式 :文件名 \ [运行模式] \[窗口句柄]。

      其中运行模式有五种选择:

      1. “运行模式”= ‘c’ 或 ‘C ’, 句柄为一串数字, 或文件名后没有任何参数。

      屏保程序设置方式,Window 显示属性_屏幕保护程序_设置按钮调用,数字为调用函数的窗口句柄(Handle to Parent Window)(十进制),如果没有数字,句柄为NULL。

      2. “运行模式”=‘t’或‘T’。

      测试方式,忽略句柄数字。

      3. “运行模式”=‘p’或‘P’。

      预览方式,Window 显示属性_屏幕保护程序_预览按钮调用,句柄为调用函数的窗口句柄。

      4. “运行模式”=‘a’或‘A’。

      密码设置方式, Window 显示属性_屏幕保护程序_密码保护_更改按钮调用。句柄为调用函数的Window 句柄。

      5. 其它(通常“运行模式”=‘s’)

      屏幕保护程序正常运行模式。

      因此,编写屏幕保护程序的首要任务是过滤命令行,提取对应的系统调用方式和其他信息,本文用自定义函数ParseCommandline( )实现:

    //用enum定义五种调用方式:
    enum SaverMode
    {
     sm_config,
     sm_preview,
     sm_full,
     sm_test,
     sm_passwordchange
    };

    //命令行过滤函数,命令行获得函数是用API GetCommandLine( )。
    SaverMode ParseCommandLine( TCHAR* pstrCommandLine )
    {
     g_hWndParent = NULL; //全局变量(global varibale) 在头函数或主文件开始处定义。

     // 跳过长文件名中的路径和空格。
     if (*pstrCommandLine == TEXT('\"'))
     {
      pstrCommandLine++;
      while (*pstrCommandLine != TEXT('\0') && *pstrCommandLine != TEXT('\"'))
       pstrCommandLine++;
       If( *pstrCommandLine == TEXT('\"') )
        pstrCommandLine++;
     }
     else
     {
      while (*pstrCommandLine != TEXT('\0') && *pstrCommandLine != TEXT(' '))
       pstrCommandLine++;
       if( *pstrCommandLine == TEXT(' ') )
        pstrCommandLine++;
     }

     // 跳过"/" 或 "-"
     while ( *pstrCommandLine != TEXT('\0') && *pstrCommandLine != TEXT('/') && *pstrCommandLine != TEXT('-') )
      pstrCommandLine++;

     // 如果没有任何参数,为设置模式。
     if ( *pstrCommandLine == TEXT('\0') )
      return sm_config;

     // 如果有参数,查看参数内容。
     switch ( *(++pstrCommandLine) )
     {
      case 'c':
      case 'C':
       pstrCommandLine++;
       while ( *pstrCommandLine && !isdigit(*pstrCommandLine) )
        pstrCommandLine++;
       if ( isdigit(*pstrCommandLine) )
       {
        #ifdef _WIN64 //考虑64位编译情况。
         CHAR strCommandLine[2048];
         DXUtil_ConvertGenericStringToAnsiCb( strCommandLine, pstrCommandLine, sizeof(strCommandLine));
         //该函数仅在64位编译情况下使用。
         g_hWndParent = (HWND)(_atoi64(strCommandLine));
        #else
         g_hWndParent = (HWND)LongToHandle(_ttol(pstrCommandLine)); //数字串变为        /Window句柄
        #endif
       }
      else
      {
       g_hWndParent = NULL;
     }
     return sm_config;

     case 't':
     case 'T':
      return sm_test;

     case 'p':
     case 'P':
      //预览模式,后面有Window句柄,为十进制数字
      pstrCommandLine++;
      while ( *pstrCommandLine && !isdigit(*pstrCommandLine) )
       pstrCommandLine++;
      if ( isdigit(*pstrCommandLine) )
      {
       #ifdef _WIN64
        CHAR strCommandLine[2048];
        DXUtil_ConvertGenericStringToAnsiCb(strCommandLine, pstrCommandLine,   sizeof(strCommandLine));
        g_hWndParent = (HWND)(_atoi64(strCommandLine));
       #else
        g_hWndParent = (HWND)LongToHandle(_ttol(pstrCommandLine));
       #endif
      }
      return sm_preview;

      case 'a':
      case 'A':
       //密码设置模式,后面有Window句柄,为十进制数字
       pstrCommandLine++;
       while ( *pstrCommandLine && !isdigit(*pstrCommandLine) )
        pstrCommandLine++;
       if ( isdigit(*pstrCommandLine) )
       {
        #ifdef _WIN64
         CHAR strCommandLine[2048];
         DXUtil_ConvertGenericStringToAnsiCb(strCommandLine, pstrCommandLine,   sizeof(strCommandLine));
         g_hWndParent = (HWND)(_atoi64(strCommandLine));
        #else
         g_hWndParent = (HWND)LongToHandle(_ttol(pstrCommandLine));
        #endif
       }
       return sm_passwordchange;

      default:
       //其他选项,屏保实际运行模式(通常/s)
       return sm_full;
     }
    }
    ///////////////////////

      ParseCommandLine( ) 返回后,程序根据不同的返回值进行响应:

      返回值=sm_preview或者sm_test 或者sm_full:

      程序根据返回的运行模式和Window句柄使用CreateWindow函数创建窗口(Window)并返回指向该窗口的句柄。这部分功能包含在自定义的CreateSaverWindow()函数中。在sm_preview情况下,程序用消息循环的方式等待500ms使操作系统的控制面板有足够的时间初始化。然后,读注册表检查屏保是否设定了密码,如果是,在Win9x情况下,用LoadLibrary()和GetProcessAdress()函数从动态链接库(DLL)中获得密码验证函数指针供程序退出时使用,密码验证函数类型为BOOL PASCAL (HWND)。这部分功能包含在自定义函数InitSaver()中。

      以上窗口创建使用同一个窗口类(Window Class(WNDCLASS)),当然也是同一个消息响应函数(Window’s Procedure)。最后显示窗口,开始消息循环。

      返回值=sm_passwordchange:

      用LoadLibrary()和 GetProcessAdress()API获得密码设置函数指针,密码设置函数类型为:DOWORD PASCAL ( LPCSTR, HWND, DWORD, LPVOID ),然后调用该函数进行密码更改。

      返回值=sm_config

      显示一个对话框(Dialog),获取用户信息,在程序中进行相应的更改。


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/9/13 11:01:00
     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 C/C++编程思想 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客2
    发贴心情 
    屏幕保护程序的退出机制反映在程序的消息响应函数(Window’s Procedure)中,当按下键盘上任何一个健或者鼠标移动计数超过5次(防止桌面振动等因素导致的鼠标移动),程序进入退出机制,在sm_test或者sm--_full情况下查看屏幕保护程序是否设置密码,如果是,验证密码,正确,程序退出,错误,程序继续。当程序验证密码时,通过全局变量g_bCheckingSaverPassword告诉消息响应函数对屏幕刷新,以保证密码的输入。其他情况(sm_config, sm_preview)不用验证密码直接退出。这些功能包括在自定义的函数InterruptSaver( )和ShutdownSaver( )中。

      上述各个函数的详细代码如下:

      1、 CreateSaverWindow 函数:

    HWND CreateSaverWindow(SaverMode mode, HWND hWndParent,HINSTANCE hInstance)
    {
     HWND hWnd;
     RECT rc;
     DWORD dwStyle;

     hWnd=NULL;

     switch ( mode )
     {
      case sm_preview:
       GetClientRect(hWndParent, &rc );
       dwStyle = WS_VISIBLE | WS_CHILD;
       AdjustWindowRect( &rc, dwStyle, FALSE );
       hWnd = CreateWindow( TEXT("SaverWndClass"), TEXT("SaverWindow"), dwStyle,
    rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top,
    hWndParent, NULL, hInstance, NULL);
       break;

      case sm_test:
       rc.left = rc.top = 50;
       rc.right = rc.left+600;
       rc.bottom = rc.top+400;
       dwStyle = WS_VISIBLE | WS_OVERLAPPED | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU;
       AdjustWindowRect( &rc, dwStyle, FALSE );
       hWnd = CreateWindow( TEXT("SaverWndClass"), TEXT("SaverWindow"), dwStyle,
    rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top,
       NULL, NULL, hInstance, NULL);
       break;

      case sm_full:
       rc.left=rc.top=0;
       rc.bottom=GetSystemMetrics(SM_CYSCREEN);
       rc.right=GetSystemMetrics(SM_CXSCREEN);
       dwStyle = WS_VISIBLE | WS_POPUP;

       hWnd = CreateWindowEx( WS_EX_TOPMOST, TEXT("SaverWndClass"),
       TEXT("SaverWindow"), dwStyle, rc.left, rc.top, rc.right - rc.left,
    rc.bottom - rc.top, NULL, NULL, hInstance, NULL);

      }
      if(mode == sm_preview )
      {
       // 开始预览时,进入一个短暂的循环以使系统显示控制面板有足够的时间初始化
       g_bWaitForInputIdle = TRUE;
       // 开始循环
       PostMessage( g_hWnd, WM_USER, 0, 0 );

       MSG msg;

       while( g_bWaitForInputIdle )
       {
        // 如果If 返回 FALSE, 结束循环
        if( !GetMessage( &msg, g_hWnd, 0, 0 ) )
        {
         // 结束循环
         PostQuitMessage(0);
         break;
        }

        TranslateMessage( &msg);
        DispatchMessage( &msg);
       }
      }
      return hWnd;
     }

      2、 Window消息响应函数:

    LRESULT CALLBACK SaverProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
    {
     switch ( uMsg )
     {
      case WM_USER:
       //预览开始循环,500ms空闲时间用于控制面板的初始化。
       SetTimer( hWnd, 1, 500, NULL );
       break;
      case WM_TIMER:
       // 500ms时间到,预览循环结束。
       g_bWaitForInputIdle = FALSE;
       KillTimer( hWnd, 1 );
       break;

      case WM_DESTROY:
       ShutdownSaver();
       break;

      case WM_SETCURSOR:
       if ( g_SaverMode == sm_full && !g_bCheckingSaverPassword )
       {
        //隐藏鼠标指针
        SetCursor( NULL );
        return TRUE;
       }
       break;

      case WM_PAINT:
      {
       PAINTSTRUCT ps;
       BeginPaint( hWnd, &ps );

       RECT rc;
       GetClientRect(hWnd,&rc);
       FillRect(ps.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH) ); //黑屏

       EndPaint( hWnd, &ps );
       return 0;
      }

      case WM_ERASEBKGND:
       // 输入密码时对屏幕刷新
       if( !g_bCheckingSaverPassword )
        return TRUE;
       break;

      case WM_MOUSEMOVE:
       if( g_SaverMode != sm_test )
       {
        static INT xPrev = -1;
        static INT yPrev = -1;
        INT xCur = GET_X_LPARAM(lParam);
        INT yCur = GET_Y_LPARAM(lParam);
        if( xCur != xPrev || yCur != yPrev )
        {
         xPrev = xCur;
         yPrev = yCur;
         g_dwSaverMouseMoveCount++;
         if ( g_dwSaverMouseMoveCount > 5 )
          InterruptSaver();
        }
       }
       break;

      case WM_KEYDOWN:
      case WM_LBUTTONDOWN:
      case WM_RBUTTONDOWN:
      case WM_MBUTTONDOWN:
       if( g_SaverMode != sm_test )
        InterruptSaver();
        break;

      case WM_ACTIVATEAPP:
       if( wParam == FALSE && g_SaverMode != sm_test )
        InterruptSaver();
       break;

      case WM_POWERBROADCAST:
       if( wParam == PBT_APMSUSPEND && g_VerifySaverPassword == NULL )
        InterruptSaver();
       break;

      case WM_SYSCOMMAND:
       if ( g_SaverMode == sm_full )
       {
        switch ( wParam )
        {
         case SC_NEXTWINDOW:
         case SC_PREVWINDOW:
         case SC_SCREENSAVE:
         case SC_CLOSE:
         return FALSE;
        };
       }
       break;
      }

      return DefWindowProc( hWnd, uMsg, wParam, lParam );
     }

      3、 ChangePassword()函数

    VOID ChangePassword()
    {
     // 载入密码更改函数动态链接库(Dynamic Linked Library)
     HINSTANCE mpr = LoadLibrary( TEXT("MPR.DLL") );

     if ( mpr != NULL )
     {
      // 从动态链接数据库中提取密码设置函数
      typedef DWORD (PASCAL *PWCHGPROC)( LPCSTR, HWND, DWORD, LPVOID );
      PWCHGPROC pwd = (PWCHGPROC)GetProcAddress( mpr, "PwdChangePasswordA" );

      //运行密码设置函数
      if ( pwd != NULL )
       pwd( "SCRSAVE", g_hWndParent, 0, NULL );

       //释放动态链接库
      FreeLibrary( mpr );
     }
    }

    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/9/13 11:02:00
     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 C/C++编程思想 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客3
    发贴心情 
    4、 InitSaver()函数

    VOID InitSaver()
    {
     //检查操作系统版本
     OSVERSIONINFO osvi;
     osvi.dwOSVersionInfoSize = sizeof(osvi);
     GetVersionEx( &osvi );
     g_bIs9x = (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS);

     // 在运行模式下,如果操作系统是win9x,需要载入密码验证动态链接库。
     if ( g_SaverMode == sm_full && g_bIs9x )
     {
      // 检查注册表查看屏保是否设定了密码
      HKEY hKey;
      if ( RegCreateKeyEx( HKEY_CURRENT_USER, REGSTR_PATH_SCREENSAVE, 0, NULL, 0,  KEY_READ, NULL, &hKey, NULL ) == ERROR_SUCCESS )
      {
       DWORD dwVal;
       DWORD dwSize = sizeof(dwVal);

       if ( (RegQueryValueEx( hKey, REGSTR_VALUE_USESCRPASSWORD, NULL, NULL,
    (BYTE *)&dwVal, &dwSize ) == ERROR_SUCCESS) && dwVal )
       {
        g_hPasswordDLL = LoadLibrary( TEXT("PASSWORD.CPL") );
        if ( g_hPasswordDLL )
         g_VerifySaverPassword= (VERIFYPWDPROC)GetProcAddress( g_hPasswordDLL, "VerifyScreenSavePwd" );
         RegCloseKey( hKey );
       }
      }
     }

     if ( g_SaverMode == sm_full )
     {
      BOOL bUnused;
      SystemParametersInfo( SPI_SCREENSAVERRUNNING, TRUE, &bUnused, 0 ); //通知操作系统屏幕保护程序开始运行。
     }
    }

      5、屏保退出函数ShutdownSaver( )和InteruptSaver( ):

    VOID ShutdownSaver()
    {
     // 通知操作系统屏幕保护程序退出
     if ( g_SaverMode == sm_full )
     {
      BOOL bUnused;
      SystemParametersInfo( SPI_SCREENSAVERRUNNING, FALSE, &bUnused, 0 );
     }

     if ( g_hPasswordDLL != NULL )
     {
      FreeLibrary( g_hPasswordDLL );
      g_hPasswordDLL = NULL;
     }

      PostQuitMessage( 0 );
    }
    /////////////////////////////////
    VOID InterruptSaver()
    {
     BOOL bPasswordOkay = FALSE;
     if( g_SaverMode == sm_test ||g_SaverMode == sm_full&&!g_bCheckingSaverPassword )
     {
      if( g_bIs9x && g_SaverMode == sm_full )
      {
       // Win9x下如果g_VerifySaverPassword==NULL,则没有设屏保密码。
       if ( g_VerifySaverPassword != NULL )
       {
        g_bCheckingSaverPassword = TRUE;//告诉消息响应函数正在验证密码
        bPasswordOkay = g_VerifySaverPassword( g_hWnd );
        g_bCheckingSaverPassword = FALSE; //密码验证结束。
        if ( !bPasswordOkay )
        {
         //屏保程序继续运行…
         SetCursor( NULL );
         g_dwSaverMouseMoveCount = 0;
         return;
        }
       }
      }
      ShutdownSaver();
     }
    }

      屏保设置方式下的响应程序为自定义Doconfig( ),因篇幅的关系不再详细介绍,读者应当很容易自己加上,也可以定义为空函数:VOID Doconfig ( ) { return;}。

      黑屏屏幕保护程序主入口函数如下:

    #include <windows.h>
    #include <windowsx.h>
    #include <tchar.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <regstr.h>
    #include "Saver.h"
    #include "resource.h"

    HINSTANCE g_hinstance;
    HWND g_hWndParent;
    BOOL g_bWaitForInputIdle;
    HWND g_hWnd;


    LRESULT CALLBACK SaverProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );

    int APIENTRY WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow)
    {
     // TODO: Place code here.
     MSG msg;
     g_bCheckingSaverPassword = FALSE;
     g_bIs9x = FALSE;
     g_dwSaverMouseMoveCount = 0;
     g_hWndParent = NULL;
     g_hPasswordDLL = NULL;
     g_hWnd = NULL;
     g_VerifySaverPassword = NULL;
     g_hinstance=hInstance;

     WNDCLASS cls;
     cls.hCursor = LoadCursor( NULL, IDC_ARROW );
     cls.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE(IDI_MAIN_ICON) );
     cls.lpszMenuName = NULL;
     cls.lpszClassName = TEXT("SaverWndClass");
     cls.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);
     cls.hInstance = hInstance;
     cls.style = CS_VREDRAW|CS_HREDRAW;
     cls.lpfnWndProc = SaverProc;
     cls.cbWndExtra = 0;
     cls.cbClsExtra = 0;

     if(!RegisterClass( &cls ))
      MessageBox(NULL,TEXT("Cant register window class"),TEXT("SaverWndClass"),MB_ICONERROR);

     SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_IDLE );
     TCHAR* pstrCmdLine = GetCommandLine();
     g_SaverMode = ParseCommandLine(pstrCmdLine);

     switch(g_SaverMode)
     {
      case sm_preview:
      case sm_full:
      case sm_test:
      g_hWnd=CreateSaverWindow(g_SaverMode,g_hWndParent,hInstance);
      if ( g_hWnd == NULL )
      {
       MessageBox(NULL,TEXT("Can't Create Window"), TEXT("Create Window Terminated"),MB_ICONERROR);
       return 0;
      }else
      {
       ShowWindow(g_hWnd,nCmdShow);
       UpdateWindow(g_hWnd);
      }
      InitSaver();
      while(GetMessage(&msg,NULL,0,0))
      {
       TranslateMessage(&msg);
       DispatchMessage(&msg);
      }
      break;
     case sm_config:
      Doconfig();
      break;
     case sm_passwordchange:
      ChangePassword();
      break;
     }
     return 0;
    }

      至此,黑屏屏幕保护程序代码编写完成,下一步是输入VC++6.0 并进行编译,具体步骤如下:

      1、 打开VC++ 6.0, 从文件菜单中选择 New, 选中工程(Project)窗口,从窗口中选中Win32 Application项,在右侧的Locatioon(工程文件保存位置)填入位置信息(如填D\ScreenSaver),在其上边的Project name(工程名)栏中填入适当的名称(如Saver),按OK按钮,这时出现新的窗口,有三个选项,选择 A Simple Apllication, 按Finish(完成)健,接下来出现确认窗口,按OK,完成初步Win32 Application工程的创建。

      2、 在ClassView窗口的Globles项下找到WinMain函数,双击鼠标打开C++文件(本文为Saver.cpp),按照前面的各条程序输入相应内容。

      3、 选择FileView窗口选项,从主窗口文件菜单中选择New,选择File(文件),从文件类型中选择C\C++ Header File,输入文件名(最好与工程名同名,如Saver),确认后,新的头文件出现在FileView窗口Header Files项下(本文文件名为Saver.h)。

      双击新创建的头文件(Saver.h),在头文件中输入以上函数和全局变量的说明(Declaration):

    enum SaverMode
    {
    sm_config,
    sm_preview,
    sm_full,
    sm_test,
    sm_passwordchange
    };

    typedef BOOL (PASCAL * VERIFYPWDPROC) (HWND);

    DWORD g_dwSaverMouseMoveCount;
    BOOL g_bIs9x;
    HINSTANCE g_hPasswordDLL;
    VERIFYPWDPROC g_VerifySaverPassword;
    BOOL g_bCheckingSaverPassword;
    SaverMode g_SaverMode;

    SaverMode ParseCommandLine( TCHAR* pstrCommandLine );
    HWND CreateSaverWindow(SaverMode mode, HWND hWndParent,HINSTANCE hInstance);
    VOID InitSaver();
    VOID ChangePassword();
    VOID Doconfig( );

      4、 确保在C++主文件中包含头文件,即在主文件(Saver.cpp)中,包含#include <Saver.h>语句。

      5、 在插入(Insert)菜单中选择资源(Resource),在随后出现的菜单中选择资源类型为图标(Icon),按新建按钮,这时,空白图标出现在右边窗口,对其进行编辑后,用鼠标选定该图标,从查看菜单中打开属性窗口(Properties),将该图标的ID 改为IDI_MAIN_ICON,按保存按钮,这时出现窗口,要求选择Resource Script文件名,填入适当的文件名(本文填Saver),按OK健,这时,工程目录中应当出现以rc为扩展名的文件。选择FileView窗口,选择Resource Files项,按鼠标右健,选择Add Files to Folder…项,将Resource.h和新建立的Saver.rc文件加入Resource项下。这时,出现ResourceView窗口选项,从该窗口中可以查看本工程的资源(Resource)情况。

      6、 在工程菜单中,选择设置(Settings…), 在Setting for栏目中分别选择Win32 Release和Win32 Debug项,在右边的Link窗口中,将Output File Name中的文件名从exe扩展名改为scr扩展名。

      这时,完成编译环境的设置和输入工作,从编译菜单中选Build,如果没有输入错误,即可顺利编译成功

    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/9/13 11:03:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 C/C++编程思想 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/11/23 1:03:02

    本主题贴数3,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    78.125ms