VisualC++でプログラムを組んでいる者です。
ダイアログベース上に定義したコンボボックスとエディットボックスに対して、あるトリガーがひかれると、背景色を赤色に変更したいと思っているのですが、うまく出来ません。
CWnd::OnCtlColor関数を使用するべきなのかなとは思っているのですが、書き方が理解できてないです。
アドバイス宜しくお願いします。

A 回答 (1件)

OnCtrlColorでOKです。


メンバにCBrushを持たせて、そのブラシを塗りつぶしたい色で
初期化してください。
CreateIndirect等が使えると思います。
あとは、そのブラシのGDIハンドルをreturnで返せばよいでしょう。

MSDNにも「メッセージ返送(Message refrection)」のところに
載ってると思います。
参考&工夫してください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QVisualC++.NETかVisualC#.NETか

こんにちは。

今、VisualBasic6でプログラムをしています。今回、VBを卒業してCを勉強したいと思っているのですが、VisualC++.NETとVisualC#.NETの違いがいまいち分かりません。というか、.NETという物自体が分かっていない初心者です。VB6ではランタイムが必要でしたが、この2つではどうなのでしょうか?ちなみにVB歴約2年です。
.NETの基本的なことから教えていただけると非常に助かります。

回答よろしくお願いします。

Aベストアンサー

>ということは、私たち開発側は.NET Frameworkのことを特に意識して開発しなくても良いというわけですよね?

今のところ、Windows XP 以外の OS では、ServicePack をインストールしても、.NET Framework はインストールされません。

この問題を解決する方法の1つは、MSI (拡張子が .msi のセットアップファイルを見たことありませんか?)に対応したインストーラを作成し、.NET Framework のマージモジュールを組み込むというやりかたがあります。
しかし、わざわざインストーラを作るほどの事でもない場合も多いので、その場合は、.NET Framework をインストールしてくれと言うしかありません。

また、C言語のランタイムに関しても、DLL 版のランタイムをリンクすると実行できないという問題が発生します。こちらの問題は、SPx 以上が入っていれば OK、IE xx 以上が入っていれば OK、.NET Framework が入っていれば OK のような事で解決できそうです。これは、1つ前の VC++6.0 にも同じような事が言えます。

とまぁ、あまりいい状況ではありません。.NET Framework も、Windows 98 以降で IE 5.01 以上が必須なので2重に困ったりもしますが、時が解決してくれるだろうと楽観視しています。(回答になっていませんね)

あと、意外と知られていませんが、Visual 開発環境こそありませんが、.NET Framework SDK (無料)をインストールすると、Visual *** Standard 版と同じコンパイラ(C++, C#, VB.NETなど)もインストールされます。勉強の為にフリーのコンパイラを探している人には悪くない選択です。

>ということは、私たち開発側は.NET Frameworkのことを特に意識して開発しなくても良いというわけですよね?

今のところ、Windows XP 以外の OS では、ServicePack をインストールしても、.NET Framework はインストールされません。

この問題を解決する方法の1つは、MSI (拡張子が .msi のセットアップファイルを見たことありませんか?)に対応したインストーラを作成し、.NET Framework のマージモジュールを組み込むというやりかたがあります。
しかし、わざわざインストーラを作るほどの事でもな...続きを読む

QVC++2010のエディットボックスの出力について

VC++2010のエディットボックスの出力について質問させていただきました。


シリアル通信でデータを毎秒受信するプログラムを作成しており、

9_27_23.4_33.00

というデータを受信して エディットボックスに表示しているんですが
9_27_23.4_33.00
9_27_23.4_33.00
9_27_23.4_33.00




という表示を期待しているんですが
改行されず上書きされてしまいます

CString szRecvの中に受信データが格納されており
szRecv = szRecv +"\r\n"を記述しても
改行されませんでした。

どのようにしたら うまく 改行されて表示されるのか よろしくお願いします

Aベストアンサー

CStringが使われているということから、MFCを使っているということでよいでしょうか。

ダイアログクラスの中でどのようにエディットボックスに反映していますか?
MFCでは大きく分けて、DDXによる方法と、直接GetWindowText()/SetWindowText()を使う方法があります。DDXの場合は

UpdateData(TRUE);

でデータを画面からDDX変数(例えばCString型メンバ変数 m_history)に取得し、変数を

m_history = m_history +"\r\n" + szRecv;

のように更新した上で、

UpdateData(FALSE);

を呼び出してDDX変数の内容を画面コントロールに反映させます。

DDXを使わない方法では、エディットコントロール(例えばCEdit型メンバ変数 m_edit)に対して

CString history;
m_edit.GetWindowText(history);
history = history +"\r\n" + szRecv;
m_edit.SetWindowText(history);

とします。

ただし、単に履歴の表示のみで編集する必要がないのであれば、redfox63さんがおっしゃるようにリストボックスやリストビューなどを使用するのが良いです。

CStringが使われているということから、MFCを使っているということでよいでしょうか。

ダイアログクラスの中でどのようにエディットボックスに反映していますか?
MFCでは大きく分けて、DDXによる方法と、直接GetWindowText()/SetWindowText()を使う方法があります。DDXの場合は

UpdateData(TRUE);

でデータを画面からDDX変数(例えばCString型メンバ変数 m_history)に取得し、変数を

m_history = m_history +"\r\n" + szRecv;

のように更新した上で、

UpdateData(FALSE);

を呼び出してDDX変数の内容を画...続きを読む

QCWnd::EnableWindow()の扱い方

 CWnd::EnableWindow()で有効、無効を切り替えるというのはわかりますが、エディットボックスの有効、無効を切り替えるにはどうしたらいいでしょうか?
現在MFCで開発していますが、エディットボックスのメンバ変数にはCStringを使っているので、EnableWindowの使い方がわかりません。
動作環境はWindows2000とNTです。
ツールはVC++6.0を使用しています。

Aベストアンサー

> CEditを使用すると、多くの個所を修正しなくてはならなくなるので、
> 使用することができませんでした。

や、ですから、CString 型の変数は残したまで、
CEdit 型の変数を追加すればよいのです。
ClassWizard の「メンバ変数」-「変数の追加」で、
カテゴリに「コントロール」を選んでください。
(↑方法1)

> ウィンドウハンドルの取得の仕方がわかりません。

ウィンドウハンドルというかポインタの取得方法は、
#1 で episteme さんが書いておられる通りです。
「コントロールID」のところには例えば IDC_EDIT1 などが入ります。
(↑方法2)

Q同じエディットボックスへのDrag&Drop(VC++/MFC)

同じエディットボックスへのDrag&Drop(VC++/MFC)

同じエディットボックスへDrag&Dropすると
テキストが消えてしまう現象に悩んでいます。

現在、
下記のサイト
http://www.softist.com/programming/dandd/dandd.htm
のサンプルプログラムを参考に
コントロール間のDrag&Dropの仕方を学習しています。

このサンプルではエディットボックス間で文字列のコピーができるようになっていますが、
私がほしい機能は文字列の移動です。
そこで、サンプルのEditForDD.cppの
DROPEFFECT DropEffect = OleDataSrc.DoDragDrop(DROPEFFECT_COPY);
の下に、
if(DropEffect == DROPEFFECT_COPY) this->SetWindowTextA("");
という一文を加えて、Drag&Dropする際にDrag元のテキストを削除するようにしました。
その結果、異なるエディットボックス間での移動は可能になりましたが、
Drag元のエディットボックスにテキストを戻そうとすると
テキストが消えてしまいまうようになってしまいました。

このように同じエディットボックスにDrag&Dropをしても
テキストが消えないようにする方法をご存じの方はいらっしゃいませんでしょうか?

なお、開発環境は以下の通りです。

開発環境:Visual Studio 2005 Standard Edition
利用言語:VC++/MFC
OS:Windows XP

よろしくお願いいたします。

同じエディットボックスへのDrag&Drop(VC++/MFC)

同じエディットボックスへDrag&Dropすると
テキストが消えてしまう現象に悩んでいます。

現在、
下記のサイト
http://www.softist.com/programming/dandd/dandd.htm
のサンプルプログラムを参考に
コントロール間のDrag&Dropの仕方を学習しています。

このサンプルではエディットボックス間で文字列のコピーができるようになっていますが、
私がほしい機能は文字列の移動です。
そこで、サンプルのEditForDD.cppの
DROPEFFECT DropEffect = OleDa...続きを読む

Aベストアンサー

Revokeをして同じエディットボックスにはDrop出来ないようにし
Drag&Drop後に再びRegisterをしてはどうでしょうか?

m_DropTarget.Revoke(); //追加
DROPEFFECT DropEffect = OleDataSrc.DoDragDrop(DROPEFFECT_COPY); //DROPEFFECT_SCROLL
if(DropEffect == DROPEFFECT_COPY)
this->SetWindowTextA("");
m_DropTarget.Register(this); //追加

QSystem::Drawing::Color::XXXXを変数に代入可能?

連続で質問するのも申し訳ないのですが・・・

VS2005 C++ Expressを使ってWindowsフォームアプリケーションを作っています。(C++/CLI)

ボタンなどのフォームのプロパティに、色を指定するものがあると思いますが、例えばBackColorを白に変更したい場合、
this->button1->BackColor = System::Drawing::Color::White;
のように書けると思います。

この、「System::Drawing::Color::White」の部分を変数のようにして記述したいのですが、どのように宣言した型を使用すればよいのでしょうか?
例えば仮に「System::Drawing::Color::White」がString文字列であれば、
void func1(int choice){
String^ hoge;

  if(!choice){
    hoge = System::Drawing::Color::White;
  } else {
    hoge = System::Drawing::Color::Red;
  }
  this->button1->BackColor = hoge;
}
こんな風にすると、func1(0);と呼ばれるとボタンの背景が白くなり、0以外の引数だと赤くなると思います。
ですが、System::Drawing::Color::XXXはStringではないのでできません。

この場合、hogeをどのような形で定義すればいいのでしょうか?
あるいは別の方法がありますでしょうか?

よろしくお願いします。

連続で質問するのも申し訳ないのですが・・・

VS2005 C++ Expressを使ってWindowsフォームアプリケーションを作っています。(C++/CLI)

ボタンなどのフォームのプロパティに、色を指定するものがあると思いますが、例えばBackColorを白に変更したい場合、
this->button1->BackColor = System::Drawing::Color::White;
のように書けると思います。

この、「System::Drawing::Color::White」の部分を変数のようにして記述したいのですが、どのように宣言した型を使用すればよいのでしょうか?
例えば仮...続きを読む

Aベストアンサー

#1です。
すいません。
System::Drawing::Color^ hoge;
ではなく
System::Drawing::Color hoge;
でした。


void func1(int choice){
System::Drawing::Color hoge;
  if(!choice){
    hoge = System::Drawing::Color::White;
  } else {
    hoge = System::Drawing::Color::Red;
  }
  this->button1->BackColor = hoge;
}


このカテゴリの人気Q&Aランキング

おすすめ情報