WritePrivateProfileStringについて

このQ&Aのポイント
  • WritePrivateProfileStringについての質問
  • OnMouseMove()関数にコードを記述するとiniファイルが作成されるが、OnLButtonUp()関数では作成されない
  • OnLButtonUp()関数でもiniファイルを作成する方法を教えてほしい
回答を見る
  • ベストアンサー

WritePrivateProfileStringについて

下記コードをOnMouseMove()に記述すると、ちゃんとiniファイルが作成されますが、OnLButtonUp() 内では作成されません。 どうしてなのか教えていただきたいです。 OnLButtonUp() でiniファイルが作成されるようにするにはどうすれば良いでしょうか? どうぞよろしくお願いいたします。 ************************ void CMyWnd::OnMouseMove(UINT nFlags, CPoint point) { // *********ウインドウを移動するたびにウィンドウ位置を保存 int nX,nY;//ウィンドウの左上の座標を格納する変数 WINDOWPLACEMENT wp;//WINDOWPLACEMENT構造体 char szBuffer[32];//キーの値を格納する char aaa[10]; wp.length = sizeof(WINDOWPLACEMENT); GetWindowPlacement(&wp); nX = wp.rcNormalPosition.left; nY = wp.rcNormalPosition.top; wsprintf(aaa,"%d",nn); wsprintf(szBuffer,"%d",nX); WritePrivateProfileString(aaa,"X",szBuffer,"d:\\kado.ini"); wsprintf(szBuffer,"%d",nY); WritePrivateProfileString(aaa,"Y",szBuffer,"d:\\kado.ini"); nn--; CWnd::OnMouseMove(nFlags, point); }

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

システムのキャッシュバッファに溜め込まれてるだけじゃないんですか? このキャッシュはINIファイル関数独自のバッファなので、他からは制御できません。 GetPraivateProfileで書き込んだ内容を書き込んだ直後に確認してみてください。 おそらく読めますよ。 あとは、ファイル名以外のパラメータをNULLにして呼び出せば、バッファの中身はフラッシュされて、ファイルに書き込まれます。

VitaminBB
質問者

お礼

いつもありがとうございます。 他のコードの影響で、OnLButtonUp() が実行されていないことが原因でした。

関連するQ&A

  • 終了時と同じウィンドウ位置で表示するには?

    付箋紙ソフトもどきを作っています。 ダイアログのボタン押し下げにて新たなウィンドウが何個も生成されるようになっています。 アプリを終了して再度起動すると、終了前に表示されていたウィンドウが終了前と同じ位置に表示されるようにしたいと思っています。 以下のコードでは、全てのウィンドウが同じ場所に表示されてしまいます。 どのようにすれば、各ウィンドウがそれぞれの元の位置に表示されるようにできますか? 各ウィンドウ毎に位置情報を保存、読出しするにはどうすれば良いのでしょうか? よろしくお願いします。 BOOL CMyWnd::kado_Create(CWnd* parent,CString m_InputData){ int nX,nY;//ウィンドウの位置を格納する変数 nX = GetPrivateProfileInt("Pos","X",0,"TSHANG2.INI"); nY = GetPrivateProfileInt("Pos","Y",0,"TSHANG2.INI"); 略 CreateEx( dwExStyle, lpszClassName, _T("Test"), dwStyle, rect, parent, NULL, NULL); 略 } void CMyWnd::OnDestroy() { int nX,nY;//ウィンドウの左上の座標を格納する変数 WINDOWPLACEMENT wp;//WINDOWPLACEMENT構造体 char szBuffer[32];//キーの値を格納する wp.length = sizeof(WINDOWPLACEMENT); ::GetWindowPlacement(m_hWnd,&wp); nX = wp.rcNormalPosition.left; nY = wp.rcNormalPosition.top; wsprintf(szBuffer,"%d",nX); WritePrivateProfileString("Pos","X",szBuffer,"TSHANG2.INI"); wsprintf(szBuffer,"%d",nY); WritePrivateProfileString("Pos","Y",szBuffer,"TSHANG2.INI"); 略 }

  • xxx.iniファイルのデータ消去について

    よろしくお願いいたします。 アプリ終了時にWritePrivateProfileString(aaa,"X",szBuffer,"d:\\kado.ini");を使ってデータを書きこんでいます。 書きこむデータ数が一定ではないため、書きこむ前にデータを一旦消去したいのですが、そのような関数はあるのでしょうか? ご存知でしたらお教えください。 # 今は通常のファイルオープン if((fout=fopen("d:\\kado.ini","w"))==NULL) ・・・ で処理をしているのですが、WritePrivateProfileStringでの書きこみが出来るときと出来ないときが繰り返しで発生する不具合が生じています。

  • 宣言による処理の重さ

    第161章 キーボード・フック http://www.kumei.ne.jp/c_lang/sdk2/sdk_161.htm このサイトのLRESULT CALLBACK MyHookProc(int nCode, WPARAM wp, LPARAM lp)で {   char str[256];   if (nCode < 0)     return CallNextHookEx(hMyHook, nCode, wp, lp);   if (wp >= 0x30 && wp <= 0x39) {     wsprintf(str, "hMyHook = %d", hMyHook);     MessageBox(NULL, str, "MyHookProc", MB_OK);     return CallNextHookEx(hMyHook, nCode, wp, lp);   }   wsprintf(str, "キー入力はインターセプトされました\n フックハンドル= %d", hMyHook);   MessageBox(NULL, str, "インターセプト", MB_OK);   return TRUE; } と書いてありますが、char str[256];をstatic char str[256];にしたり、 {   if (nCode < 0)     return CallNextHookEx(hMyHook, nCode, wp, lp);   if (wp >= 0x30 && wp <= 0x39) {     char str[256];     wsprintf(str, "hMyHook = %d", hMyHook);     MessageBox(NULL, str, "MyHookProc", MB_OK);     return CallNextHookEx(hMyHook, nCode, wp, lp);   }   wsprintf(str, "キー入力はインターセプトされました\n フックハンドル= %d", hMyHook);   MessageBox(NULL, str, "インターセプト", MB_OK);   return TRUE; } にするとアプリケーションのパフォーマンスはよくなりますか?

  • CPtrArrayクラスの使い方

    CPtrArrayクラスを勉強しています。 以下コードを見つけたので、pElementに444が入っているのだろうと思ってAfxMessageBoxで見ようとしたら、でたらめな数字が表示されます。 どうしてなのでしょか? void CXxxView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください // 配列の宣言 CPtrArray m_PtrArray; // 配列への要素の追加 int* pi = new int; *pi = 444; m_PtrArray.InsertAt(m_PtrArray.GetSize(), pi); // 配列の要素の取得 int* pElement = (int*)m_PtrArray.GetAt(0); //ここから追加 char aa[10]; sprintf(aa,"%d",pElement); AfxMessageBox(aa); //ここまで追加 CView::OnLButtonDown(nFlags, point); }

  • ビットマップの表示ができません。

    Visual Studio.net 2003 MFCを使用しています。 ビットマップの表示とフォームのサイズ変更はできたのですが、 以下のソースのように フォームのサイズをビットマップのサイズに変更すると ビットマップが表示されません。 一瞬表示はされているようですが、 真っ白になります。 フォームをきちんとビットマップのサイズに変更し、 ビットマップを表示するにはどうすればいいでしょうか? int num=35; void CProject1View::OnLButtonUp(UINT nFlags, CPoint point) {   // TODO : ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。   char str[128];   wsprintf(str,"c:\\test\\%d.bmp",num);num++;   HBITMAP hbm = (HBITMAP)LoadImage(NULL, str, IMAGE_BITMAP,0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION );   CBitmap *pBmp = CBitmap::FromHandle( hbm );   BITMAP bmp;   GetObject(hbm,sizeof(bmp),&bmp );   CDC bmpdc;   CDC *mydc=GetDC();   bmpdc.CreateCompatibleDC(mydc);   CBitmap *pOldBmp = bmpdc.SelectObject(pBmp);   GetParentFrame()->SetWindowPos(&wndTop,0,0,bmp.bmWidth,bmp.bmHeight,SWP_NOMOVE);   mydc->BitBlt( 0, 0,bmp.bmWidth, bmp.bmHeight, &bmpdc, 0, 0, SRCCOPY );   bmpdc.SelectObject(pOldBmp);   DeleteObject(hbm);   CView::OnLButtonUp(nFlags, point); }

  • c言語による画像処理について

    いつもお世話になってます。 c言語を使った画像処理を学び始めました。 入力画像の白(RGB値255,255,255)以外の画像を黒(RGB値0,0,0) に変換するプログラムを作成したいと思っているのですが、 入力画像の大きさによっては正常に命令を実行してくれないことがあるので、 改善点をご教示いただきたいと考え投稿させていただきました。ソースプログラムは #include<stdio.h> #define nx 100 //画像の幅 #define ny 100 //画像の高さ int main(void) { FILE *fp,*fp2; int i,j; unsigned char header[54]; unsigned char screen[nx][ny][3]; /* ファイルから読む */ fp=fopen("input.bmp","rb"); //ビットマップ形式 ,24ビットカラー fread(header,1,54,fp); // ヘッダ(54バイト)を飛ばす */ fread(screen,1,nx*ny*3,fp); // 残りはデータ(最下行から順に入る) //(255,255,255)以外なら黒(0,0,0)に for(j=0;j<ny;j++) for(i=0;i<nx;i++) if(screen[j][i][0]!=255||screen[j][i][1]!=255||screen[j][i][2]!=255){ screen[j][i][0]=0; screen[j][i][1]=0; screen[j][i][2]=0; } fclose(fp); /* ファイルに書く */ fp=fopen("output.bmp","wb"); fwrite(header,1,54,fp); /* ヘッダ */ fwrite(screen,1,nx*ny*3,fp); /* データ */ fclose(fp); return 0; } となっています。ここで、画像の高さ、幅を100以下にすると正常に変換できなくなります。 どなたか原因がお分かりでしたらお知らせ願えないでしょうか?

  • 変数のプロセス間共有について

    現在マウスフックを利用して、マウスの左ボタンが上げられた座標を エディットコントロールに表示するプログラミングを作成しています。 自作ウインドウ上でマウスを押したところ、座標はしっかりと表示されたのですが、 他のアプリケーション上やデスクトップ上で押しても反応してくれません。 いろいろググってみると、#pragma data_seg()を使って変数を共有する必要があるとのこと…。 しかしどうやっても解決しません。 どなたか助けて下さい!! #pragma data_seg("MY_DATA") POINT pt[100] = {0}; HWND hEdit = 0; int top = 0; TCHAR szBuf[1024] = {0}; #pragma data_seg() …… EXPORT LRESULT CALLBACK MyHookProc(int nCode, WPARAM wp, LPARAM lp) { TCHAR str[100]; MOUSEHOOKSTRUCT *pmh; pmh = (MOUSEHOOKSTRUCT *) lp; if(nCode < 0) return CallNextHookEx(hHook, nCode, wp, lp); if(wp == WM_LBUTTONUP){ pt[top].x = pmh->pt.x; pt[top].y = pmh->pt.y; wsprintf(str, TEXT("x: %d, y: %d, top: %d\r\n"), pt[top].x, pt[top].y, top); lstrcat(szBuf, str); SetWindowText(hEdit, szBuf); top++; return CallNextHookEx(hHook, nCode, wp, lp); } return CallNextHookEx(hHook, nCode, wp, lp); } <環境> Visual C++ 2005 Express Edition

  • cygwinを使ってcsvファイルを読み込み、出力させようとしています

    cygwinを使ってcsvファイルを読み込み、出力させようとしています。 とりあえず、読み込みのみのプログラムを作成し、 実行させてみたのですが(run ファイル名.csv と入力) 「Error: could not start C:\cygwin\home\ユーザー名ファイル名.csv」 と出力され、読み込みができず、困っています。 プログラム初心者です。 恐縮ですがご回答よろしくお願いします。 以下に、読み込みプログラムとcsvファイルを記載します。 (プログラムは拾い物です。) <プログラム> #include <stdio.h> #define MAX_ITEM_SIZE 100 #define MAX_LINE_SIZE 1024 char *GetCSVItem(char *wp, char *buff, int size); void main(int argc, char *argv[]) { FILE *fp; char buff[MAX_LINE_SIZE], *wp, item[3][MAX_ITEM_SIZE]; int i1, len; if(argc != 2){ printf("comand error nyuuryoku keishiki\n"); return; } fp = fopen(argv[1], "r"); if(fp == NULL){ printf("can not open file[%s].\n", argv[1]); return; } for(;;){ if(fgets(buff, MAX_LINE_SIZE, fp) == NULL) break; len = strlen(buff); if(len == 0 || buff[len-1] != '\n'){ if(feof(fp) == 0){ printf("data error[%s].\n", buff); return; } } buff[len-1] = '\0'; wp = buff; if((wp = GetCSVItem(wp, item[0], MAX_ITEM_SIZE)) == NULL){ printf("error(1)\n"); break; } if((wp = GetCSVItem(wp, item[1], MAX_ITEM_SIZE)) == NULL){ printf("error(2)\n"); break; } if((wp = GetCSVItem(wp, item[2], MAX_ITEM_SIZE)) == NULL){ printf("error(3)\n"); break; } if(*wp != '\0'){ printf("error(4)\n"); break; } for(i1 = 0; i1 < 3; i1++){ printf("%d:%s\n", i1+1, item[i1]); } } fclose(fp); } char *GetCSVItem(char *wp, char *buff, int size) { int i1; buff[0] = '\0'; while(*wp == ' ' || *wp == '\t') wp++; if(*wp == '\0'){ return(NULL); } for(i1 = 0; i1 < MAX_ITEM_SIZE; i1++, wp++){ if(i1 >= size) return(NULL); buff[i1] = *wp; if(*wp == '\0'){ buff[i1] = '\0'; return(wp); } if(*wp == ','){ wp++; buff[i1] = '\0'; break; } } return(wp); } <csvファイル> 1,2,3 11,12,13 21,22,23

  • C言語  二次元配列

    C言語をやることになり苦戦しています。 CSVファイルからデータを呼び出し、二次元配列として出力したいのですが上手くいきません。 CSVファイルには英数字が混ざっており、エクセルでいう、11行と1440列ほどのデータがあります。初心者なりに書いてみたのですが、どこから手を付けたらいいかわかりません。 是非ヒントを頂けるとうれしいです。よろしくお願いします。 理想 [0][0] = [testtesttest] [0][1] = [testtesttesttest] 一行が終わりしだい [1][0] = [testtesttesttest] と変わっていくようにしたいです。 エラーが出ますが、コードを記載させていただきます。 コード #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main(void) { //ストリームポインタ FILE *fp; int kk = 0; int nn = 0; int hoge; //ファイルから読み込んだテキスト1行分を格納するためのchar配列を指定します int piyo[11][1440]; //*filename : 開くファイル名を指定 char *fname = "./test1/test2/201509/test.csv"; //ファイルが無かったり,指定フォルダでなければ、FILE変数fpはNULLが返ります。 fp = fopen(fname, "r"); //NULLが返ってきた場合の処理 if (fp == NULL) { printf("%sファイルが開けません¥n", fname); return -1; } //ファイルから1行ずつ読み込む成功すると、読み込んだ文字列のポインタを返し、失敗すると、NULLを返します。 while (1 == fscanf(fp, "%c,", &hoge)) { piyo[kk][nn] = hoge; printf("[%d][%d]=%d\n", kk, nn, piyo[kk][nn]); nn++; if (1440 == nn) { kk++; nn = 0; } } //FILE *fp : fopen()で取得したファイルポインタ fclose(fp); return 0; }

  • プログラミング(構造体、ファイル入出力、コマンドライン引数)

    プログラミング(C言語)の質問です。 コマンドライン引数を使って3点の座標の並びが1レコードに記録されたファイルを読み込み、3点の並びが、時計回りに三角形を形作るか、反時計回りに三角形を形作るか、直線(あるいは一点)上にあるかを判定し、読み込んだ各レコードを判定に従って、3つの出力ファイル(時計回りだけのファイル、反時計回りだけのファイル、直線だけのファイル)に分配して書き込むプログラムを作成しています。しかし、なかなか完成しない上、どこが間違っているのかも分かりません。下に私が作ったプログラムを添付しておくのでどこが間違っているのか指摘してください。よろしくお願いします。 #include <stdio.h> #define BUFLEN 1024 int main(int argc, char *argv[]){ int difference_x1, difference_y1, difference_x2, difference_y2; int cross_product; char buf[BUFLEN]; struct points{ int x; int y; } point_a, point_b, point_c; FILE *fp1, *fp2; while(fgets(buf, BUFLEN, fp1) != NULL){ fp1 = fopen(argv[1], "r"); fgets(buf, BUFLEN, fp1); sscanf(buf, "%d,%d,%d,%d,%d,%d", &point_a.x, &point_a.y, &point_b.x, &point_b.y, &point_c.x, &point_c.y); difference_x1 = point_b.x - point_a.x; difference_y1 = point_b.y - point_a.y; difference_x2 = point_c.x - point_a.x; difference_y2 = point_c.y - point_a.y; cross_product = difference_x1 * difference_y2 - difference_x2 * difference_y1; if(cross_product < 0){ fp2 = fopen("clockwise.txt", "w"); }else if(cross_product > 0){ fp2 = fopen("counterclockwise.txt", "w"); }else if(cross_product == 0){ fp2 = fopen("straightline.txt", "w"); } fprintf(fp2, "%d,%d,%d,%d,%d,%d", point_a.x, point_a.y, point_b.x, point_b.y, point_c.x, point_c.y); fclose(fp2); } fclose(fp1); return 0; }

専門家に質問してみよう