win32プログラムでの色設定と削除方法について

このQ&Aのポイント
  • win32プログラムでの色設定と削除方法についての要約文1
  • win32プログラムでの色設定と削除方法についての要約文2
  • win32プログラムでの色設定と削除方法についての要約文3
回答を見る
  • ベストアンサー

win32プログラム

以下のコードで 1、CreateSolidBrush()で色設定しつつ 2、SelectObject()で、前のブラシのハンドルを受け取り 3、DeleteObject()で前の色を削除。     これらを一つの文で行っているんですか?  これらの記述は、一般的な方法ですか?  ブラシ(CreateSolidBrush()など)特に削除しなくても、  プログラム 出来る気がしますが、  削除しないと何か問題はありますか?  教えてください。 SelectObject ( hdc,CreateSolidBrush( RGB( 255,0,255))); Polygon(hdc,a,6); DeleteObject( SelectObject( hdc, CreateSolidBrush(RGB(55,77,33)))); PolyPolygon(hdc,b,d,2); DeleteObject( SelectObject(hdc, GetStockObject(WHITE_BRUSH)));

質問者が選んだベストアンサー

  • ベストアンサー
  • furyfox
  • ベストアンサー率56% (58/103)
回答No.1

削除しないとシステムリソースを食います。 Win9X系は非常にリソースが少ない為、CreateSolidBrushを削除せずにループさせれば簡単に失敗させる事ができます。 特にCreateBitmapのハンドルを開放せずにCreateBitmapを使い続ければすぐにシステムリソース不足に 陥ります。(プロセス終了時には開放されると思います。) もちろん2000/Xpも無限にシステムリソースがあるわけではないですし、 他のアプリケーションにも影響する為、開放するべきです。 SelectObjectでも前のハンドルを受け取れますが そもそもCreateSolidBrushが必ず成功することが前提になっているコードは あまりよくないです。せめてエラーメッセージ等を出すようにしましょう。

startover
質問者

お礼

すばやい回答ありがとうございます。 >削除しないとシステムリソースを食います。 すっごく勉強になりました! いろいろ教えていただきありがとうございます!

関連するQ&A

  • C 多角形を半透明に塗る方法

    C#の、多角形を半透明に塗るプログラムがあります。 Point[] pa; SolidBrush brush1 = new SolidBrush(Color.FromArgb(128,Color.Black)); g.FillPolygon(brush1, pa); これと同じことをCで記載したいので http://www.geocities.jp/ky_webid/win32c/010.html や http://wisdom.sakura.ne.jp/system/winapi/win32/win29.html を参考にして、やっと多角形の塗りつぶし(赤)まではできました。 が、半透明にする方法がわかりません。 よろしくお願いします。 POINT pa[]; SelectObject(hdc , CreateSolidBrush(0xFF)); SetPolyFillMode(hdc , WINDING); Polygon(hdc , pa , n); DeleteObject(SelectObject(hdc , GetStockObject(WHITE_BRUSH)));

  • SelectObjectの戻り値

    SDKについて勉強中なのですSelectObject関数についてどうしても引っかかることがあります。 とあるサイトにはSelectObjectは、前に結びついていたハンドルを戻り値とすると書いてありました。 http://kerochan.no-ip.com/vcsdk/letsprog/chap14.htm に書いてある例で、 ******************************************* hBit = CreateCompatibleBitmap(hdc,ScrnSize.right,ScrnSize.bottom); SelectObject(memdc,hBit); SelectObject(memdc,hBit);*****(1) hBrush = (HBRUSH)GetStockObject(WHITE_BRUSH); hDefBrush = SelectObject(memdc,hBrush);*****(2) PatBlt(memdc,0,0,ScrnSize.right,ScrnSize.bottom,PATCOPY); ReleaseDC(hwnd,hdc); SelectObject(memdc,hDefBrush);*****(3) DeleteObject((HGDIOBJ)hBrush); ****************************************** となっているのですが、(1)でmemdcと関連付けたビットマップハンドル(hBit)は、(2)でmemdcに新たにブラシハンドル(hBrush)と関連付けることによって切り離されてしまうのでしょうか?それとも切り離されるものは種類単位なのでしょうか?ブラシハンドルを関連付けたら前のブラシハンドルが返って来るとか・・ SelectObject関数の戻り値に付いていまいちはっきりしていないのでわかる方がいらしたらよろしくお願いします。

  • SelectObjectについて

    SelectObject関数で例えば、 hbrush=SelectObject(hdc,CreatesolidBrush(RGB(0,0,0,)); Rectangle(hdc,0,0,100,100); SelectObject(hdc,hbrush); でやる場合、なぜ、SelectObject(hdc,hbrush);で前の色に戻るはずなのに 戻らないのでしょうか?この意味はあるのでしょうか? 環境はVC++2005です。

  • DeleteObjectについて(初心者です)

    今こちらのサイトを参考に、APIを学んでいるものです。 http://wisdom.sakura.ne.jp/system/winapi/win32/win26.html 質問させて頂きますのはここの部分です。 LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) { HDC hdc; static LOGPEN lopnPen; PAINTSTRUCT ps; switch (msg) { case WM_DESTROY: PostQuitMessage(0); return 0; case WM_CREATE: lopnPen.lopnStyle = PS_SOLID; lopnPen.lopnWidth.x = 5; lopnPen.lopnColor = 0XFF; return 0; case WM_PAINT: hdc = BeginPaint(hwnd , &ps); SelectObject(hdc , CreatePenIndirect(&lopnPen)); Ellipse(hdc , 10 , 10 , 200 , 50); DeleteObject(SelectObject(hdc , GetStockObject(WHITE_BRUSH))); EndPaint(hwnd , &ps); return 0; } return DefWindowProc(hwnd , msg , wp , lp); } 一度yahoo知恵袋にて質問したのですが、別の面で少し疑問が残ったのでここでもう一度質問させて頂きます。 SelectObjectは引数で渡されたオブジェクトを選択中にし、返り値として以前に選択していたオブジェクトを返すという回答がありましたが、それならば DeleteObject(SelectObject(hdc , GetStockObject(WHITE_BRUSH))); のGetStockObjectの引数WHITE_BRUSHを別のもの(例えばBLACK_PEN)に置き換えても、返り値は以前選択していたオブジェクトのままなので何も相違ないはずですよね? 当方理解もままならない初心者ですから盛大な勘違いをしているかもしれません。 分かる方、どうかご教授お願いします。

  • グラフィカルパスについて

    グラフィカルパスについて教えてほしいことが2つあるんですが。 (1)1つ目は下記のソースのようにでフォントを作成しないと描画できないないのですが、その理由を教えて下さい。 デフォルトのフォントだとなぜダメなのでしょうか? (2)2つ目はフォントを作成した場合に、SetBkMode()の部分をコメントアウトすると、背景が塗りつぶされ、文字が塗りつぶされませんが、どうしてでしょうか?(このときフォント作成のコメントアウトは解除して下さい) MSDNにFillPath()の説明に「パスの内部を塗りつぶす」とありますが、このとき文字は「内部」の扱いにならないのでしょうか? どれが内部でどれが外部になるのかよく理解できていないだと思います。 // HFONT hFont; char Str[] = "ABCDE"; HDC hdc = GetDC( hWnd ); BeginPath( hdc ); SetBkMode( hdc, TRANSPARENT ); /* hFont = CreateFont( 80, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, ANSI_CHARSET ,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS ,DEFAULT_QUALITY, 0 ,NULL ); SelectObject( hdc ,hFont ); */ TextOut( hdc, 0, 0, Str, lstrlen(Str) ); EndPath( hdc ); SelectObject( hdc, CreateHatchBrush(HS_DIAGCROSS ,0xFF) ); FillPath( hdc ); SelectObject( hdc ,GetStockObject( SYSTEM_FONT ) ); // DeleteObject( hFont ); DeleteObject( SelectObject( hdc, GetStockObject(WHITE_BRUSH) ) ); ReleaseDC( hWnd, hdc ); どなたか分かる方いらっしゃいましたらご教授下さい。 よろしくお願いします。

  • 重なり z-index

    HWND hrs;//プロト hrs = CreateWindow( ... というのがあって  wsprintf(mojibuf,"色付けが実行された");  SetWindowText(hrs,cbuf);  hDC = BeginPaint(hWnd, &ps);  hPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 255));//枠色  SelectObject(hDC, hPen);  hBrush = CreateSolidBrush(RGB(0, 255, 0));//中色  SelectObject(hDC, hBrush);  Rectangle(hDC, 10, 90, 150, 100);  DeleteObject(hBrush);  EndPaint(hWnd, &ps); これで、hWnd に文字と四角を表示しました。 表示位置を重なるようにしたら、ソースの後に書いた方の 四角が文字に隠れてしまいました。 四角を文字の上になるようにして、重なった部分の文字は 四角で消されるようにするにはどうしたらいいんですか?

  • 【WinAPI】 四角形の色を選択して描画

    環境:VisualStudio2005、WinXP 目的:閉じた図形の内部の色を指定の色で塗りつぶしたい 現在 // 四角形を描画(Polygonバージョン) int x1 = 0, y1 = 0, x2 = 100, y2 = 100; POINT p[ 4 ]; p[ 0 ].x = x1, p[ 0 ].y = y1; p[ 1 ].x = x2, p[ 1 ].y = y1; p[ 2 ].x = x2, p[ 2 ].y = y2; p[ 3 ].x = x1, p[ 3 ].y = y2; Polygon( hdc, p, 4 ); や // 四角形を描画(Rectangleバージョン) Rectangle( x1, y1, x2, y2 ); などで四角形を描画するプログラムを作っています。 そしてこれに色を指定したいのですが、枠の部分に関しては HPEN hPen = CreatePen( PS_SOLID, 1/*線の厚さ*/, RGB(255,0,0) ); SelectObject( hdc , hPen ); // この後に四角形を描画 を指定することで色が変わりました。 しかし四角形の内側の部分の色に関しての色の指定方法が分かりません。 SelectObject(hdc , GetStockObject( GRAY_BRUSH ) ); でGRAY_BRUSH、BLACK_BLUSHなど数種類の指定ができるというのを調べましたが、 これだと好きな色を指定できません。 閉じた図形の内部の色を好きな色で塗りつぶす方法は無いのでしょうか・・?

  • コントロールの色の変更

    初歩的な質問で申し訳ありません。 色々なHPを徘徊して調べているのですが、どうしてもうまくいきません。 コードはメッセージループに次のように記述しています。 --------------------------------------------------------- case WM_CTLCOLORBTN:   // 白色のブラシハンドルを返す   return (LRESULT)GetStockObject(WHITE_PEN); case WM_CTLCOLORSTATIC:   SetTextColor((HDC)wParam, RGB(255, 255, 255));   // 黒色のブラシハンドルを返す   return (LRESULT)GetStockObject(BLACK_PEN); --------------------------------------------------------- これでボタンは白、スタティックは黒地に白文字で表示されると思ったのですが、 ボタンは色が何も変わらず、スタティックは文字の周りを囲むように黒くなり、 肝心の文字の地は白のままでした。 解決策を知っている方、どうか教えていただけませんか? ちなみに、MFCは諸事情により使用できません。

  • VC++ ドラッグしながらの図の描画に関して

    描画に関して質問があります。 アクセサリのペイントツールのようにマウスドラッグしながら長方形を描画させたいのですが、 ドラッグの際に既に描画してあった長方形を消去する方法が理解できません。 具体的には以下のような方法です。 // ドラッグ中の描画処理 SetROP2( hDC, R2_NOT ); // 前景モードを変更 hPen = CreatePen( PS_DOT, 1, RGB(0, 55, 0) ); // 黒い点線のペンを作成 hBrush = (HBRUSH)GetStockObject( NULL_BRUSH ); // 空のブラシを取得 SelectObject( hDC, hPen ); // 作成したペンを使用するように設定 SelectObject( hDC, hBrush ); // 取得したブラシを使用するように設定 Rectangle( hDC, start.x, start.y, old_end.x, old_end.y ); // 四角形を描画 SetROP2とブラシは共に塗りつぶしを指定するものですが、これらを併用することによって何故既存の図形を消去していくことができるのかわかりません。 疑問になったのでブラシに関する記述を消去し実行してみると長方形内部の色が反転されましたが、これは理解できます。 しかし、これにブラシに関する記述を復元させることにより、なぜ内部が真っ白になるのかがわかりません。 また、塗りつぶしはSetROP2とブラシのどちらが先に行うのでしょうか?お手数ですが回答よろしくお願いします。

  • CreateSolidBrushで作成したオブジェクトは消す必要がある?

    CreateSolidBrush関数で作ったブラシは、DeleteObject関数で削除する必要がありますか?MSDNの関数リファレンスで調べたのですが特に記述がありませんでした。CreatePen関数では、作ったペンは不要になったらDeleteObjectで削除する必要がある、との記述があったのですが・・・。やはり不必要になったら削除したほうがいいでしょうか? 回答よろしくお願いします。

専門家に質問してみよう