用VC++6.0 编写一个完整的

vc++6.0纹样代码 vc++6.0纹样代码 本次课程的最后成果 实现功能 画出条状菱形纹样 使用者以交互式窗口完成纹样的属性设定 纹样所示的所有属性,都可以由交互界面更改,包括:纹样重复周期、线条粗细、颜色、内部填充图案等。 效果图 交互界面 void CWenyang3View::OnMenuitem32771() { // TODO: Add your command handler code here wy dlg1; int button; CDC* pDC=GetDC( ); button = dl 阅读详情
屏幕保护程序是一个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),获取用户信息,在程序中进行相应的更改。
 
屏幕保护程序的退出机制反映在程序的消息响应函数(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 );
    }
}
 
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,如果没有输入错误,即可顺利编译成功。
 
Visual C++ 6.0下载安装及编写第一个C程序 VC++6.0下载安装及编写第一个C语言程序 VC++6.0下载地址:链接: https://pan.baidu.com/s/1vQwsAroGdsSZVMr7GmdBtg 提取码: aakt 1,下载软件安装包,并解压! 2.软件安装狂点下一步,安装位置可自定义选择, 3.安装完成自动打开软件! 4.点击文件,新建一个工程,如图下图 5.新建环境,与项目存储地址! 6.选择一个空工程,点击完成即可 7.点击确认! 8.创建可执行文件!继续点击文件,新建工程 9.如下图所示,点击即可, 1 阅读详情

相关推荐

超精简vc++6.0配置OPENGL

详细讲解了如何从下载、安装VC 直到配置OPENGL并测试 同时里面掺杂了对于这些过程中中常见问题的解决,希望对大家有用处。

王小六4ever’s poke 3812

VC6.0 C语言精华代码

/*自己摸索的编程的重要代码精华,以留作备份此文件需要用VC6.0打开运行 代码部分都经过注销了 每部分代码下都有相关程序的解释 欢迎大家给予更正和修改 补更: 关于头文件#include问题,因为用了两个井号自动,变成标题。。。所以呢 ,代码都经过编写运行的(没啥对错问题),主要是函数头记得加进去! 再加一个目录吧,也方便大家阅览! 求平均数 比较两个数的大小 习题...

松 1815

简单的屏幕保护程序(VC6源代码,46K)

用VC编译的简单的屏幕保护程序。比普通的工程多加了一个库文件,一共才3个函数,简单。

vc++6.0 启动代码

vc++6.0 启动代码 --- crt0.c  --------------------------------------------------------------------------------------------------------------------------------- mainCRTStartup: 00408290   push

windaystl的专栏 734

VC++6.0常用功能源代码

VC6.0中经常使用到的一些源代码,适合初学者使用

VC++6.0 经典编程100例

初级必看 VC++6.0 经典编程100例

vc访问mysql_VC++6.0 访问Mysql一完整例子

VC++6.0 要进行设置工具 / 选项 / 添加目录( mysql.h )所在目录#if defined(_WIN32) || defined(_WIN64) // 为了支持 windows 平台上的编译#include #endif#include #include #include "mysql.h" // 我的机器上该文件在 D:/mysql/include 下// 定义数据库操作的宏...

weixin_39960793的博客 245

VC++ 6.0 TCP 通讯实例(服务器端和客户端)

服务器端流程: 1、创建套接字(socket)。 2、将套接字绑定到一个本地地址和端口上(bind)。 3、将套接字设为监听模式,准备接收客户请求(listen)。 4、等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)。 5、用返回的套接字和客户端进行通信(send/recv)。(在线程中进行) 6、返回,等待另一客户请求。 7、关闭套接字。 客户端流程: 1、创建套接字(socket)。 2、向服务器发出连接请求(connect)。 3、和服务器端进行通信(send/recv)。 4、关闭套接字。

贪吃蛇c语言代码 vc++6.0,贪吃蛇代码-C语言版-VC++6.0

//这是一个贪吃蛇代码,运行环境VC++6.0//该程序不需要graphics.h头文件/*这是一个贪吃蛇代码,运行环境VC++6.0(亲测完美运行)*//*该程序在dos系统下运行,不需要graphics.h头文件*/#include #include #include #include #include #include #define N 21int apple[3];char score[...

weixin_30844577的博客 1408

VC 6屏幕录制模块源码含文档.rar

VC 6.0编写实现的屏幕录制模块,就是将屏幕上的活动内容录像,屏幕录像机源码含文档。在这个屏幕录像模块的主窗体中,用户可以设置录像文件名和存储位置,并可以进行录像和抓图,还可以对已有录像文件进行播放、重命名、另存为、查看时间和删除等操作。录像格式文件为AVI.关于帧/秒的设置,建议每秒不超过5帧,键盘上对应的快捷键操作:F2:开始、结束录制/F3:暂停/F4:抓图。   首先单击“选择”按钮,设置文件保存路径,然后按“F2”快捷键,开始录像,录制过程中可按“F3”快捷键暂停,按“F4”快捷键抓图。录制完成后,按“F2”结束录制,生成录像文件。在“录像文件”列表中,右键单击文件,可播放、重命名、另存为、查看时间和删除文件等。   录像截取:单击录像截取按钮,打开“录像截缺窗口,首先设置起始帧数,选择定义头,然后设置结束帧数,选择定义尾,最后单击“截缺按钮进行录像的截龋   录像合成:单击录像合成按钮,打开“录像合成”窗口,单击“加入”按钮向列表中插入录像文件,然后单击“合成”按钮将文件组合到一起。

SOCKET编程VC6.0源代码完整的客户端和服务端

包括完整的客户端和服务端,有完整的VC6.0源代码,内容袎,有助初学者入门。

用VC++6.0编写Proxy服务器

用VC++6.0编写Proxy服务器我们一般常用的Internet代理服务器是用微软的Proxy Server 2.0 。但我们可以自己动手编写一个简单、小型的Proxy Server 。下面介绍具体的实现方法。一. 原理本程序的结构原理如下:对于每一个用户的请求(Internet 请求,由浏览器发出),本程序将启动两个线程,一个把本地用户的请求数据发送到远程的Internet主机,另一个线程把远

597

Visual C++6.0代码参考与技巧大全

一本700多页的好书源代码113MB,经过精简临时文件以及超级压缩后只有1.19MB了,绝对超值

基于OPENCV的完整图像处理程序

基于OPENCV的完整图像处理程序 去发现同类优质开源项目:https://gitcode.com/ 简介 本仓库提供的是一个基于opencv1.0和VC++6.0 MFC环境编写的完整图像处理程序。该程序集成了图像处理的基础操作与高级应用,适用于对图像处理有兴趣的学习者和开发者。 功能特性 以下是程序的主要功能: 图像基本操作:包括旋转、镜像、反色、图像二值化、图像分割、图像增强、灰度直方图均...

gitblog_06784的博客 524

免费获取船舶轨迹数据?手把手教你用Python处理中国海洋卫星AIS数据

本文详细介绍了如何免费获取中国海洋卫星AIS数据,并使用Python进行船舶轨迹数据的处理与分析。从数据源评估到自动化处理流水线,再到高级分析与可视化技巧,手把手教你避开常见问题,实现高效数据处理。特别适合航运数据分析、物流优化和海上安全研究等领域的研究者和开发者。

weixin_42616115的博客 321

基于NXP i.MX RT1180的无传感器FOC电机驱动实战指南

磁场定向控制(FOC)是一种先进的电机控制技术,它通过精密的数学变换,将三相交流电机的控制解耦为独立的转矩和磁场分量,从而实现高效、平稳、低噪音的驱动。其核心原理在于利用Park/Clark变换,在旋转坐标系下对电流进行线性控制。这项技术的价值在于显著提升了永磁同步电机(PMSM)的效率与动态性能,广泛应用于机器人、无人机和工业自动化等高精度场景。本文聚焦于利用NXP i.MX RT1180跨界处理器及其MCUXpresso SDK,快速实现一套完整的无传感器FOC解决方案。通过解析硬件平台选型、软件架构,

weixin_33925615的博客 309

VC++6.0安装教程

1.下载VC++6.0 在群里下载VC++6.0压缩包 自己找一个(或新建一个)文件夹,然后解压到里面 2.安装VC++6.0 双击运行vc6.0_cn_full(完整绿色版)(支持XP、Win7、Win8、Win10).exe安装程序 直接点击下一步 点击下一步 默认点击下一步,如需设置安装路径则可以点浏览来更改 创建桌面快捷方式默认打钩,点击下一步 点击安装,然后等待安装完成 点击完成后会直接运行程序,至此安装完成 3.下节讲使用教程 -> 点击进入 ...

下一个路口,又会是怎样的结果 5万+

别再手动查日志了!用Dify+Zabbix打造你的专属运维“嘴替”(保姆级配置流程)

本文详细介绍了如何利用Dify平台与Zabbix监控系统集成,构建智能运维对话系统,实现自然语言交互的运维管理。通过保姆级配置流程,帮助运维工程师提升查询效率、降低学习成本,打造企业级智能运维解决方案。

weixin_27298377的博客 457

VC++6.0使用教程

1.运行程序 点击桌面VC++6.0运行,个别电脑运行时会出现以下报错信息 在不再显示此消息前打钩,然后点击运行程序而不获取帮助 如果出现以下界面即为安装成功,然后进入下一步替换文件;点击关闭,然后再点击X号关闭程序 在桌面右击VC++6.0,然后点击打开文件所在位置进入文件所在的目录 把原来在群里下载后解压出来的MSDEV.EXE文件,复制到VC++6.0文件目录里,会出现以下提示框,然后点击替换目标中的文件 2.创建工程 点击桌面VC++6.0运行程序,进入后点击关闭对话框

下一个路口,又会是怎样的结果 5万+

UE5 SplineMesh与StaticMesh性能对比:生成1000米路径的帧率与内存实测

本文深度对比了UE5中SplineMesh与StaticMesh在生成1000米路径时的性能差异,包括帧率、内存占用及实现复杂度。实测数据显示,SplineMesh在Draw Call优化和动态变形场景中表现更优,而StaticMesh适合需要复杂材质变化的场景。文章还提供了优化技巧和选型指南,帮助开发者根据项目需求做出科学决策。

weixin_33976326的博客 319

用人话讲明白线性回归LinearRegression

目录 什么是回归 一元线性回归 损失函数 最小二乘估计 小结 1. 什么是回归 当我们学习一门新课程、接触一个新专业时,总会对该领域的专有名词感到困惑,甚至看完解释仍难以理解其含义。在我们一起学习machine learning的过程中,我会尽量对相关名词用“人话”做一遍解释,以减少学习的“痛苦感”。 譬如今天要学的线性“回归”,这个回归(regression)和我们平时说的“回归祖国”的回...

化简可得 1万+

如何用VC++6.0编写一个游戏

如何用VC++6.0编写一个游戏大部分同学在大学中学了面向过程的C语言,想迈向面向对象的C++,却不知如何下手。下面教大家如何用传统的VC++6.0零基础编写一个属于自己的游戏程序,过一把写游戏的瘾。 打开Microsoft Visual C++6.0,新建一个C++ Source File文件; 将以下代码复制黏贴,编译链接执行; /*贪吃蛇*/ #include<stdio.h> #includ

LSEC小陆的博客 2万+

C# 与华中数控设备通信:数控机床自动化控制与实时监测系统

华中数控系统与C#通信开发指南 核心要点 通信基础 支持串口(RS232/RS485)和以太网两种连接方式 协议选择:通用Modbus协议或华中自定义HNC协议 关键数据映射表明确各参数对应的寄存器地址和功能码 系统架构 四层架构:设备层→通信层→业务层→应用层 包含实时数据采集、指令下发、状态监控、异常处理全流程 支持Modbus和HNC协议动态切换 代码实现 串口通信使用NModbus库简化开发 提供连接管理、数据读取、指令下发完整示例 包含异常处理和超时重连机制 应用价值 实现数控机床远程监控和自动化

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 2023
上一篇: 流和流库[给初学者非常有用]
下一篇: 怎么会这样?delete [] 了,还能用!!!
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值