WM_PAINTで行われる処理の仕方

[戻る]
放浪からす 2005/05/15(日) 00:07:50
こんばんわ、はじめまして。
自分は最近WinAPIの勉強をし始め現在テキストファイルを
読み込んでその内容を表示するというプログラムに挑戦しています。
ファイルの読み込みや全角半角の判別はなんとかできたのですが、
WM_PAINTでの処理がうまくいっていないのか最初ウィンドウには
何も表示されないのですが、隠れたりすると文字が描画されるのです。
こちらの過去ログや様々な参考Webを回っても解決出来なかったので
宜しければどなたかご助言して貰えないでしょうか?
どうか宜しくお願いします。

開発環境はVC++.NET2003、OSはXPsp2、MFCは使用しておりません。

以下プロシージャ内のソースです。
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){

int id;
PAINTSTRUCT ps;
OPENFILENAME ofn;
    
    
switch(msg){
    case WM_PAINT:
         if(fLoad){    //描画フラグ
    hdc=BeginPaint(hWnd,&ps);
    LoadText(hWnd,hdc,"test.txt");        //テキスト読み込み&描画
    EndPaint(hWnd,&ps);
    }
    return (DefWindowProc(hWnd, msg, wp, lp));
    break;
    case WM_COMMAND:
         switch(LOWORD(wp)){
        case IDM_OPEN:
        memset(&ofn, 0, sizeof(OPENFILENAME));
             ofn.lStructSize = sizeof(OPENFILENAME);
                  ofn.hwndOwner = hWnd;
                  ofn.lpstrFilter = "Bitmap (*.BMP)\0*.BMP\0\0";
                  ofn.nFilterIndex = 1;
                  ofn.lpstrFile = szFileName;
                  ofn.nMaxFile = 128;
                  ofn.Flags = OFN_HIDEREADONLY;
        if (GetOpenFileName((LPOPENFILENAME)&ofn))
                  LoadDIB(hWnd,szFileName);
        break;
        case IDM_FONT:
        //フォント情報初期化
        lfFont.lfHeight=28;
        lfFont.lfWidth=0;
                
    lfFont.lfEscapement=lfFont.lfOrientation=0;
    lfFont.lfWeight=FW_MEDIUM;
    lfFont.lfItalic=lfFont.lfUnderline=lfFont.lfStrikeOut=FALSE;
    lfFont.lfCharSet=DEFAULT_CHARSET;            
    lfFont.lfOutPrecision=OUT_DEFAULT_PRECIS;    
    lfFont.lfClipPrecision=CLIP_DEFAULT_PRECIS;
    lfFont.lfQuality=DEFAULT_QUALITY;    
    lfFont.lfPitchAndFamily=DEFAULT_PITCH | FF_SWISS;
    lfFont.lfFaceName[0]='\0';
    fLoad=TRUE;
    break;
    case IDM_NEXT:
    break;
    case IDM_SAVE:
    SaveDIB(hWnd,szFileName);
    break;
    case IDM_END:
    SendMessage(hWnd, WM_CLOSE, 0, 0);
    break;
    }
    break;
    case WM_CLOSE:
            id = MessageBox(hWnd,
                "終了してもよいですか",
                "終了確認",
                MB_YESNO | MB_ICONQUESTION);
                if (id == IDYES) {
                        DestroyWindow(hWnd);
                    }
                    break;
         case WM_DESTROY:
            PostQuitMessage(0);
            //片づけ
            DeleteObject(hBitmap);
            DeleteObject(hDCCompat);
            ReleaseDC(hWnd,hDC);
            delete[](BYTE*)pbmi;
            break;
         default:
            return (DefWindowProc(hWnd, msg, wp, lp));
    }
    return 0;
}

ゆう 2005/05/15(日) 11:39:26
fLoad=TRUE;
のすぐ後に
InvalidateRectを記述してください。
OSがWM_PAINTを発行して、再描画が行われます。

放浪からす 2005/05/15(日) 12:08:31
[[解決]]
ゆうさん返信どうもありがとうございます。
ゆうさんに指摘されたとおりInvalidateRectを追加した所
正常に作動するようになりました。ありがとうございます。
またこちらのお世話になることもあると思いますので、その時
はまた宜しくお願いします。

古いスレッドには追加発言できません。