ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.4016504 GetStockObject
質問者:fm27 雑誌に載っているソースファイルの
int WINAPI WinMain(
HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR lpCmdLine, int nCmdShow
) {
WNDCLASS wc;
MSG msg;

wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL , IDC_ARROW);
ここ → wc.hbrBackground = GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = APP_NAME;

ここのところでerror C2440: '=' : 'void *' から 'struct HBRUSH__ *' に変換することはできません。(新しい動作 ; ヘルプを参照)
'void*' から非 'void' 型への変換には明示的なキャストが必要です。とエラーがでてしまいます。なにぶん初心者なものでエラーの意味が分かりません。教えていただけたら嬉しいです。
困り度:
  • すぐに回答を!
質問投稿日時:
08/05/12 13:53
最新から表示回答順に表示

回答

ANo.3 CのプログラムをC++でコンパイルしようとしているとか。
回答者:titokani
種類:アドバイス
どんな人:専門家
自信:参考意見
回答日時:
08/05/12 15:47
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼回答のとうりでした。C言語でコンパイルしたら作動しました。
本当に困っていたのでありがとうございました。

回答

ANo.2 hbrBackground は HBRUSH(HBRUSH__ *)型の変数です。
そこに GetStockObject( )関数の戻り値である HGDIOBJ(void *)型の値を代入しているので型が違うというエラーが出ています。
以前はコンパイラが自動的に型を変換していたのでエラーにならなかったのでしょう。
新しいコンパイラでは
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
又は
wc.hbrBackground = (HBRUSH__*)GetStockObject(WHITE_BRUSH);
のように手動で明示的に型を変換(キャストという)しないといけません。
回答者:php504
種類:回答
どんな人:一般人
自信:参考意見
回答日時:
08/05/12 14:45
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼非常に参考になりました。本当に困っていたのでありがとうございました。非常に分かりやすい説明です。ありがとうございました。

回答

ANo.1 コンパイラのチェックが厳しくなっているのでしょう

wc.hbrBackground = (HBRUSH*)GetStockObject(WHITE_BRUSH);
といった具合に キャストしてやればいいと思いますよ
回答者:redfox63
種類:回答
どんな人:専門家
自信:自信あり
回答日時:
08/05/12 14:07
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼この回答にお礼をつける(質問者のみ)
 
最新から表示回答順に表示