• ベストアンサー

Active Basic デバイスコンテキスト

プログラム上に画像を表示しようと思い、方法を探しました。 すると、デバイスコンテキストというものを使って表示させるみたいなことが書かれていました。 とりあえず、理解しようと頑張って読み進めていったのですが、全然理解が出来ませんでした。 そもそもデバイスコンテキストとは、何をするもので、どういう風に扱えば良いのかがさっぱり分かっていません。 すみませんが、この、デバイスコンテキストの使用方法を理解していられる方がいらっしゃいましたら、すみませんが、ご教授お願いします。 なるべく詳しく教えていただきたいです。 お願いします。

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

  • ベストアンサー
回答No.2

 こんにちは。  ActiveBasicについては未経験です・・・。  例えば開いたウィンドウに四角を描きたければそのウィンドウからデバイスコンテキストを取ってこないといけません。  ブラシやペンを作成しておき、取ってきたデバイスコンテキストにそれらをセットしてから描画関数を呼ぶと、絵が描けます。  取って来たデバイスコンテキストは、絵を描き終えたら、直に閉じなければいけません。ほったらかして置くとトラブルが生じます。  また、ペンやブラシをデバイスコンテキストに選択したまま、ペンやブラシを消さない様に注意しましょう。  http://oshiete1.goo.ne.jp/qa1557058.html  以下HPの真似をすれば手っ取り早く体験出来ると思います。  http://www.geocities.jp/debu0510/basic/main16.html  大体こんな感じでしょうか。 'hWndはHWND型で、描きたい対象のウィンドウハンドル Dim hBrush As HBRUSH Dim hPen As HPEN Dim hDC As HDC Dim iSave As Integer '青いブラシを作る hBrush = CreateSolidBrush(RGB(0, 0, 255)) '赤いペンを作る hPen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0)) 'ウィンドウからデバイスコンテキストを取る hDC = GetDC(hWnd) 'デバイスコンテキストを記憶する iSave = SaveDC(hDC) '青いブラシの選択 SelectObject(hDC, hBrush) '赤いペンの選択 SelectObject(hDC, hPen) '赤い枠、青い中身の四角を描く Rectangle(hDC, 10, 10, 120, 120) '記憶していたデバイスコンテキストへ復元する RestoreDC(hDC, iSave) '赤いペンを消す DeleteObject(hPen) '青いブラシを消す DeleteObject(hBrush) 'デバイスコンテキストを消す ReleaseDC(hWnd, hDC)

if-so-at
質問者

お礼

なるほど・・・ ありがとうございます! 参考になりました!!

その他の回答 (1)

  • tetsumyi
  • ベストアンサー率26% (1857/7091)
回答No.1

そんなに簡単に説明できるものでもないのでネット検索やABの講座等で自分で理解して行くしかないでしょう。 たとえば、こんな所が検索ですぐに出てきます。 http://www.kab-studio.biz/Programing/Codian/MxA/08.html

関連するQ&A

  • デバイスコンテキストについて詳しく教えてください

    C言語でwin32APIを勉強しているのですが、デバイスコンテキストとは具体的にどのようなものでしょうか?Windowsが管理しているGDIで描画をするための構造体らしいですが・・・。 それともう1つ質問です。解説サイトに「デバイスコンテキストは使ったらすぐ解放しなければならない」と書かれているのですが、なぜすぐに解放しなければならないのですか?サンプルプログラムを見ていると、まだ使えそうなデバイスコンテキストもすぐ解放し、次に必要になれば新たにデバイスコンテキストを確保していますが、そのまま取って置くのは駄目なのでしょうか。そのようなプログラム(汎用的なデバイスコンテキストをWinMainの最初に確保し、完全に使わなくなった時点で解放する)を作って動作させてみても、ぱっと見では問題が見つかりません。ですがこれではやはり問題があるのでしょうか? 質問は以上の2点です。回答よろしくお願いします。

  • MFC デバイスコンテキストについて

    MFCのデバイスコンテキストを取得して、DirectXなどで描画を行っています。 環境は、 VS2008 DirextX 9.0 MDIなんですがOnInitDialogでDirectXのデバイスを取得しています。 次にOnDrawで描画を行っています。 GetDcでコンテキストを取得し、円の描画を行っています。 MDIですので、5以上のファイルを作成すると、描画が行われなくなります。 共通デバイスコンテキストは、5以上持てないということは検索して分かったのですが、5以上のファイルに描画を成功させるためには、どうすればいいのでしょうか? ・単純に新規ファイルを作ったときに、以前に作ったファイルのデバイスコンテキストを開放また、Directxのデバイスを開放すればいい? ・DirectXのデバイスをファイルごとに作成するのではなく、共通してもてば解決できる?? ・そもそも解放したりしても無理?? と考えているのですが、どうでしょうか? 助言をお願いします。

  • デバイスコンテキストについて

    いつもお世話になります。 MFCアプリケーションWIZでデスクトップアプリを作成しているのですが、 HDC型のデバイスコンテキストの取得方法がわかりません。 CWndのメンバ変数m_hWndにウィンドウハンドルが格納されるというのは わかったのですが、 hDC = GetDC(m_hWnd)だと間違っているのですよねー。 ご教示よろしくお願い致します。

  • デバイスコンテキストに書いた絵をBMPファイルに落としたいです。

    MFCを使っています。 OS:WINNT4.0 環境:VisialC++ CDCクラスのSetPixel,Bitbltなどの関数を使ってデバイスコンテキストに 書いた絵をBMPファイル(あるいはJPGなどの画像ファイル)として保存した いのですが、、、方法を教えてください。 よろしくお願いします。

  • ピクチャーコントロールのデバイスコンテキストを取得するためには?

    VC2005についてです ピクチャーコントロールのデバイスコンテキストを取得するためには どうすればよいでしょうか? MDIGetActive()->GetDC()->TextOutA(20,50,"文字列です"); この様にすれば、アクティブになった 子ウィンドウデバイスコンテキストを取得することができますが、 アクティブになった、この子ウィンドウの上にある ピクチャーコントロールに 描画するためには どうすればよいでしょうか? MDIで、複数のウィンドウのうちで アクティブになった ものだけを 操作したいのです。 よろしくお願いします。

  • コンテキストメニューで

    Explorer上で、コンテキストメニュー表示すると「新規作成」がありますが、そこにもう利用しないプログラムがあるので削除したいのですが、どのようにすれば削除できるでしょうか? また、そのプログラムは利用するのでアンインストールはしないでコンテキストから削除したいです

  • 任意の解像度のメモリデバイスコンテキスト

    C++でふと思ったのですが、 任意の解像度でメモリデバイスコンテキストを 作成することは可能でしょうか? 通常(?)ですとディスプレイデバイスコンテキストの 解像度になってしまう気がします。 ご存じの方、教えてください。 サンプルなどもあると大変ありがたいです。

  • メモリデバイスコンテキストを用いた描画処理

    お世話になります。 Borland C++ 5.5.1 for Win32で簡易な画像ビュアーを開発しています。 基本的な動作は完成したのですが、ある条件下で発生する問題を回避するために、メモリデバイスコンテキストを用いようと考えています。 ところが、後述のように変更したところ、画像がまったく表示されなくなりました。(ウィンドウ背景色で塗りつぶされたままです。一瞬たりとも表示されません。) Windowsプログラムに慣れていないため解決に難儀しています。 どなたか原因と対策をご教示くださいますようよろしくお願いします。 ////////////////////////// //変更前 画像表示される// ////////////////////////// case WM_PAINT: hdc = BeginPaint(hWnd, &ps); /* ~省略(画像処理)~ */ StretchDIBits(hdc,~,SRCCOPY);//処理した画像をウィンドウへ EndPaint(hWnd, &ps); break; //////////////////////////// //変更後 画像表示されない// //////////////////////////// case WM_PAINT: hdc = BeginPaint(hWnd, &ps); hmemdc = CreateCompatibleDC(hdc); /* ~省略(画像処理)~ */ StretchDIBits(hdc,~,SRCCOPY);//処理した画像をMemoryDCへ BitBlt(hdc, 0, 0, rc.right, rc.bottom, hmemdc, 0, 0, SRCCOPY);//MemoryDCからウィンドウへ(rcはクライアント領域) DeleteDC(hmemdc); EndPaint(hWnd, &ps); break;

  • コンテキストメニューが透明になる

    Windows7使用者です。 コンテキストメニューが透明になります。 画像を見ればわかると思うのですが、コンテキストメニューが少しだけ枠が出て、中が表示されなくなるのです。 何回かコンテキストメニューを開くと、稀になります。 解決策ありませんでしょうか? 回答よろしくお願いします。 <スペック> OS:Windows7 Home Premium 64bit APU:AMD E2-1800 APU(1.7GHz)+ AMD RadeonTM HD 7340グラフィックス ハード:SONY VAIO SVE11119FJW

  • デバイスコンテキストに関して2つの質問

    閲覧ありがとうございます。デバイスコンテキストに関して2つの 質問があります。 1)矩形描画の際に背景色の反転色を設定したければSetROP2で  R2_NOTを指定します。このような「背景色の反転色を設定する」と  いう処理をTextOutで出力される文字に対して行いたいのですが  何か方法はあるでしょうか。 2)同一の領域に、それぞれ独立した2つの矩形が描けるように実装  しています。それぞれに対してR2_NOTを設定しており、そのため、  2つの矩形が重なると線が消えてしまいます。(反転の反転、のため)  これを回避し、重なった部分は一方のR2_NOTだけが作用するように  したいのですが、なにか方法はありますでしょうか。  よろしくお願いいたします。 環境はWindowsXP, VC2005++ &MFC です。

専門家に質問してみよう