SDKでステータスバーにプログレスバーを乗せるには?

解決


みけにゃん  URL  2007-03-17 20:35:24  No: 64699

過去ログにもグーグルの検索でも有効なものが
なかったので質問したいと思います・・・・。

IEなどに実装されているページ受信の時にだけ
ステータスバー上に現れるプログレスバーを
実現させたいのですが、どうすれば良いのでしょうか?

実装する場所はメールの受信の部分です。
よろしくお願いいたします。

// メールのリストを表示する
int List_Mail(SOCKET s, char *host, char *id, char *pass, HWND hList, HWND hStatus)
{
  int count, max, rcount, newcnt, msize = 0;
  char subject[TEMP_MAX], date[TEMP_MAX], from[TEMP_MAX], header[TEMP_MAX];
  char strMsg[1024], szSize[1024];
  char szlYear[4], szlMonth[2], szlDay[2], szlHour[2], szlMinute[2], szlSecond[2];
  char szName[256];
  LPSTR lpUidl, lpFilePath;
  BOOL bFile;

  max = 0;
  rcount = 0;
  newcnt = 0;
  
  // 認証
  if((max = NMailPop3Authenticate(s, id, pass, bApop)) >= 0){
    // 受信しているメールの数分ヘッダを読み出す
    for(count = 0; count < max; count++){
      if(NMailPop3GetMailStatus(s, count + 1, subject, date, from, header, FALSE) >= 0){

        // うまくいかなかったのでサイズ取得方法を変更
        if((msize = NMailPop3GetMailSize(s, count + 1)) >= 0){
          sprintf(szSize, "%d", msize);
        }
        else{
          wsprintf(szSize, "0");
        }

        // 取得した日付を分解
        mid(date, szlYear, 1, 4);
        mid(date, szlMonth, 6, 2);
        mid(date, szlDay, 9, 2);
        mid(date, szlHour, 12, 2);
        mid(date, szlMinute, 15, 2);
        mid(date, szlSecond, 18, 2);

        // UIDLのサイズを確保
        lpUidl = (char *)malloc(sizeof(char) * 1024);
        lpFilePath = (char *)malloc(sizeof(char) * MAX_PATH);

        if(lpUidl == NULL){
          free(lpUidl);
          break;
        }
        
        if(lpFilePath == NULL){
          free(lpFilePath);
          break;
        }

        // カレントディレクトリを取得する
        GetCurrentDirectory(MAX_PATH, lpFilePath);
        strcat(lpFilePath, "\\inbox\\");

        // UIDLを取得する
        NMailPop3GetUidl(s, count + 1, lpUidl, 1024);

        // リスト用のファイル名を作成
        wsprintf(szName, "%s%s%s%s%s%s_%s.dat", szlYear, szlMonth, szlDay, szlHour, szlMinute, szlSecond, lpUidl);

        strcat(lpFilePath, szName);
        bFile = FileExists(lpFilePath);

        // ファイルが存在しない(新規メール)とき
        if(bFile == FALSE){
          // 処理中のメッセージの表示
          wsprintf(strMsg, "%d件目を処理中", count + 1);
          SendMessage(hStatus, SB_SETTEXT, 0 | 0, (LPARAM)strMsg);

          // メールデータを保存
          //Store_Mail(s, count + 1, lpUidl);
          Store_Mail(s, count + 1, lpFilePath);
        }
        else{
          // 受信済みの場合は受信済みカウントを増加する
          rcount++;
        }

        // サーバにメールを残すチェックがはずされているとき
        if(bSMailDel == FALSE){
          // サーバのメールを削除する
          NMailPop3DeleteMail(s, count + 1);
        }

        free(lpUidl);
        free(lpFilePath);

      }
      else{
        break;
      }
    }

    // 保存されたメールの一覧を表示する
    SetLocalMail(hList);

  }

  // 新規メールから受信済みメールの数を引く
  newcnt = max - rcount;

  // ステータスメッセージの初期化
  strcpy(strMsg, "");

  // 最大件数が0件(メールがない)の場合
  if(newcnt == 0){
    // メールがサーバにない(または既読メールしかない)時
    SendMessage(hStatus, SB_SETTEXT, 0 | 0, (LPARAM)"メールは届いていません");
  }
  else{
    // メールがある場合は件数表示
    //wsprintf(strMsg, "%d件のメールが届いています", max);
    wsprintf(strMsg, "%d件のメールが届いています", newcnt);
    SendMessage(hStatus, SB_SETTEXT, 0 | 0, (LPARAM)strMsg);
  }

  return max;
}


瀬戸っぷ  2007-03-18 07:08:28  No: 64700

やったコトはないですが…
http://www.codeguru.com/cpp/controls/statusbar/
でいくつか例が出ているようです。
英語なページですが、コードが載っていれば何とかなるのではないでしょうか。
MFCだったりしますが…読み替えてください。

# 子ウィンドウとして貼り付けているだけっぽいですが。


みけにゃん  URL  2007-03-18 08:15:50  No: 64701

やっぱりSDKでのサンプルはないんですかねぇ・・・・(>_<)
MFC(C++)だったらどのページにも載っている事は分かるんですけれど。

プログレスバー表示をする時にステータスバーを親として
プログレスバーをCreateWindowExで作って・・・必要がなくなったら
DestroyWindowかなにかで消すという方法なのでしょうか?


瀬戸っぷ  2007-03-18 09:59:20  No: 64702

最後にはDestroyWindowでしょうけど、
普段はShowWindowsで非表示で十分ではないかと。


みけにゃん  URL  2007-03-19 01:27:20  No: 64703

CreateWindowEx()でステータスバーを親として
プログレスバーを作って何とか目標は達成できたと思います。

ShowWindow()で非表示にして試してみましたが、再表示が
出来なかったのでDestroyWindow()で破棄してみました。

// メールのリストを表示する
int List_Mail(SOCKET s, char *host, char *id, char *pass, HWND hList, HWND hStatus)
{
  int count, max, rcount, newcnt, msize = 0;
  char subject[TEMP_MAX], date[TEMP_MAX], from[TEMP_MAX], header[TEMP_MAX];
  char strMsg[1024], szSize[1024];
  char szlYear[4], szlMonth[2], szlDay[2], szlHour[2], szlMinute[2], szlSecond[2];
  char szName[256];
  LPSTR lpUidl, lpFilePath;
  BOOL bFile;

  max = 0;
  rcount = 0;
  newcnt = 0;

  // 認証
  if((max = NMailPop3Authenticate(s, id, pass, bApop)) >= 0){
    // サーバにあるメールの数が0以上のとき
    if(max > 0 ){
      // プログレスパー表示
      hProgress = CreateWindowEx(0, PROGRESS_CLASS, "", WS_CHILD | WS_VISIBLE, sb_size, 5, 100, 16, hStatus, (HMENU)ID_PROGRESS, hInst, NULL);
      SendMessage(hProgress, PBM_SETRANGE, 0, MAKELONG(0, max));
    }
    else{
      // プログレスバーを削除
      DestroyWindow(hProgress);
    }

    // 受信しているメールの数分ヘッダを読み出す
    for(count = 0; count < max; count++){

      // プログレスバーを増加
      SendMessage(hProgress, PBM_SETPOS, count + 1, 0);

      if(NMailPop3GetMailStatus(s, count + 1, subject, date, from, header, FALSE) >= 0){

        // うまくいかなかったのでサイズ取得方法を変更
        if((msize = NMailPop3GetMailSize(s, count + 1)) >= 0){
          sprintf(szSize, "%d", msize);
        }
        else{
          wsprintf(szSize, "0");
        }

        // 取得した日付を分解
        mid(date, szlYear, 1, 4);
        mid(date, szlMonth, 6, 2);
        mid(date, szlDay, 9, 2);
        mid(date, szlHour, 12, 2);
        mid(date, szlMinute, 15, 2);
        mid(date, szlSecond, 18, 2);

        // UIDLのサイズを確保
        lpUidl = (char *)malloc(sizeof(char) * 1024);
        lpFilePath = (char *)malloc(sizeof(char) * MAX_PATH);

        if(lpUidl == NULL){
          free(lpUidl);
          break;
        }
        
        if(lpFilePath == NULL){
          free(lpFilePath);
          break;
        }

        // カレントディレクトリを取得する
        GetCurrentDirectory(MAX_PATH, lpFilePath);
        strcat(lpFilePath, "\\inbox\\");

        // UIDLを取得する
        NMailPop3GetUidl(s, count + 1, lpUidl, 1024);

        // リスト用のファイル名を作成
        wsprintf(szName, "%s%s%s%s%s%s_%s.dat", szlYear, szlMonth, szlDay, szlHour, szlMinute, szlSecond, lpUidl);

        strcat(lpFilePath, szName);
        bFile = FileExists(lpFilePath);

        //InsertItem(hList, count + 1, 4, szName);

        // ファイルが存在しない(新規メール)とき
        if(bFile == FALSE){
          // 処理中のメッセージの表示
          wsprintf(strMsg, "%d件目を処理中", count + 1);
          SendMessage(hStatus, SB_SETTEXT, 0 | 0, (LPARAM)strMsg);

          // メールデータを保存
          Store_Mail(s, count + 1, lpFilePath);
        }
        else{
          // 受信済みの場合は受信済みカウントを増加する
          rcount++;
        }

        // サーバにメールを残すチェックがはずされているとき
        if(bSMailDel == FALSE){
          // サーバのメールを削除する
          NMailPop3DeleteMail(s, count + 1);
        }

        free(lpUidl);
        free(lpFilePath);

      }
      else{
        break;
      }
    }
  }

  if(max > 0){
    // プログレスバーを削除
    DestroyWindow(hProgress);
  }

  // 保存されたメールの一覧を表示する
  SetLocalMail(hList);

  // 新規メールから受信済みメールの数を引く
  newcnt = max - rcount;

  // ステータスメッセージの初期化
  strcpy(strMsg, "");

  // 最大件数が0件(メールがない)の場合
  if(newcnt == 0){
    // メールがサーバにない(または既読メールしかない)時
    SendMessage(hStatus, SB_SETTEXT, 0 | 0, (LPARAM)"メールは届いていません");
  }
  else{
    // メールがある場合は件数表示
    wsprintf(strMsg, "%d件のメールが届いています", newcnt);
    SendMessage(hStatus, SB_SETTEXT, 0 | 0, (LPARAM)strMsg);
  }

  return max;
}


瀬戸っぷ  2007-03-24 11:12:11  No: 64704

ちょっとやってみました。
ウィンドウプロシージャだけですが…

LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  static HWND hStatus, hProgress;

  switch(message)
  {
    case WM_CREATE:
      {
        int sb_size[] = {180, 260, 480};
        RECT rcStatus;

        hStatus = CreateWindowEx( 0, STATUSCLASSNAME, NULL, WS_CHILD | SBARS_SIZEGRIP | CCS_BOTTOM | WS_VISIBLE, 0, 0, 0, 0, hwnd, (HMENU)ID_STATUS, hInst, NULL);
        SendMessage(hStatus, SB_SETPARTS, (WPARAM)3, (LPARAM)sb_size);
        SendMessage(hStatus, SB_GETRECT, (WPARAM)0, (LPARAM)&rcStatus);
        hProgress = CreateWindowEx(0, PROGRESS_CLASS, NULL, WS_CHILD, rcStatus.left, rcStatus.top, rcStatus.right, rcStatus.bottom, hStatus, (HMENU)1, hInst, NULL);
        SendMessage(hProgress, PBM_SETRANGE, (WPARAM)0, (LPARAM)MAKELPARAM (0, 20));
        SendMessage(hProgress, PBM_SETSTEP, (WPARAM)1, (LPARAM)0);
      }
      break;

    case WM_LBUTTONDOWN:
      {
        if(IsWindowVisible(hProgress)) {
          SendMessage(hProgress, PBM_STEPIT, 0, 0);
        } else {
          SendMessage(hProgress, PBM_SETPOS, (WPARAM)0, (LPARAM)0);
          ShowWindow(hProgress, SW_SHOW);
        }
      }
      break;

    case WM_RBUTTONDOWN:
      {
        ShowWindow(hProgress, SW_HIDE);
      }
      break;

    case WM_DESTROY:
      DestroyWindow(hProgress);
      DestroyWindow(hStatus);
      PostQuitMessage(0);
      break;

    default:
      return DefWindowProc(hwnd, message, wParam, lParam);
      break;
  }
  return 0;
}

クライアント領域で左クリックしていくとプログレスバーが進みます。
右クリックで非表示に。
メインウィンドウのリサイズに対応していなかったりしますが。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加