VC++6.0のMFCでプログラムを組んでいます。
OnDrawクラス内であるテキストデータを読み込んで、配列に格納しておいてその中の値がある値を超えたら、文字表示。超えていなければ文字非表示としようと思っているのですが
if(w[16][m]<-700.0){
pDC->SetTextColor(RGB(0,0,0));pDC->TextOut(20,200,"表示文字");
}else{pDC->SetTextColor(RGB(255,255,255));pDC->TextOut(20,200,"表示文字");
}
としてfor文でmを増加させていくのですが、初めの評価だけでずっと変わりません。(初め-700以下なら文字がずっと表示され、以上ならずっと白で表示されます。赤(255,0,0)にして試してみましたところずっと赤が出ました。)
ネットを方々探しましたが、いまいちわからなく困っています。
わかりづらい質問かもしれませんが、よろしくお願いいたします。
No.4ベストアンサー
- 回答日時:
まず、デバイスコンテキストにリージョンを選択するということが何を意味するかです。
SelectObjectの解説には、
> パラメータに領域を指定する形式のメンバ関数は、SelectClipRgn メンバ関数と同じタスクを実行します。
と書かれています。つまり、デバイスコンテキストへの描画を、リージョン内に制限することになります。
CDC::SelectObject
http://msdn.microsoft.com/ja-jp/library/sa8ahz7h …
これを解除するには、SelectClipRgnに対してNULLを与えます。
CDC::SelectClipRgn
http://msdn.microsoft.com/ja-jp/library/txy5hzk3 …
次に、PaintRgnの解説では、単に領域を塗りつぶすとされています。この機能を使用する前に、リージョンを選択する必要があるとはかかれていません。今、開発環境がないので試せませんが、おそらくSelectObjectでリージョンを選択しなくても、PaintRgnは動作します。
CDC::PaintRgn
http://msdn.microsoft.com/ja-jp/library/z38612dh …
さらに、フォント・ペン・ビットマップ・ブラシなどを作成した場合は、それを削除しなければなりません。CFont・CPen・CBitmap・CBrushを使用した場合、これらのデストラクタで自動的に削除されるようになっていますが、デバイスコンテキストに選択された状態だと削除に失敗します。これらのリソースが削除されないと、使用しているリソースの量がどんどん増えていき、限界まで達すると画面表示に支障が出ます。
なので、デバイスコンテキストに選択したものは、元に戻しておく必要があります。
ブラシの場合であれば、
CBrush brushNew;
CBrush* pbrushOld;
pbrushOld = (CBrush*)pDC->SelectObject(&brushNew);
... // 描画などの処理
pDC->SelectObject(pbrushOld);
のようにします。(他にもSaveDCとRestoreDCを使う方法もあります)
ブラシを元に戻す処理を加えるのと、SelectObjectでリージョンを選択している行を試しにコメントにしてみてください。
もし、SelectObjectでリージョンを選択しないとPaintRgnがうまく動作しないようであれば、PaintRgnのあとにpDC->SelectClipRgn(NULL);を入れてみてください。
再度の回答、また詳しい回答ありがとうございます。
pDC->SelectClipRgn(NULL);
を挿入することでとりあえずは意図する表示ができました。
>なので、デバイスコンテキストに選択したものは、元に戻しておく必要があります。
ブラシの場合であれば、
CBrush brushNew;
CBrush* pbrushOld;
pbrushOld = (CBrush*)pDC->SelectObject(&brushNew);
... // 描画などの処理
pDC->SelectObject(pbrushOld);
のようにします。
の部分がまだよくわからないので、教えていただいたURLなどを参考に勉強してみます。
詳しい回答本当にありがとうございました。
No.3
- 回答日時:
PaintRgnするだけなら、リージョンを選択する必要はないのでは?
あと、SelectObjectの戻り値を保存してませんが、ちゃんと元に戻してますか?
SelectObjectでリージョンを選択して、そのままにしてるために、リージョンの外側への描画が無視されているということはありませんか?
ご回答ありがとうございます。
>PaintRgnするだけなら、リージョンを選択する必要はないのでは?
そうなのですか。教科書まる写ししたため訳もわからず使っていました。
>あと、SelectObjectの戻り値を保存してませんが、ちゃんと元に戻してますか?
していません(汗)。よくわからずに使っているので・・・。
>SelectObjectでリージョンを選択して、そのままにしてるために、リージョンの外側への描画が無視されているということはありませんか?
きっとその通りだと思います。試しに
CBrush brushBrush(・・・);
CreateRectRgn(・・・);
pDC->SelectObject(&brushBrush);
としてみましたが、こうすると画像は表示されませんが、テキストは思い通りに表示されました。
リージョンを選択せずにPaintRgnするのはどうすれば良いのでしょうか?もしくは、リージョンを選択しても、外側への描画が反映されるようにするにはどうすれば良いのでしょうか?
ネットで色々探してみましたが分からずです。力不足な私に何かアドバイスいただけないでしょうか?
重ねての質問すみません。
No.2
- 回答日時:
この部分だけ出されても困るので, できるなら OnDraw の部分は全部見せてほしいかな.
あと, w の宣言もお願い.
余談だけど, 「w[16][m] の値が (想定した通りに) 変化している」ことは確認できている?
>この部分だけ出されても困るので, できるなら OnDraw の部分は全部見せてほしいかな
大学の研究なので、全部を見せることはできません(涙)本当なら見せたいところですが・・・。
>あと, w の宣言もお願い.
#define LINE 424000
double w[17][LINE];
です。LINEが大きすぎるんですかね(汗)。
>余談だけど, 「w[16][m] の値が (想定した通りに) 変化している」ことは確認できている?
CBrush brushBrush(RGB(...));//...にはwから計算した値をintでキャストして代入
CRgn myRgn;
myRgn.CreateRectRgn(...);//...には任意のmにより変化する値を代入
pDC->SelectObject(&myRgn);
pDC->SelectObject(&brushBrush);
pDC->PaintRgn(&myRgn);
とうい処理を質問の記述のすぐ後にしていますが、これはmの変化に伴い変化します。映像のようになるのです。これに伴いw[16][m]もmに伴い文字を表示したり、しなかったりしたいのですが・・・。
今わかったのですが、この画像を表示する部分を無効にする(/**/でくくる)と思い通りTextOutの表示は表示されたりされなかったりします。
すべてのソースを記述できずにすみません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) <スプレッドシート>IF関数の複数条件について 5 2022/10/27 14:38
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- Excel(エクセル) Excelの関数についておしえてください。 3 2023/04/20 18:36
- JavaScript セレクトボックスで配列を呼び出したい。 1 2022/07/08 20:14
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/02/10 11:41
- PHP htmlで複数の個数入力欄を表示させるには 1 2022/09/20 03:11
- Excel(エクセル) エクセルの数式で教えてください。 5 2023/02/10 15:11
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/02/15 08:30
- Excel(エクセル) エクセルの数式について教えてください。 2 2023/02/18 11:30
- Visual Basic(VBA) VBA 「,」・空白・カタカナ等の複数条件のマクロ 2 2023/08/23 11:57
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
画面がチカチカする
-
VC++のTextOutの再描画の仕方
-
丸いボタンの表示でCPU100%
-
Win32APIにて、アイコンの情報...
-
BeginPaintの使い方
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
グラフの交点の求め方(Excel)
-
コントロールの書式設定で、“コ...
-
コンボボックス内の文字サイズ変更
-
検索の画面がでなくなってしま...
-
SetWindowText関数について
-
フォントの大きさ
-
DateTimePickerでに年月までし...
-
PCで「使用可能な場合はグラフ...
-
vbaから他のアプリを終了
-
エクセルである行が急に消えて...
-
エクセルのコントロールツール...
-
文字色 エクリプス
-
CTなどでいう,ウィンドウレベ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンテキスト依存とは?
-
Win32APIにて、アイコンの情報...
-
PlgBltでの透過
-
画面がチカチカする
-
GetDC()とCreateCompatibleDC()
-
VBでFD、USBの有効・無効...
-
VC++でBitmapとText文字を表示...
-
コントロール内の文字の背景色
-
画像処理 ビットマップ ダブ...
-
BitBlt関数について教えてください
-
メモリデバイスコンテキスト&...
-
Rectangleで、リソースが解放さ...
-
画面のちらつきについて
-
Windowsプログラミング 画面描...
-
ビットマップ(表示速度とサイズ)
-
メモリデバイスコンテキストを...
-
ダブルバッファの作り方
-
TextOutについて
-
SetWindowRgn()関数について。
-
領域を塗りつぶしたい
おすすめ情報