アプリ版:「スタンプのみでお礼する」機能のリリースについて

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;
}

A 回答 (2件)

変数の寿命を理解していないから起こる問題だと思います。


RECT rcPos;
はローカル変数なので関数を抜けるまでの寿命です。

つまり、WM_LBUTTONDOWNメッセージ時のrcPosとWM_PAINTメッセージ時のrcPosは違う変数なのです。なので値が引き継がれません。

staticにするとかグローバル変数にするとか変数寿命をコントロールしてください。
    • good
    • 0
この回答へのお礼

返事が遅くなって申し訳ありません。


static RECT rcPos;
にすればうまく行きました。

メッセージで変数が違うとは…
勉強不足でした。どうもありがとうございますm(_ _)m

お礼日時:2013/05/07 21:50

詳しく見てないけど,パッと見た感じでは


RECT rcPos;

static RECT rcPos;
に変更する。
    • good
    • 0

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