C言語のWindowsプログラムで、左クリック後に四角形の描画をしたいのですがうまくいきません。
WM_LBUTTONDOWNイベントで定義したRECT構造体を、別の関数に渡しRectangleで描画したいのですが、その関数内でRECTの値を調べるととんでもない値になっています。
何度やってもどうして値がおかしくなるのかわかりません。
WM_LBUTTONDOWNもWM_PAINTも正常に反応していると思います。
どうか知恵をお貸しくださいm(_ _)m
以下ソースコードのメッセージ処理部分です。
ウィンドウ生成のひな型はサイトの物を丸写しし、正常に動作することを確認しています。
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg,
WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rcPos;
switch (msg){
case WM_LBUTTONDOWN:
rcPos.top =0;
rcPos.left =0;
rcPos.bottom =100;
rcPos.right =100;
InvalidateRect(hWnd, &rcPos, FALSE);
break;
//ウィンドウの描画
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
DrawGr(hWnd, hdc, &rcPos);
EndPaint(hWnd, &ps);
break;
//ウィンドウの削除
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd, msg, wParam, lParam));
}
return (0L);
}
//描画
int DrawGr(HWND hWnd, HDC hdc, RECT *rcPos)
{
int i;
HBRUSH hBrush, hOldBrush;
char *str_org = "rc.top=%d rc.left=%d rc.bottom=%d rc.right=%d";
char strx[256];
//四角形
hBrush = CreateSolidBrush(RGB(100, 100, 255));
hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);
//デバッグ用
wsprintf((LPSTR)strx, (LPCSTR)str_org, rcPos->top, rcPos->left, rcPos->bottom, rcPos->right);
MessageBox(hWnd, (LPCSTR)strx,
(LPCSTR)"終了確認", MB_OKCANCEL | MB_ICONQUESTION);
Rectangle(hdc, rcPos->left, rcPos->top, rcPos->right, rcPos->bottom);
SelectObject(hdc, hOldBrush);
DeleteObject(hBrush);
return 0;
}
No.2ベストアンサー
- 回答日時:
変数の寿命を理解していないから起こる問題だと思います。
RECT rcPos;
はローカル変数なので関数を抜けるまでの寿命です。
つまり、WM_LBUTTONDOWNメッセージ時のrcPosとWM_PAINTメッセージ時のrcPosは違う変数なのです。なので値が引き継がれません。
staticにするとかグローバル変数にするとか変数寿命をコントロールしてください。
返事が遅くなって申し訳ありません。
static RECT rcPos;
にすればうまく行きました。
メッセージで変数が違うとは…
勉強不足でした。どうもありがとうございますm(_ _)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
クラリス・インパクトに代わる...
-
Minecraft 統合版(PC)の描画距...
-
StretchBlt関数について
-
SHGetFileInfoでアイコンが取得...
-
NVIDIAのシェーダーキャッシュ
-
ピクチャーコントロールへの描...
-
VC++プログラムをつかったBMP画...
-
逐次的なグラフ表示の方法
-
VB6,リストボックスの特定行の...
-
画面全体を再描画させたい
-
C言語・Windows RECTが渡せない
-
MFCでOnPaintのタイミング
-
CScrollViewの使用方法について
-
エクセルで作った新しいウイン...
-
コントロールの書式設定で、“コ...
-
ゲームでは結局どっちが良いの?
-
グラフの交点の求め方(Excel)
-
「アイテムは収集されました」...
-
マインクラフト(pc版)で座標...
-
検索の画面がでなくなってしま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6,リストボックスの特定行の...
-
word
-
NVIDIAのシェーダーキャッシュ
-
MFCでOnPaintのタイミング
-
Minecraft 統合版(PC)の描画距...
-
google Colabでmatplotlibの描...
-
TextBoxに文字を書いても表示さ...
-
[VB.net] DataGridViewの列ヘッ...
-
UpdateData( FALSE); による文...
-
OneNote 2010 文字と描画がずれる
-
Labelの文字をスクロールする際...
-
InvalidateRectの使い方について
-
VB.netでのライン描画方法がわ...
-
CStaticコントロールの静的イメ...
-
VC++プログラムをつかったBMP画...
-
WM_SIZEとWM_SIZINGの違い (Win...
-
エクセルでガンチャートを作成...
-
c言語を使いダイアログにbmpを...
-
WM_PAINT
-
MFCのタイマーのつかい方を教え...
おすすめ情報