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で描画しようと試みたのですがまったく描画できませんでした。
質問を質問で返します。
・HDC hTranseContext はどこでどうやって作成してますか?
・この関数自体はどのタイミングで実行してますか?
返答ありがとうございます
HDC hTranseContext = CreateCompatibleDC( hDC );
と宣言しています
では、hTranseContext上で線を描くためのキャンバスはどこで手にいれましたか?
( 作製した HBITMAP hBitmap との関連付けは?)
返答ありがとうございます
hdcというキャンパスにペンというオブジェクトで描画できると考えていました
現在
ペンをいうオブジェクトなっていたのをhTranseBitmapに変更し、
HBITMAP hTranseBitmap = ::CreateCompatibleBitmap( hDC, SizeX, SizeY );
(HPEN)SelectObject(hTranseContext, hTranseBitmap);
と変更したところ
ウインドが真黒になりました
入手したばかりのキャンバス (hBitmap) は全体が黒なので、
まずは FillRect 等を使ってキャンバスをあなた色に染め上げる
ことから始めます。線を描くのはそれからです。
そのうえで BitBlt し、確認ができたところで、違う描画方法にすればよろしいかと。
なお、HDC hDC へのBitBlt(なりAlphaBlend)は、WM_PAINTのメッセージハンドラ内
で処理します。(その他はご自由に)
蛇足ながら、入手したキャンバスは適切に廃棄物処理しましょう。:-)
丁寧にせつめいしてくだってありがとうごいます
違う描画方法にすればよろしいかと。
とのご指摘頂いたのですが
現在パワーポイントの下線描画を透明にするという
プログラムを作成しています
そこで
LineTo()関数で描画した線を
hTranseContextというメモリハンドルに保存して
AlphaBlend(hDC, 0, 0, SizeX, SizeY, hTranseContext, 0, 0, SizeX, SizeY,
tBlendData )関数を用いて
元のスライドに半透明な線を描画することはできますか??
あなたが最終的にどんな結果を望んでいるのか、パワーポイントを使用した
経験のない僕には「パワーポイントの下線描画を透明にする」と仰られても、
申し訳ないが正直ピンとこない。
が、線下になる元の画像の色を考慮して線を引きたいということであれば、
PATINVERTなりDSTINVERTなりのオペレーションコードを使って
PatBltしてもいいのではないか、とも思う。
回答でなくてゴメンね。
ありがとうございます
PatBltやってみます
アルファ値を適用して半透明な線を引くこと自体は
GDI+のGraphics::DrawLineを使うと楽です。
ただ描画先がパワーポイントとなると
リアルタイムに書き換えできないだろうから
何をやろうとしているのかちょっと疑問ではあります。
subaruさん
返答ありがとうございます
Graphics::DrawLineはNET Frameworkクラスライブラリ
なのですが
どうやってNET Frameworkクラスライブラリを使えるように
設定したらよいのかわかりません
なにをインストールしてどうファイルをインクルードしたらいいかなど
よろしくおねがいします
.NET Framework版もありますが、
WindowsXP以降であればPlatform SDKのみで利用可能なので
何もインストールする必要はないです。
猫でもわかるプログラミングならこの辺とか。
http://homepage2.nifty.com/c_lang/sdk4/sdk_335.htm
回答ありがとうございます。
Graphics::DrawLineでアルファ値を設定して
線を描写しました
僕のプログラムはパワーポイントを起動して蛍光ペンのように
スライドの文字が見えるように透明な線を引きたいのですが
現在引いている線は
半透明にしているにもかかわらず赤い線がピンク色っぽくなるだけで
下のスライドが塗りつぶされてしまします
これはなにが原因だと考えられますか
よろしくお願いします
パワーポイントを起動中に、その前面に「僕のプログラム」を
実行している状態なのでしょうか。それともアドイン?
前者なら「僕のプログラム」のウインドウ自体を半透明にして、
描画自体は透明でない普通の描画をする
という手もありますが、・・・・Paint.NETなんかが
やってるやつですけど。どうなんだろ。
例えば以下のようにデスクトップの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に対して一旦デスクトップの内容を取り込んでやらないと
アルファブレンドできません。
ちなみに描画内容は一時的なものですぐに壊れてしまうので
仲澤さんの方法がましだと思いますが、複雑な図形を書く場合は
リージョンの作成が面倒になります。