過去ログにもグーグルの検索でも有効なものが
なかったので質問したいと思います・・・・。
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;
}
やったコトはないですが…
http://www.codeguru.com/cpp/controls/statusbar/
でいくつか例が出ているようです。
英語なページですが、コードが載っていれば何とかなるのではないでしょうか。
MFCだったりしますが…読み替えてください。
# 子ウィンドウとして貼り付けているだけっぽいですが。
やっぱりSDKでのサンプルはないんですかねぇ・・・・(>_<)
MFC(C++)だったらどのページにも載っている事は分かるんですけれど。
プログレスバー表示をする時にステータスバーを親として
プログレスバーをCreateWindowExで作って・・・必要がなくなったら
DestroyWindowかなにかで消すという方法なのでしょうか?
最後にはDestroyWindowでしょうけど、
普段はShowWindowsで非表示で十分ではないかと。
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;
}
ちょっとやってみました。
ウィンドウプロシージャだけですが…
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;
}
クライアント領域で左クリックしていくとプログレスバーが進みます。
右クリックで非表示に。
メインウィンドウのリサイズに対応していなかったりしますが。
ツイート | ![]() |