天天看點

《深入淺出MFC》筆記(三)

1,Win32 Console程式示例:

#include <windows.h>

#include <stdio.h>

#include <string.h>

#include <conio.h>

const int FILEMAX  = 300;  // allow max. 300 files in each directory

typedef struct _DESTFILE

{//目标檔案

    WIN32_FIND_DATA fd;

    BOOL bMatch;

} DESTFILE;

typedef struct _SRCFILE

{//源檔案

    BOOL bIsNew;

} SRCFILE;

int main(int argc, char *argv[])

{

    int i, j, iSrcFiles, iDestFiles;

    HANDLE hFile;

    BOOL bRet = TRUE;

    char src[MAX_PATH+1], dest[MAX_PATH+1], destpath[MAX_PATH+1];

    SRCFILE  srcFiles[FILEMAX];

    DESTFILE destFiles[FILEMAX];

    BOOL bFound = FALSE;

    DWORD dwcNameSize = MAX_PATH+1;

    char szBuffer[MAX_PATH+1];

    if (argc < 2) 

    {

        return -1;

    }

     for (i=0; i< argc; i++)

         printf("argv[%d]: %s \n", i, argv[i]);

    strcpy(src, argv[1]);

    if (argc == 2) 

    {//未指定目标檔案夾

        GetCurrentDirectory(dwcNameSize,(LPSTR) &szBuffer);

        strcpy(dest, szBuffer);

        dest[0] = 'I';//預設目标盤

        strcpy(destpath, dest); // destpath should be something like "k:\u002\doc\".

        strcat(destpath, "\\"); // just prepare for use latter (when updating and deleting).

        strcat(dest, "\\*.*");  // dest should be something like "k:\u002\doc\*.*"

    else 

    {//指定目标檔案夾

        strcpy(destpath, argv[2]); // destpath should be something like "k:"

        // just prepare for usage latter (when updating and deleting).

        strcpy(dest, argv[2]);

        strcat(dest, "*.*");       // then dest should be something like "k:*.*"

    strcat(src, "*.*");         // src should be something like g:*.*

    // prepare srcFiles[]

    bRet = TRUE;

    iSrcFiles = 0;

    // printf("Directory listing of %s\n", src);

    hFile = FindFirstFile(src, &fd);

    while (hFile != INVALID_HANDLE_VALUE && bRet)

        if (fd.dwFileAttributes == FILE_ATTRIBUTE_ARCHIVE) {

            srcFiles[iSrcFiles].fd = fd;

            srcFiles[iSrcFiles].bIsNew = FALSE;

            // printf("%s\n", srcFiles[iSrcFiles].fd.cFileName);

            iSrcFiles++;

        }

        bRet = FindNextFile(hFile, &fd);

    // prepare destFiles[]

    iDestFiles = 0;

    // printf("Directory listing of %s\n", dest);

    hFile = FindFirstFile(dest, &fd);

            destFiles[iDestFiles].fd = fd;

            destFiles[iDestFiles].bMatch = FALSE;

            // printf("%s\n", destFiles[iDestFiles].fd.cFileName);

            iDestFiles++;

    // check for new files and redudant files

    for (i=0; i<iSrcFiles; i++) {

        bFound = FALSE;

        for (j=0; j<iDestFiles; j++) {

            if (!(destFiles[j].bMatch))  {

                if (strcmpi(destFiles[j].fd.cFileName, srcFiles[i].fd.cFileName) == 0) 

                {//找到比對

                    // find same files in dest directory

                    destFiles[j].bMatch = TRUE;

                    bFound = TRUE;

                    if (CompareFileTime(&destFiles[j].fd.ftLastWriteTime,

                        &srcFiles[i].fd.ftLastWriteTime) < 0) 

                    {//比較檔案更新時間

                            // src file is new than dest file

                            srcFiles[i].bIsNew = TRUE;

                    }

                    break;  // break j loop, because found!

                }

            }

        if (bFound == FALSE) // not found, so is new.

            srcFiles[i].bIsNew = TRUE;

    // updating new files 

    for (i=0, j=0; i<iSrcFiles; i++) {  // j for new files counter

        if (srcFiles[i].bIsNew) {

            printf("%s\n", srcFiles[i].fd.cFileName);

            j++;

    if (j==0) 

        printf("no file new \n");

        printf("There are %d files need to be updated \n", j);

        printf("if you do not want to update these files, press Ctrl-Break \n");

        printf("otherwise anykey\n");

        getch();

    for (i=0; i<iSrcFiles; i++) 

        if (srcFiles[i].bIsNew) 

        {

            strcpy(dest, destpath);

            strcat(dest, srcFiles[i].fd.cFileName);

            CopyFile(srcFiles[i].fd.cFileName, dest, FALSE); // FALSE means overwrite

    // deleting redudant files

    for (j=0, i=0; j<iDestFiles; j++) 

    {  // i for redudant files counter

        if (!destFiles[j].bMatch) 

            printf("%s\n", destFiles[j].fd.cFileName);

            i++;

    if (i==0) 

        printf("no redudant file \n");

    else

        printf("There are %d files need to be deleted \n", i);

        printf("if you do not want to delete those files, press Ctrl-Break \n");

    for (j=0; j<iDestFiles; j++) 

            strcat(dest, destFiles[j].fd.cFileName);

            DeleteFile(dest);

    return 0;

}

_

2,String型轉換為LPWSTR

在TextOut中想直接輸出一個string型不行,它參數非得是一個LPWSTR,解決的辦法是用MultiByteToWideChar,MultiByteToWideChar 函數可以把普通字元串轉換為一個寬字元字元串(Unicode)

LONG OnPaint(HWND hWnd,UINT nMessage,WPARAM wParam,LPARAM lParam)

    PAINTSTRUCT ps;

    HDC hdc;

    hdc = BeginPaint(hWnd, &ps);

    WCHAR wszMsgInfo[256];          

    string strInfo = "aa";

    MultiByteToWideChar(CP_ACP,0,strInfo.c_str(),strInfo.length(),wszMsgInfo,sizeof(wszMsgInfo)/sizeof(wszMsgInfo[0]));

    ::TextOut(hdc,10,10,wszMsgInfo,strInfo.length());

    EndPaint(hWnd, &ps);

3,對上一節的代碼進行修改,加入一個新的功能,使得能從菜單呼出系統中的記事本

首先修改指令映射表

MSGMAP_ENTRY _commandEntries[] = 

    IDM_ABOUT,OnAbout,

    IDM_EXIT,OnExit,

    IDM_NOTEBOOK,OnNoteBook

};

再添加一個處理函數,在函數中建立一個記事本程序:

LONG OnNoteBook(HWND hWnd,UINT nMessage,WPARAM wParam,LPARAM lParam)

    PROCESS_INFORMATION pInfo;

    STARTUPINFO si;

    ZeroMemory( &si, sizeof(si) );

    si.cb = sizeof(si);

    ZeroMemory( &pInfo, sizeof(pInfo) );

   BOOL bCreated = FALSE;

    bCreated = ::CreateProcess(_T("C:\\WINDOWS\\system32\\notepad.exe"),NULL,NULL,NULL,false,0,NULL,NULL,&si,&pInfo);

 if(bCreated)

 {//割斷父子程序間的聯系

  CloseHandle(pInfo.hProcess);

  CloseHandle(pInfo.hThread);

 }    return 0;

4,新開一個線程擷取系統時間

case IDM_GETSYSTIME:

    DWORD dwThrId;

    hSysTime = CreateThread(NULL,0, (LPTHREAD_START_ROUTINE)ReadCurTime,NULL,0,&dwThrId);

    if(hSysTime!=NULL)

        WaitForSingleObject(hSysTime,INFINITE);

        CloseHandle(hSysTime);

break;

void ReadCurTime(void)

{//目前系統時間

    SYSTEMTIME st;

    GetSystemTime(&st);

    char buffer[256];

    sprintf(buffer,"%d:%d:%d",st.wYear,st.wMonth,st.wDay);

本文轉自Phinecos(洞庭散人)部落格園部落格,原文連結:http://www.cnblogs.com/phinecos/archive/2008/01/18/1044929.html,如需轉載請自行聯系原作者

繼續閱讀