• ベストアンサー

リージョンのフレームを描画する関数、FramRgn()

リージョンのフレームを描画する関数、FramRgn()について、 第三引数に、GetStockObject()は使えないんですか? 以下のエラーが出ました。 エラーコード FrameRgn(hdc,hrgn,GetStockObject(BLACK_BRUSH),2,5); 'void *' 型は 'HBRUSH__ *' 型に変換できない 3 番目のパラメータは HBRUSH__ * 型として定義されているので void * 型は渡せない 教えてください。

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

GetStockObjectの宣言はWinGDI.hでされています この宣言の戻り値は HGDIOBJとなっています GetStockObjectは ブラシ、ペン、フォント、パレットのいずれかのハンドルを返す関数です 特定のハンドル型を返すように宣言してしますと 他の型での利用が思わしくありません したがって 型を特定しない void型のポインタを返すことにしています GetStockObjectを使用する際には使用する場合に合わせてキャストします 今回の場合なら FrameRng( hdc, hrgn, (HBRUSH)GetStockObject( BLACK_BRUSH), 2, 5); といった具合にキャストして使いましょう ...

startover
質問者

お礼

すばやい回答どうもです! 丁寧に解り易く教えていただきありがとうございます! Thank youです!

関連するQ&A

  • SetBkMode( ) (HBRUSH)GetStockObject( )

     case WM_PAINT:   hDC = BeginPaint(hWnd, &ps);   SetBkMode(hDC, LTGRAY_BRUSH);   TextOut(hDC,0,0,szHello,strlen(szHello));   EndPaint(hWnd, &ps);  break; これは、int WINAPI WinMain( ) で wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); としてないと、SetBkMode( ) が無効になりました。 GetStockObject( ) の意味を知らないけど、これによって LTGRAY という色が特別なものになるんだと思いました。 窓の背景色を wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); で黒にした場合に、TextOut( ) の背景色を灰色にするには どう書けばいいんですか?

  • GetStockObjectで取得したGDIオブジェクトハンドルをブラシハンドルにキャストする理由

    WINDOWS APIについて質問です。 ウィンドウクラスを登録する際、 winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); という表現をよく使います。 関数GetStockObject()はHGDIOBJを返します。 HGDIOBJもHBRUSHも実体はvoid*です。 なぜわざわざキャストするのでしょうか。

  • 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とブラシのどちらが先に行うのでしょうか?お手数ですが回答よろしくお願いします。

  • Windowsプログラミング リージョンについて

    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { HDC hdc; PAINTSTRUCT ps; HRGN hRgn1, hRgn2; RECT rect; switch(msg){ case WM_DESTROY: PostQuitMessage(0); return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); hRgn1 = CreateEllipticRgn(10, 10, 100, 100); hRgn2 = CreateEllipticRgn(50, 50, 200, 150); CombineRgn(hRgn1, hRgn1, hRgn2, RGN_OR); SelectClipRgn(hdc, hRgn1); GetClipBox(hdc, &rect); GetClipRgn(hdc, hRgn2); SelectClipRgn(hdc, NULL); DeleteObject(hRgn1); Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom); FillRgn(hdc, hRgn2, GetStockObject(BLACK_BRUSH)); DeleteObject(hRgn2); EndPaint(hwnd, &ps); return 0; } return DefWindowProc(hwnd, msg, wp, lp); } リージョンというものがよく理解できません。 なぜCombineRgnの第一引数のリージョンが存在していないといけないのですか? DeleteObject(hRgn1);でhRgn1をDeleteしてるのにhRgn2が使えるのは なぜですか?  GetClipRgnで設定されたリージョンを取得しているようなんですか、このリージョンは領域の情報の共有ではなく、たんなる 領域の情報のコピーなのですか? DeleteObjectでDeleteしているhRgn1, hRgn2はどのリージョン(どのリージョンといった方がいいのかわかりませんが)を削除しているのか分かりません。 あと上記のソースとは関係ないのですが hRgn1 = CreateEllipticRgn(10, 10, 100, 100); hRgn2 = CreateEllipticRgn(50, 50, 200, 150); CombineRgn(hRgn1, hRgn1, hRgn2, RGN_OR); DeleteObject(hRgn1); DeleteObject(hRgn2); ←もしかしてこれは不要? としたとき DeleteObject(hRgn2);は不要なのでしょうか? 超初心者な質問ですみません。質問の仕方へたですみません。 分かる人お願いします。

  • 【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など数種類の指定ができるというのを調べましたが、 これだと好きな色を指定できません。 閉じた図形の内部の色を好きな色で塗りつぶす方法は無いのでしょうか・・?

  • PathToRegion()について

    case WM_TIMER: hdc = GetDC(hwnd); SelectObject(hdc, font); SetBkMode(hdc, TRANSPARENT); BeginPath(hdc); TextOut(hdc, 0, 0, mt->ShowNowTime(mt), lstrlen(mt->ShowNowTime(mt))); EndPath(hdc); hRgn = PathToRegion(hdc); ←ここです。 SelectObject(hdc , GetStockObject(SYSTEM_FONT)); ReleaseDC(hwnd, hdc); SetWindowRgn(hwnd, hRgn, TRUE); InvalidateRect(hwnd, NULL, FALSE); return 0; 時計(文字のみ)のデスクトップアクセサリーをつくろうと思ってますが、 hRgn = hRgn = PathToRegion(hdc);で繰り返し同じhRgnで生成したら、 hRgnのオブジェクト自体はまた生成されるのでしょうか?それともリージョンの演算結果が変わるだけでしょうか? このソースはメモリリークをおこしているでしょうか? PathToRegionはどのような動作をしているのでしょうか? 分かる方教えてください。 (いい文章の表現方法がわからなかったため直接疑問点を書いてみました。文章へたですみません。)

  • ラムダ式を関数に渡したいのですが

    Class1からClass2にある関数の引数にラムダ式で関数を渡すようなプログラムを作ろうと思い、以下のようにコードを記述しました。 #include <iostream> class Class1 { int i = 0; void func() { std::cout << "Hello world" << std::endl; } void init() { Class2 *class2 = new Class2(); class2->setFunc([this] { func(); i++; }()); } }; class Class2 { void(*mFunc)(); void runFunc(){ mFunc(); } public: void setFunc(void func()) { mFunc = func; } }; すると class2->setFunc([this] { func(); i++; }()); のところで「型"void"の引数は型"void(*)()"のパラメーターと互換性がありません」というエラーが発生してしまいます。 キャプチャにthisを渡したラムダ式を他のクラスの関数ポインタのような変数に代入させるようにしたいのですがどのように記述したらできますか

  • 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関数の戻り値に付いていまいちはっきりしていないのでわかる方がいらしたらよろしくお願いします。

  • 関数の引数をvoid*でキャストする

    最近見かけたCのプログラムで、関数の引数の型は void* なのですが、その関数を使うときに 引数をvoid*でキャストしていました。 例えば、 func ( (void*) p ); こういうことです。 私の知っている知識では、 void* と 任意の型のポインタは キャストなしに相互に代入可能です。 関数の引数でも、キャストは要らないものだと思っていました。 そうすると、引数を void* でキャストするのは無意味だと思うのですが、・・・ 違うのでしょうか。処理系によるとか。 逆に、関数の引数の型がchar*などで、渡すものが void* のときはどうなのでしょうか。 下のプログラムは、関数byte_orderの引数の型はvoid*ですが、int型へのポインタ( &a )を設定しています。私の環境では、コンパイルエラーも警告もないし、動作も正常です。 #include <stdio.h> #include <string.h> void byte_order(void *vp) { char char_array[4]; strncpy(char_array, vp, 4); printf("出力します:%x %x %x %x\n", char_array[0], char_array[1], char_array[2], char_array[3]); } int main(void) { int a = 0x12345678; byte_order(&a); return 0; } このプログラムは単なる一例であって、質問はバイトオーダに関するものではありません。 また、C言語の質問であって、C++ではありません。

  • ウィンドウやボタンコントロールの色を変えたい

    win32、VC++2005、windowsXPで開発中なのです。 まずウィンドウの色を変更したいのですが、 wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); のGetStockObjectの引数で白、灰、黒色には変更出来るのですが、 紫色にできませんでした。 色を変更するにはどうすればいいんですか? またボタンコントロールの色も変更したいのですがどうすればいいんでしょうか? 参考になるHPなどあると思ったのですが中々解りやすいサイトがありませんでした。 まったくのwin32プログラム初心者ですのでわかりやすく説明お願いします。

専門家に質問してみよう