縦10ドット、横70ドット の領域を、横に7等分して
虹の色をつける。
□□□■■■■
という感じにしたいんだけど、塗りつぶし関係のソースを
教えてください。

sikaku01 = CreateWindow(
      "STATIC",
      "",
      SS_WHITE | WS_CHILD | WS_VISIBLE,
      0,0,10,10,
      hWnd,
      NULL,
      hInstance,
      NULL);

これを7個作って、sikaku01 の領域の色を変える方法しか
分かりませんでした。
もっといい方法があると思うんです。
領域の色は固定じゃなくて、ランダムにチラチラと変色
させたいから、色を変えられる領域で、その領域を塗りつぶす
方法が知りたいです。
SetPixel( ) での1ドットずつの描画も思いついたけど、
遅いし、領域ごとの塗りつぶしの方法でやりたいと思いました。
コンパイラは BCC32 を使っています。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

WM_PAINTの中からならこんな感じ(テストしてないので間違いあるかも)


HDCさえ取得できれば、FillRectで自由に書き込めます。

PAINTSTRUCT ps;
HDC hdc;
HBRUSH hbrush;
RECT rect;

case WM_PAINT:

hdc = BeginPaint(hwnd, &ps); /* hwnd はウィンドウハンドル */
hbrush = CreateSolidBrush(0x456789); /* COLORREF: 0x00BBGGRR */
rect.left = 0;
rect.top = 0;
rect.right = 10;
rect.bottom = 10;
FillRect(hdc, &rect, hbrush);
DeleteObject(hbrush);
EndPaint(hwnd, &ps);
    • good
    • 0
この回答へのお礼

そのソースで出来ました。
ありがとうございます。

お礼日時:2002/01/10 22:17

四角形なら、APIの Rectangle() が使えます。



7色分の Pen を作っておいて、SelectObject() しながら7回四角形を書けばOKです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
使ったことがなかった関数だったからちょっと難しかったです。
今やっと少しできました。

お礼日時:2002/01/10 22:51

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

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

QSetPixelで描写できない領域があります・・・

下のホームページでWindowsAPIの勉強をしていました。
http://wisdom.sakura.ne.jp/system/winapi/win32/win22.html

それでSetPixel()で線を描いていました。↓のような感じです。
for (iCount = 0 ; iCount < 100 ; iCount++)
SetPixel(hdc , 10 + iCount , 10 , 0xFF);

線の長さを長くしようと思ってiCount < 1000とやってみました。
すると300<iCount<800くらいの領域で線が出ないところが出でしまいました・・・。
もし分かる人がいたら教えてください。

OSはwindows vistaでノートパソコンです。
VC++2008 ExpressEditionを使ってます。

Aベストアンサー

自分も同じ症状に出くわしたので調べてみましたが
VistaでWindows Aeroをオフにするとこの不具合が発生するようです。

自分はAeroをオンにしたところ解決しました。

QCS_HREDRAW|CS_VREDRAWについて

windowの雛形で、WNDCLASSEXのstyleでCS_HREDRAW|CS_VREDRAWを付けても0にしても変わらないのですが、CS_HREDRAW|CS_VREDRAWの意味はあるのでしょうか?CS_HREDRAW|CS_VREDRAWの意味はわかっているのですが、指定しても変わらなかったので質問させていただきました。

Aベストアンサー

> もう一つ質問なのですが基本的にCS_HREDRAW CS_VDRAW は付けといた方がいいのでしょうか?
場合によります。
 ウィンドウのサイズが小さくなった時に再描画が必要な場合は、CS_HREDRAW
CS_VREDRAW は必要でしょう。
例えば、
・画像ビューアで、ウィンドウのサイズ変更した時に、表示する画像を伸縮表示する場合。
・ウィンドウの右側や下側等に、現在時刻を表示するような場合。

> そのコードでやってみましたが、見た感じやっぱり変化なしです。どいうことなのでしょうか?
WM_PAINTの呼ばれる条件が違う事が確認できると思いますが、コンソールを有効にして、
コンパイルしてみましたか?

そもそも、ソースコードを動かしては見たけど、コード自体は読んでないとか
だったりするのでしょうか。

QSendMessage(hW,WM_CREATE,0,0);を

SendMessage(hW,WM_CREATE,0,0);
を実行するとシステムがWM_DOWNやWM_CHARを発行しなくなるみたいです
というのはそれ以降キー入力を無視するようになるのです
いったんアプリをアイコン化してウィンドウ化するとWM_DOWNやWM_CHARを発行するようになります
WM_CREATEを送ってもWM_DOWNやWM_CHARを発行しなくなるのを阻止するために何か方法はないでしょうか?

Aベストアンサー

>プログラムのイニシャライズのために送ったのですが送らないで住むプログラムに変更しました

普通はそんな方法はとりません。
システムが何をするか分からないからです。

自分でメッセージを定義して、初期化処理を行うようするためのメッセージを送るほうが無難です。
WM_CREATEと同じ処理を初期化処理として行わせたいのであれば、初期化処理を関数化して自分で定義したメッセージでも呼び出せばいいのですし。


>作ったプッシュボタンを押してシステムがWM_COMMANDを送ってきた後キー関係のメッセージを送ってくれなくなります

プッシュボタンがキーボードフォーカスを持ってのるでは?

ボタンがキーボードフォーカスを持っていてもキー関連のメッセージを親ウィンドウが受け取りたいのであれば、サブクラス化をするしかないでしょう。

Qfgets((char*)&rbof,sizeof(ADR),fp) != NULL )

第2種情報処理技術者試験 平成7年春 午後 問7
http://www.bohyoh.com/ITEE/C/1995A07.html


中盤の
「while (fgets( (char*)&rbuf , sizeof(ADR), fp )!= NULL ) 」
が読めません

(char*)&rbuf , sizeof(ADR), fp
ファイルポインタからsizeof(ADR)サイズの分だけ取り出した文字を変数(char*)&rbufにほおりこむ

これが自分なりの解釈です
ですが「(char*)&rbuf」が意味不明。。。


根本的に解釈が間違っているのだと思います


詳しくわかる方教えてください

Aベストアンサー

rbufはADR型の構造体です。

&rbufは、ADR型の構造体rbufの実体へのポインタです。

つまり「&rbuf」は「(ADR *)&rbuf」です。

fgetsの引数は「char *」「size_t」「FILE *」ですから
fgets(&rbuf,sizeof(ADR),fp)
と書くと「char *」であるべき引数に「ADR *」を渡す事になります。

すると、コンパイラは「なにしてんねん。fgetsの1番目の引数はchar *やねんで。ADR *を渡されても困るねん」って言って、エラーになります。

なので「&rbufはADR *じゃなくて、char *だと思ってくれ」と書く必要があります。それが「(char *)&rbuf」と言う書き方です。

これを「型キャスト」と言います。

以下の例を参考に、考えてみて下さい。

typedef struct {
  (略)
} ADR;
(略)
  union PTR {
    char *char_ptr;
    ADR *adr_ptr;
  } ptr;
  ADR rbuf;
(略)
  ptr.adr_ptr = &rbuf;
(略)
  fgets(ptr.char_ptr,sizeof(ADR),fp);

この例は、ADR *とchar *を共有する共用体「ptr」を使用し「rbufのポインタ」を「ADR *型のadr_ptr」で受け取り、そのポインタを「char *型のchar_ptr」で参照しています。

つまり「型キャストを使用しないで書くと、上記のように共用体を使うなど、面倒な事をしなきゃなんない」のです。

これが、型キャストを使えば、
typedef struct {
  (略)
} ADR;
(略)
  ADR rbuf;
  fgets((char *)&rbuf,sizeof(ADR),fp);
だけで済んじゃうのです。

rbufはADR型の構造体です。

&rbufは、ADR型の構造体rbufの実体へのポインタです。

つまり「&rbuf」は「(ADR *)&rbuf」です。

fgetsの引数は「char *」「size_t」「FILE *」ですから
fgets(&rbuf,sizeof(ADR),fp)
と書くと「char *」であるべき引数に「ADR *」を渡す事になります。

すると、コンパイラは「なにしてんねん。fgetsの1番目の引数はchar *やねんで。ADR *を渡されても困るねん」って言って、エラーになります。

なので「&rbufはADR *じゃなくて、char *だと思ってくれ」と書く必要が...続きを読む

Q1,1,2,3,5,8,13の合計

初心者ですみませんが、1,1,2,3,5,8,13の合計を出すプログラミングがどうしてもわかりません。どなたかご教示頂けましたら助かります。
宜しくお願いいたします。

Aベストアンサー

#include <stdio.h>

int main(void)
{
   printf("%d\n", 1+1+2+3+5+8+13);
}


人気Q&Aランキング

おすすめ情報