mfc-ml

2002年01月

31

[mfc 37638] CSV形式ファイルからの読み込み

お世話になります。KAWAZOEです。(VC++6.0 SP4 MFC)
CSV形式のファイルからデータを1行ずつ読み込んでCString型やint型メンバ変数に
セットしたいのですが教えてください。
まずそのCSV形式のファイルへの保存の仕方は次のようにしています。
 CStdioFile fp;
 fp.Open ( lpszFileName, CFile::modeCreate | CFile::modeWrite |
CFile::typeBinary );
 CString szBuf; szName, szId;
 int nNo;
 szBuf.Format ( "名前,ID,番号\r\n" );    // タイトル書き込み
 fp.WriteString ( szBuf );
for(  ;   ;   )
 {
    // メンバ変数更新処理は省略
   szBuf.Format ( "%s,%s,%04d", szName, szId, nNo);
   szBuf += "\r\n";
   fp.WriteString ( szBuf );
 }
このように保存したファイルから今度はタイトルは読み飛ばして
ファイルの最後までszName, szId, nNoに次々とセットしていきたいのです。
最初は
    CStdioFile fp;
    CString buf;
    fp.ReadString(buf);
でやりかけたのですが、1行分バッファにデータが
読み込めても、それをカンマで分解して・・・となると分からなくなって・・
CFile でも考えたのですが、混乱してきました。\r\nを読み飛ばす?

ご指導のほどよろしくお願いいたします。
31

[mfc 37637] Re: 自アプリ内と外からの再描画が衝突したとき

# SetRedraw止めるのが最適の解決策だと思うんですが。

> 他アプリの残骸を残さない方法をご存知の方がおりましたら、

「Win32API版の」InvalidateRectやRedrawWindowを使うと
どうなりますかねぇ。
# CWnd::RedrawWindowのヘルプとか見ているとMFC版では
# 有効にならない窓もあるみたいですし。

-- 
悪魔-VFC-LINK  P...@nifty.ne.jp
31

[mfc 37636] 自アプリ内と外からの再描画が衝突したとき

初めて投稿します。
MFCダイアログベースアプリケーション
OS:Window NT 4.0 sp5
Visual C++ 6.0
再描画処理で困っています。
ダイアログ上のボタンの文字を1秒おきに変更させるため、
タイマーを1秒おきにセットし、
OnTimer内に次のような処理を記述しました。

void CXXXXDlg::OnTimer(UINT nIDEvent) 
{
    SetRedraw(FALSE);/*再描画を禁止*/
      :

    SetDlgItemText(ボタンID1, 文字列);
    SetDlgItemText(ボタンID2, 文字列);
    SetDlgItemText(ボタンID3, 文字列);
      :
    SetRedraw(TRUE);/*再描画を許可*/
    Invalidate(FALSE);

    CDialog::OnTimer(nIDEvent);
}

SetRedrawを組み込んだ理由は、処理が重くなったとき、
ボタンID1からID2,ID3・・・と流れるように変更されるのを避
け、
一気に全ボタンを変更させるためです。
上記の処理が組み込まれたアプリを自アプリとします。
自アプリの上に他のアプリを乗せ、自アプリ再描画の瞬間に
他アプリを最小化させます。すると自アプリ上に他アプリの
残骸が残ります。しばらくそのままにしておいても残骸は残っ
たままです。
この現象はSetRedraw、SetDlgItemTextのどちらか一方が
無いときには現れませんでした。
他アプリの残骸を残さない方法をご存知の方がおりましたら、
その方法をお教えください。

__________________________________________________
Do You Yahoo!?
Yahoo! BB is Broadband by Yahoo!  http://bb.yahoo.co.jp/
31

[mfc 37635] Re: DirectDrawのYUVサーフェスの作成方法について

こんにちは、坂口と申します。

> //オフスクリーンサーフェスの作成
> ZeroMemory(&ddsd2, sizeof(ddsd));
> ddsd.dwSize = sizeof(ddsd2);
> ddsd2.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS | DDSD_PIXELFORMAT;
> ddsd2.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
> ddsd2.dwWidth = 640;
> ddsd2.dwHeight = 480;
> ddsd2.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
> ddsd2.ddpfPixelFormat.dwFlag = DDPF_YUV;
> hrRet = lpDD4->CreateSurface(&ddsd2, &lpDDSBack4, NULL);
>  ↑
> 「ピクセルフォーマットのフラグが正しくない」というエラーが出ます。

私の場合、こんなふうです。

改行が入って醜くなっている場合は勘弁です。

DDPIXELFORMAT g_ddpixelFormat[] = {
{sizeof(DDPIXELFORMAT) , DDPF_RGB , 0 , 24 , 0xff0000 , 0xff00 , 0xff , 0 }, // 24bit RGB
{sizeof(DDPIXELFORMAT) , DDPF_FOURCC , MAKEFOURCC( 'Y','U','Y','2' ),0,0,0,0,0}, // YUY2,
{sizeof(DDPIXELFORMAT) , DDPF_RGB , 0 , 32 , 0xff0000 , 0xff00 , 0xff , 0 }, // 32bit RGB
{sizeof(DDPIXELFORMAT) , DDPF_RGB , 0 , 16 , 0xf800 , 0x7e0 , 0x1f , 0 } //16bit RGB
};

ddsd.ddpfPixelFormat = g_ddpixelFormat[ 1 ];

もちろん、ビデオカードやドライバがサポートしていなければエラーとなります
が・・・


 ---
Tatsumi Sakaguchi (SONY Corp.)
31

[mfc 37634] Re: DirectDraw のYUVサーフェスの作成方法について

>
> 今、IEEE1394カメラのViewerを作成しています。
> YUV形式でデータがくるのでそれを高速でRGBに変換して
> ディスプレイに表示させようと考えています。
> それでDirectX(DirectDraw)を使い、ハードウェアでのYUV→RGB変換
> を行おうとプログラムを開始したのですが
> YUV形式の(オフスクリーン)サーフェスの作り方がわかりません
> お助けください!
>

MSDNで検索したら、 以下の変換式が載ってましたよ
記憶が確かなら、YUVにも4:2:2と2:2:2の形式があったと思います。


Computing YUV from RGB

Y = 0.3R + 0.6G + 0.1B
U = B - Y
V = R - Y
or

Y = 0.3R + 0.6G + 0.1B
U = -0.3R - 0.6G + 0.9B
V = 0.7R - 0.6G - 0.1B

Computing RGB from YUV
R = Y + V
G = Y - 0.166667U - 0.5V
B = Y + U
記事検索
Amazon.co.jp
  • ライブドアブログ