danner の回答履歴
- 閉じてしまったダイアログのエディットボックスへの書き込み禁止方法
VC++ 6.0 MFC ダイアログベースです。 メインダイアログ画面で、ボタンを押下した時に、別ダイアログ(子ダイアログ)が呼び出されて、 その子ダイアログ内では、ワーカースレッドを使用して処理を行い、 処理結果をエディットボックスに表示させています。 子ダイアログを閉じる時に、WaitForSingleObject を使って、スレッドを完全に終了させてからダイアログを閉じるように しているのですが、スレッドの処理が、エディットボックスに書き込む時に閉じてしまうと、 スレッドがそこで止まってしまいスレッドが終了しません。 このような場合どうしたら良いのでしょうか? ・閉じるボタンが押されたら、エディットボックスに書き込まないようにすれば良いと思い、 (フラグを立てて試したのですが、フラグチェック後に閉じるが押されることがあり失敗) // スレッドの開始 m_Thread = AfxBeginThread(ThreadFunc, this); // この時、子ダイアログを閉じてしまうと // INFINITEなので、ずっと止まってしまいます。 CString data = "処理結果"; case 0: m_M0edit.SetWindowText(data); break; case 1: m_M1edit.SetWindowText(data); break; case 2: m_M2edit.SetWindowText(data); break; ・ ・ ・ ・ // 子ダイアログを閉じる時に呼び出されます。 // スレッドでの処理が完全に終わるのを待ちます。 afx_msg void CSelecting_Dlg::OnClose() { DWORD dwRet dwRet = WaitForSingleObject(m_Thread->m_hThread, INFINITE); EndDialog(0); } /***************/ 失敗談 /***************/ // スレッドの開始 m_Thread = AfxBeginThread(ThreadFunc, this); // この時、子ダイアログを閉じてしまうと // INFINITEなので、ずっと止まってしまいます。 CString data = "処理結果"; if (m_openFlag == 1){ //フラグを見て書き込みするかチェックする。 switch (t){ case 0: m_M0edit.SetWindowText(data); break; case 1: m_M1edit.SetWindowText(data); break; case 2: m_M2edit.SetWindowText(data); break; ・ ・ ・ ・ } } // 子ダイアログを閉じる時に呼び出されます。 // スレッドでの処理が完全に終わるのを待ちます。 afx_msg void CSelecting_Dlg::OnClose() { DWORD dwRet m_openFlag = false; //閉じるボタンが押されたら フラグを降ろす。 dwRet = WaitForSingleObject(m_Thread->m_hThread, INFINITE); EndDialog(0); }
- ファイルを読み込むプログラムについて
下のプログラムで分からない所がありますので、教えて頂ければと思います。宜しくお願い致します。 text = fgets(buf,256,fp);はfpのファイルから一行を読み込んでbufに格納するという処理ということは分かります。でも、while文内なので次にこの処理をする時に今度は、2行目(下の段)を読み込むはずですが、プログラム中のどこに2行目に移動させる処理があるのか分かりません。 予想ですが、text = fgets(buf,256,fp);の中にそのような意味の処理が含まれているのでしょうか? どなたかご教授お願い致します。 #include <stdio.h> int main(void) { FILE *fp; char buf[256]; char *text; char flname[256]; printf("ファイル名:"); gets(flname); fp = fopen(flname,"r"); do{ text = fgets(buf,256,fp); if(text != NULL){ printf("%s",text); } }while(text != NULL); fclose(fp); return(0); }
- ベストアンサー
- C・C++・C#
- fujiwara222
- 回答数3
- [VC++][MFC][SDI]ダイアログコントロールもしくわツールバー!!詰まってます!!
現在VC++6.0でMFCを使いSDIのプログラムを作っているのですが、フォームにダイアログバーを張っています。 これをツールバーのように自由に動かしたり、左右上下にドッキングさせたり。 これって実現可能でしょうか? 色々ためしてみたんですが無理でした。 やっぱ不可能ですかね? これが無理なんであればデフォルトで作成されるツールバー([新規作成][開く][保存]等が入ってる)にコントロール(ボタンやリストボックス)を追加して使用、と考えているのですがこれも難しい!!! まだまだ未熟者なのですがどうかご存知の方おられましたらご教授ください!! よろしくお願いします!!
- VC++,SendMessage()の使い方
初心者です。 メニューに、ID_ENGAGEというIDをもつアイテムを作って、CViewにそのハンドラを作りました。 メニューをクリックして確認すると、ハンドラは正常に動いています。 しかし、CView内(OnKeyUp())でSendMessage(ID_ENGAGE)やPostMessage(ID_ENGAGE)を実行しても、ハンドラを呼んでくれないようなのです。 CFrameWndに送る必要があるのかもしれないと、GetParent()->SendMessage(ID_ENGAGE)も試してみましたがうまくいきませんでした。 どうすればうまくいくのでしょうか? お分かりになる方がいらっしゃいましたら、よろしくお願いします。
- ベストアンサー
- C・C++・C#
- hogehogeninja
- 回答数1
- プリンタへ文字列の出力方法について
1、改行コード「\r\n」を含む文字列を取得 2、「印刷」コモンダイアログを呼出す。 3、TextOut()関数で出力する。 すると、改行されずに「・・」と文字化けされて出力される。 どうやらTextOut()関数では、改行コードがサポートされていない様でした。 そこで、質問です。 改行コードを含む文字列を、改行して出力する方法はないでしょうか? TextOut()関数で出力するには、 改行を含む文字列を、改行を含まない文字列に分けるしかないですよね? 良い方法がないかな?と思い質問させて頂きました。 #Win98、VC++、SDKで作成しています。
- プリンタへ文字列の出力方法について
1、改行コード「\r\n」を含む文字列を取得 2、「印刷」コモンダイアログを呼出す。 3、TextOut()関数で出力する。 すると、改行されずに「・・」と文字化けされて出力される。 どうやらTextOut()関数では、改行コードがサポートされていない様でした。 そこで、質問です。 改行コードを含む文字列を、改行して出力する方法はないでしょうか? TextOut()関数で出力するには、 改行を含む文字列を、改行を含まない文字列に分けるしかないですよね? 良い方法がないかな?と思い質問させて頂きました。 #Win98、VC++、SDKで作成しています。
- CreateProcessでの環境変数の設定の仕方
PATHを設定してCommand.comを実行したいのですが、 CreateProcessでの環境変数の設定の仕方がわかりません char* env = "PATH=c:\\data"; CreateProcess(NULL,"command.com /k path ", NULL, NULL, FALSE, 0, env, NULL, &si, &pi); このようにしてみたところDos窓が起動しますが、 表示されるPATHはデフォルトのままです。 環境は VC++6.0 MFC です。 どうか宜しくお願いします。
- VC++でCのプログラムを混在させるには
VC++で拡張子がCのプログラムを挿入、プロジェクト、ファイルの追加で追加 すると atal error C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 のエラーが出ます。 ここでファイル名の拡張子をCPPにすると、追加はできますが、 拡張子Cのままでプロジェクトに追加するにはどうすればいいでしょうか?
- VC++リストビューで選択されている色の変更
リストビューで表示スタイルをレポートにしています。 で、マウスなどでクリックすると当然のごとく青色に選択され、別のウィンドウをクリックすると灰色になるのですが、この青色と灰色両方の色を変えたいのですがどうしたらよいでしょうか?よろしくお願いします。
- タイトルバーやメニューバーの高さ取得
サイズ変更可能なダイアログ ボックスアプリケーションを作っています ダイアログサイズ変更時に GetClientRect( m_DlgSize ); のようにしてサイズを取得し、設定ファイルにm_DlgSizeを保存します 次回起動時にInitDialog()で SetWindowPos( NULL, 0, 0, m_DlgSize.Width(),m_DlgSize.Height() ,SWP_NOMOVE); のように復元しました。 幅はきちんと復元できたんですけど高さが小さくなってしまいます。 どうやらGetClientRectではメニューバーやタイトルバーの高さを含めない座標を返し、 SetWindowPosではそれらも含めてサイズを設定してしまうようです この差を埋めるためにメニューバーやタイトルバーの高さを取得する方法がわかりません。 何か良い方法があったらご教授願います。 環境はVC++6.0 MFCです。
- タイトルバーやメニューバーの高さ取得
サイズ変更可能なダイアログ ボックスアプリケーションを作っています ダイアログサイズ変更時に GetClientRect( m_DlgSize ); のようにしてサイズを取得し、設定ファイルにm_DlgSizeを保存します 次回起動時にInitDialog()で SetWindowPos( NULL, 0, 0, m_DlgSize.Width(),m_DlgSize.Height() ,SWP_NOMOVE); のように復元しました。 幅はきちんと復元できたんですけど高さが小さくなってしまいます。 どうやらGetClientRectではメニューバーやタイトルバーの高さを含めない座標を返し、 SetWindowPosではそれらも含めてサイズを設定してしまうようです この差を埋めるためにメニューバーやタイトルバーの高さを取得する方法がわかりません。 何か良い方法があったらご教授願います。 環境はVC++6.0 MFCです。
- ダイアログのボタンコントロールで困っています
winプログラムを始めて間がない初心者ですが、よろしくお願いします。 ダイアログ上に、ビットマップ画像を使ってボタンを作成するために、 MFCのCButtonのオーナー描画 や CBitmapButtonを使ってボタンコントロールを作成したところ、 ボタンの反応速度が遅く、連続でクリックが出来なくて、困っています。 反応速度の早いボタンコントロールを作成するには、どうすれば良いのでしょうか?