AlphaBlendをもちいて線を半透明に描画したいのですが、わかりません – プログラミング – Home

AlphaBlendをもちいて線を半透...
 
通知
すべてクリア

[解決済] AlphaBlendをもちいて線を半透明に描画したいのですが、わかりません

固定ページ 1 / 2

TKO
 TKO
(@TKO)
ゲスト
結合: 15年前
投稿: 38
Topic starter  

HDC hDC = NULL;
HPEN hOldPen = NULL, hPen = NULL;
hDC = GetDC(hWnd);

hPen = CreatePen(PS_SOLID, 3, pen_color);
(HPEN)SelectObject(hDC, hPen);

(HPEN)SelectObject(hTranseContext, hPen);

MoveToEx(hTranseContext, MyPoint.OldPoint.x,
MyPoint.OldPoint.y, NULL);
LineTo(hTranseContext, MyPoint.NowPoint.x,
MyPoint.NowPoint.y);

//AlphaBlend( hDC, 0, 0, SizeX, SizeY, hTranseContext,
0, 0, SizeX, SizeY, tBlendData );
int abc;
abc= BitBlt( hDC, 0, 0, SizeX, SizeY, hTranseContext, 0,
0, SRCCOPY);

SelectObject( hTranseContext, (HBRUSH)NULL);
hTranseContextのメモリハンドル上でLineToを用いて線を描画しそれをAlphaBlendを用いて
半透明に描画しようとしたのですが線がまったく描画されてないという状態です。

AlphaBlendがうまくいかないのでBitBltで描画しようと試みたのですがまったく描画できませんでした。


引用未解決
トピックタグ
FlatWest
 FlatWest
(@FlatWest)
ゲスト
結合: 15年前
投稿: 17
 

質問を質問で返します。

・HDC hTranseContext はどこでどうやって作成してますか?
・この関数自体はどのタイミングで実行してますか?


返信引用
TKO
 TKO
(@TKO)
ゲスト
結合: 15年前
投稿: 38
Topic starter  

返答ありがとうございます
HDC hTranseContext = CreateCompatibleDC( hDC );
と宣言しています


返信引用
FlatWest
 FlatWest
(@FlatWest)
ゲスト
結合: 15年前
投稿: 17
 

では、hTranseContext上で線を描くためのキャンバスはどこで手にいれましたか?
( 作製した HBITMAP hBitmap との関連付けは?)


返信引用
TKO
 TKO
(@TKO)
ゲスト
結合: 15年前
投稿: 38
Topic starter  

返答ありがとうございます

hdcというキャンパスにペンというオブジェクトで描画できると考えていました
現在
ペンをいうオブジェクトなっていたのをhTranseBitmapに変更し、

HBITMAP hTranseBitmap = ::CreateCompatibleBitmap( hDC, SizeX, SizeY );
(HPEN)SelectObject(hTranseContext, hTranseBitmap);

と変更したところ

ウインドが真黒になりました


返信引用
FlatWest
 FlatWest
(@FlatWest)
ゲスト
結合: 15年前
投稿: 17
 

入手したばかりのキャンバス (hBitmap) は全体が黒なので、
まずは FillRect 等を使ってキャンバスをあなた色に染め上げる
ことから始めます。線を描くのはそれからです。

そのうえで BitBlt し、確認ができたところで、違う描画方法にすればよろしいかと。

なお、HDC hDC へのBitBlt(なりAlphaBlend)は、WM_PAINTのメッセージハンドラ内
で処理します。(その他はご自由に)

蛇足ながら、入手したキャンバスは適切に廃棄物処理しましょう。:-)


返信引用
TKO
 TKO
(@TKO)
ゲスト
結合: 15年前
投稿: 38
Topic starter  

丁寧にせつめいしてくだってありがとうごいます

違う描画方法にすればよろしいかと。
とのご指摘頂いたのですが

現在パワーポイントの下線描画を透明にするという
プログラムを作成しています

そこで
LineTo()関数で描画した線を
hTranseContextというメモリハンドルに保存して

AlphaBlend(hDC, 0, 0, SizeX, SizeY, hTranseContext, 0, 0, SizeX, SizeY,
tBlendData )関数を用いて
元のスライドに半透明な線を描画することはできますか??


返信引用
FlatWest
 FlatWest
(@FlatWest)
ゲスト
結合: 15年前
投稿: 17
 

あなたが最終的にどんな結果を望んでいるのか、パワーポイントを使用した
経験のない僕には「パワーポイントの下線描画を透明にする」と仰られても、
申し訳ないが正直ピンとこない。

が、線下になる元の画像の色を考慮して線を引きたいということであれば、
PATINVERTなりDSTINVERTなりのオペレーションコードを使って
PatBltしてもいいのではないか、とも思う。

回答でなくてゴメンね。


返信引用
TKO
 TKO
(@TKO)
ゲスト
結合: 15年前
投稿: 38
Topic starter  

ありがとうございます

PatBltやってみます


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

アルファ値を適用して半透明な線を引くこと自体は
GDI+のGraphics::DrawLineを使うと楽です。

ただ描画先がパワーポイントとなると
リアルタイムに書き換えできないだろうから
何をやろうとしているのかちょっと疑問ではあります。


返信引用
TKO
 TKO
(@TKO)
ゲスト
結合: 15年前
投稿: 38
Topic starter  

subaruさん
返答ありがとうございます

Graphics::DrawLineはNET Frameworkクラスライブラリ
なのですが
どうやってNET Frameworkクラスライブラリを使えるように
設定したらよいのかわかりません

なにをインストールしてどうファイルをインクルードしたらいいかなど
よろしくおねがいします


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

.NET Framework版もありますが、
WindowsXP以降であればPlatform SDKのみで利用可能なので
何もインストールする必要はないです。

猫でもわかるプログラミングならこの辺とか。
http://homepage2.nifty.com/c_lang/sdk4/sdk_335.htm


返信引用
TKO
 TKO
(@TKO)
ゲスト
結合: 15年前
投稿: 38
Topic starter  

回答ありがとうございます。

Graphics::DrawLineでアルファ値を設定して
線を描写しました

僕のプログラムはパワーポイントを起動して蛍光ペンのように
スライドの文字が見えるように透明な線を引きたいのですが

現在引いている線は

半透明にしているにもかかわらず赤い線がピンク色っぽくなるだけで
下のスライドが塗りつぶされてしまします

これはなにが原因だと考えられますか

よろしくお願いします


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

パワーポイントを起動中に、その前面に「僕のプログラム」を
実行している状態なのでしょうか。それともアドイン?

前者なら「僕のプログラム」のウインドウ自体を半透明にして、
描画自体は透明でない普通の描画をする
という手もありますが、・・・・Paint.NETなんかが
やってるやつですけど。どうなんだろ。


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

例えば以下のようにデスクトップのHDCに対して
直接線を引くときちんと半透明になってくれます。
(エラー処理は省略しています)

#include <tchar.h>
#include <windows.h>
#include <gdiplus.h>

#pragma comment(lib, gdiplus.lib)

using namespace Gdiplus;

int _tmain()
{
ULONG_PTR token;
GdiplusStartupInput input;
Gdiplus::GdiplusStartup(&token, &input, NULL);
HDC hdc = GetDC(NULL);
{
Pen pen(Color(128, 255, 0, 0), 20);
Graphics g(hdc);
g.DrawLine(&pen, 0, 0, 100, 100);
}
ReleaseDC(NULL, hdc);
GdiplusShutdown(token);
return 0;
}

>半透明にしているにもかかわらず赤い線がピンク色っぽくなるだけで
>下のスライドが塗りつぶされてしまします
>
>これはなにが原因だと考えられますか

どのようなコードを書いてそうなるのかわかりませんが
最初のコードのようにダブルバッファリングしているのでしょうか?
そうであれば、メモリDCに対して一旦デスクトップの内容を取り込んでやらないと
アルファブレンドできません。

ちなみに描画内容は一時的なものですぐに壊れてしまうので
仲澤さんの方法がましだと思いますが、複雑な図形を書く場合は
リージョンの作成が面倒になります。


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました