• ベストアンサー

クラスの扱いについて

itohhの回答

  • ベストアンサー
  • itohh
  • ベストアンサー率45% (210/459)
回答No.2

こんにちは。itohhといいます。 akino4さんが言われるようにわたしも、引数としてthis(自分自身という意味)を渡します。 ワーカースレッドは、同じクラス内でも別領域になってしまうからです。 下記に簡単な例を載せます、参考にしてください。 ※CreateThreadの代わりにAfxBeginThreadを使用するようにしましょう。 ※テキストボックスを前もってCString型のメンバ変数(m_text)としておきます。 long CAbc::test() { CWinThread* wkpThread=NULL; wkpThread = AfxBeginThread( CAbc::m_Thread, this ); return 0; } UINT CAbc::m_Thread( LPVOID n ) { CAbc* wkThis; wkThis = (CAbc *)n; n->m_text = "テストだよ!!"; return 0; } 他のメンバ関数やメンバ変数を使う場合もn->xxxxxxとします。 ただし、メインスレッドとワーカースレッドは同時に動作するので何らかの排他制御が必要になることもある。

nabezo-
質問者

お礼

ありがとうございました。 大変参考になりました。

関連するQ&A

  • VC++ MFC スピンボタンについて

    VC++ .NET2005でプログラムを作成中です。 スピンボタンで「1~100」までを指定するものがあり、 ※スピンボタン(IDC_SPIN1)、エディットボックス(IDC_SPNED1) スピンボタンで指定されたものを別のエディットボックス(IDC_EDIT1)内に「0」を指定分CStringで表示したいです。 例: スピンボタンで5を指定 ↓ 00000 スピンボタンで15を指定 ↓ 000000000000000 どのようなプログラムにしたらよいのでしょうか? よろしくお願いします。

  • MFCのエディットボックスの値をスピンボタン

    エディットボックスの値をスピンボタンの初期値にしたく、 下記コーディングにしたのですが CString Item; m_Spin->SetPos(((CEdit*)GetDlgItem(IDC_EDIT1))->GetWindowText(Item)); SetPos' : 1 番目の引数を 'void' から 'int' に変換できません。 とのエラーになります。 どのように変更したらよいかお教えください。

  • エディットボックス

    VC++、APIでwindowsプログラムを書いています。ダイアログボックスで質問があります。 case WM_INITDIALOG: SetDlgItemText(hDlg, IDC_EDIT1, "0"); return TRUE; で読み取り専用エディットボックス内に初期値を書き case WM_CTLCOLORSTATIC: { HDC hdc = (HDC)wParam ; SetTextColor( hdc, RGB( 255, 255, 255)) ;// 白色 SetBkMode(hdc, TRANSPARENT); // 背景を透過 return (BOOL)(HBRUSH)GetStockObject(NULL_BRUSH) ; } でダイアログボックス内のスタティックテキストと読み取り専用エディットボックスの背景を同時に透過させているのですが、エディットボックス内の文字を void ddd( HWND hDlg, int xxx) { char ttt[100]; sprintf(ttt,"%d",xxx); SetDlgItemText(hDlg, IDC_EDIT1, ttt); return ; } で書き換えると古いテキストが残ったように表示されます(背景に色を指定すれば古いテキストは残らない)。 うまく表示させるにはどういった方法があるでしょうか? ご存知の方、よろしくお願いします。 ちなみにダイアログボックスにはビットマップが貼ってあります。

  • SetDlgItemInt( ) c++

    今MFCでダイアログを作成いたしました。 IDC_EDIT1というエディットボックスが1つあります。 そのほかにもいろいろありますが、今回はこのエディットボックス内で SetDlgItemInt( )を使って処理したいのです。 //処理内容 double a; a = 10.5; SetDlgItemInt(IDC_EDIT1, (int)a); 以上のようになっています。 SetDlgItemIntの第2引数がUINTなので そのまま SetDlgItemInt(IDC_EDIT1, a); とすると当然怒られてしまう訳ですが、 SetDlgItemInt(IDC_EDIT1, (int)a); とすると逆にエディットボックス内には [10]としか表示されません。 正しく表示させるにはどうしたらよいのでしょうか。 ご教授の程よろしくお願いいたします。

  • エディットボックスで改行

    お世話になっております。 VC++でプログラムを組んでおり、下記の要領でエディットボックスに文字を表示しています。 _itoa(inputData[i], receivedChar, 16 );//数値を文字列に変換 SetDlgItemText(argThr1->hWnd, IDC_EDIT2, receivedChar); このとき、エディットボックス内で、任意の位置で改行しながら表示する方法はありますでしょうか? よろしくお願い致します。 表示例 ABC(改行) DEF(改行)

  • visualC++での文法

    VisualC++を勉強しているのですがどうしても分からないので教えてください。例えばダイアログベースでのMFCプロジェクト test を作り、コントロールにプッシュボタンとエディットボックスを配置し、プッシュボタンのイベントハンドラに void CtestDlg::OnBnClickedButton1() { CEdit* Settext =(CEdit*)GetDlgItem(IDC_EDIT1); Settext -> SetWindowText("OKWEB"); } とすれば、プッシュボタンを押したときにエディットボックスにOKWEBと表示されますよね。 この場合のCEdit* Settext =(CEdit*)GetDlgItem(IDC_EDIT1); の(CEdit*)は何なのでしょうか?最初のCEdit* はSettextがCEdit*クラスを示すポインタになるのは理解できるのですが、(CEdit*)はオブジェクトでそれがGetDlgItemを使っているのでしょうか。それならば、(CEdit*).GetDlgItem(IDC_EDIT1) じゃないのでしょうか?それとも(CEdit*)はキャストか何かなのでしょうか? C++の勉強が足りないのは分かってるのですが、VisualC++の勉強と同時進行なのでどうも混乱しています。詳しい方どうかお願いします。

  • SetWindowText関数について

    プログラミング初心者です。 WINAPI32を用いて、プログラミングに励んでいます。 リソース機能を用いて、親ウインドウのメニューバーからダイアログという形で子ウインドウを開けるようなプログラムを作りました。さらにその子ウインドウ上に、エディットボックスのコントロールを作りました。 例えばそのエディットボックスのIDがIDC_EDIT1なのですが、 子ウインドウを開いた時にすでにそのエディットボックスに数値が入力されているようにしたいのです。 そこで、ダイアログが開かれた時に流れる WM_INITDIALOGのメッセージがきたときに、SetWindowText関数を使えばよいのかな?と思ったのですが、このようなとき第一パラメータにはどのような数値をいれたらエディットボックスに文字列を代入できますか?? IDC-EDIT1といれたら、Struct HWNDに変換してくださいというエラーがでました。 どなたかご教授よろしくお願いいたします。

  • エディットボックスの内容をテキストファイルに書き込み・読み込みしたい

    プログラム初心者です。 VS2005を使用してWindowsアプリケーションの実装を行っているのですが、数個あるエディットボックスの内容を1つのテキストファイルに書き込み、そして後々に読み込みを行いたいと考えています。私の場合、エディットボックスに入力するのは数値のみなので、数値の書き込み・読み込みを行いたいのですがうまくいきません。 そこで質問なんですが、数個のエディットボックスのデータを格納する方法として、それぞれに変数を用いていいのでしょうか。 ex) edit0 = GetDlgItemInt(hDlg, IDC_EDIT1, NULL, TRUE); edit1 = GetDlgItemInt(hDlg, IDC_EDIT2, NULL, TRUE); それとも、1つの変数を配列として用いたほうがいいのでしょうか。 ex) edit[0] = GetDlgItemInt(hDlg, IDC_EDIT1, NULL, TRUE); edit[1] = GetDlgItemInt(hDlg, IDC_EDIT2, NULL, TRUE); もし前者として、その場合はWriteFileで書き込む(読み込む)場合どのようにしたら良いのでしょう。WriteFileを連続で書くとなると、上書きになるのか後ろから追加されるのかイメージがついていない状態です。 わかりずらい説明で申し訳ありません。 ご教授お願いいたします。

  • VC6でエディットボックスの扱いについて

    エディットボックスに複数行のメッセージを送りたいのですが、SetDlgItemText関数を使うと、いつも同じところから文字が出力されてしまうので,うまく行きません。 ちなみに、MFCは使わず、WindowsのAPIでコードを打っています。 どなたか解決方法をご存知の方いらしましたら、宜しくお願いします。

  • MFCマルチスレッドについて

    MFCマルチスレッドについて COMやIOボードからの入力に応じて動作するアプリを作っています。 AfxBeginThreadにてそれぞれワーカスレッドを作成しCOMやIOから入力があれば AfxBeginThreadを呼んでいるクラスにあるメンバ関数を実行しようとしています。 AfxBeginThreadにて*thisを送り、制御関数内で、mycls->OnButton***()というような 感じで現在は作っています。(OnButton***になっているのはデバッグ用にボタンで あらかじめ作成している関数のためです。) このときに、mycls->OnButton***()は親スレッドで動いていると考えていいのですか? あくまで親スレッドのクラスのメンバ関数を制御関数が動いている子スレッドで実行 しているだけなのでしょうか? 実は、ログ表示のため制御関数の中(受信データを表示)と、mycls->OnButton***()の中 (作業結果を表示)に同じエディットコントロールへの表示部分があります。 表示部分の処理は、いったんCStringで読み込んできて最大文字数チェックを行い、 再度文字数を調節して書き直しということをやっているため、一応クリティカル セクションにはしているのですが、実際どう動いているか分からないため、やり忘れ ていることや、やってはいけないことをやってそうです。 すいませんがご教授願います。