No.1ベストアンサー
- 回答日時:
WinAPIを使って描画する方法でしょう
void myRevrseLine(HWND hWnd, POINT p1, POINT p2, COLORREF cl)
{
HDC hDC = NULL;
HPEN hPen = NULL;
HGDIOBJ hOld = NULL;
// DCの取得
hDC = GetDC(hWnd);
if (NULL != hDC) {
// PENの生成
hPen = CreatePen(PS_DOT, 1, cl);
if (NULL != hPen){
// PENの選択
hOld = SelectObject(hDC, hPen);
// 描画モードの変更
SetROP2(hDC, R2_NOTXORPEN);
// 始点へ移動
MoveToEx(hDC, p1.x, p1.y, NULL);
// 終点まで描画
LineTo(hDC, p2.x, p2.y);
// PENの後始末
SelectObject(hDC,hOld);
DeleteObject(hPen);
}
// DCの後始末
ReleaseDC(hWnd, hDC);
}
}
といった関数を準備します
この関数を置くファイルの冒頭に
#include <windows.h>
を記述します
呼び出しは
HWND hWnd = (HWND)this->Handle->ToPointer();
POINT p1, p2;
COLORREF cl;
// p1、p2の座標はクライアント座標
p1.x = 32;
p1.y = 32;
p2.x = 128;
p2.y = 128;
cl = RGB(255, 0,0);
myReverseLine(hWnd, p1, p2, cl);
といった具合で行います
ありがとうございます。
WinAPIは、敷居が高くて、なかなか使えていないです。
教えて頂いた方法で、ソースに追加してみましたが、何やらリンクエラーがいっぱい出て、ビルドが完了しません。当方のプロジェクトがCLR Windowsフォーム アプリケーションになっているためだと推測しますが、今ひとつ理解できていません。もう少し、WinAPIの使い方調べてみます。
ありがとうございました。
No.5
- 回答日時:
Bitmapに対してとなるとそのままでは デバイスコンテキストを取得できないので
Graphicsオブジェクトを使うことになりそうです
// bmp というBitmapを使うならば
Graphics^ g = Graphics::FromImage(bmp);
HDC hdc = (HDC)g->GetHdc().ToPpointer();
myReviceLineDC(hDC, p1, p2, cl);
g->ReleaseHdc();
delete g;
といった具合に デバイスコンテキストを取得して
myReverseLineを改変して
void myReverseLineDC(HDC hDC, POINT p1, POINT p2, COLORREF cl)
{
HPEN hPen = NULL;
HGDIOBJ hOld = NULL;
// PENの生成
hPen = CreatePen(PS_DOT, 1, cl);
if (NULL != hPen){
// PENの選択
hOld = SelectObject(hDC, hPen);
// 描画モードの変更
SetROP2(hDC, R2_NOTXORPEN);
// 始点へ移動
MoveToEx(hDC, p1.x, p1.y, NULL);
// 終点まで描画
LineTo(hDC, p2.x, p2.y);
// PENの後始末
SelectObject(hDC,hOld);
DeleteObject(hPen);
}
}
void myRevrseLine(HWND hWnd, POINT p1, POINT p2, COLORREF cl)
{
HDC hDC = NULL;
// DCの取得
hDC = GetDC(hWnd);
if ( hDC != NULL ) {
myReverseLineDC(hDC, p1, p2, cl);
ReleaseDC(hWnd, hDC);
}
}
といった具合になるかと …
何度も回答して頂いて、ありがとうございます。
教えて頂いた方法で、下記のようにしてみました。
Bitmapには、描画できているのですが、色反転していないようです。
SetROP2やLineTo等もう少し勉強します。
ありがとうございました。
private: Bitmap^srcImage;
private: System::Void Form1_DragDrop(System::Object^ sender, System::Windows::Forms::DragEventArgs^ e) {
array<String^>^ files = dynamic_cast<array<String^>^>(e->Data->GetData( DataFormats::FileDrop ));
String^ fileOrFolder = files[0];
FileInfo^ fli = gcnew FileInfo(fileOrFolder);
String^ fullPath = "";
if (fli->Exists) {
fullPath = Path::GetDirectoryName(fileOrFolder);
srcImage = gcnew Bitmap(fileOrFolder);
this->pictureBox1->Image = srcImage;
}
}
private: System::Void pictureBox1_Click(System::Object^ sender, System::EventArgs^ e) {
if (this->srcImage) {
Graphics^ g = Graphics::FromImage(this->srcImage);
HDC hdc = (HDC)g->GetHdc().ToPointer();
POINT p1, p2;
COLORREF cl;
// p1、p2の座標はクライアント座標
p1.x = 0;
p1.y = 0;
p2.x = this->srcImage->Width - 1;
p2.y = this->srcImage->Height - 1;
cl = RGB(255, 0, 0);
myReverseLineDC(hdc, p1, p2, cl);
p1.y = this->srcImage->Height - 1;
p2.y = 0;
myReverseLineDC(hdc, p1, p2, cl);
g->ReleaseHdc();
g->Flush();
delete g;
this->pictureBox1->Refresh();
}
}
private: void myReverseLine(HWND hWnd, POINT p1, POINT p2, COLORREF cl) {
HDC hDC = NULL;
HPEN hPen = NULL;
HGDIOBJ hOld = NULL;
// DCの取得
hDC = GetDC(hWnd);
if (NULL != hDC) {
myReverseLineDC(hDC, p1, p2, cl);
ReleaseDC(hWnd, hDC);
}
}
private: void myReverseLineDC(HDC hDC, POINT p1, POINT p2, COLORREF cl) {
HPEN hPen = NULL;
HGDIOBJ hOld = NULL;
// PENの生成
hPen = CreatePen(PS_DOT, 1, cl);
if (NULL != hPen){
// PENの選択
hOld = SelectObject(hDC, hPen);
// 描画モードの変更
SetROP2(hDC, R2_NOTXORPEN);
// 始点へ移動
MoveToEx(hDC, p1.x, p1.y, NULL);
// 終点まで描画
LineTo(hDC, p2.x, p2.y);
// PENの後始末
SelectObject(hDC,hOld);
DeleteObject(hPen);
}
}
No.4
- 回答日時:
No3は間違いです
HWND hWnd = pictureBOx1->handle.ToPointer();
でした
ありがとうございました。
無事に、pictureBox に反転破線を描画することができました。
まだ勉強不足で理解できていないのですが、これはpictureBoxのようなコントロール・オブジェクトに対してのみ有効なのでしょうか。例えばビットマップオブジェクトに対して、描画する方法は、また別という事でしょうか。
No.3
- 回答日時:
ピクチャーボックスに対してならば
PictureBox^ pict = (PictureBox^)sender;
HWND hWnd = (HWND)pict->Handle->ToPointer();
といった具合で ウィンドウハンドルをピクチャーボックスのものにしてあげましょう
No.2
- 回答日時:
ゴメンなさい
gdi32.libとuser32.libの2個をリンカーに与えないといけませんでした
または
#pragma comment(lib,"gdi32")
#pragma comment(lib,"user32")
を記述してみましょう
ありがとうございます。
自分で理解するため、新規プロジェクト(CLRのWindows フォーム アプリケーション)を作成
し、Form1にpictureBoxのみ追加し、そのクリックイベントに、以下のコードにて試してみました。Form1の先頭には、教えて頂いた
#include <windows.h>
#pragma comment(lib,"gdi32")
#pragma comment(lib,"user32")
を追加することで、ビルドエラーはなくなりましたが、実行しpictureBoxをクリックしても
線が描画されません。いろいろ、自分なりに試したのですが、「#include <windows.h>
」で、「>C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\objidl.h(5934) : error C2872: 'IDataObject' : あいまいなシンボルです。」が出てしまったりと、なかなか難しいです。もっとWinAPIの使用について、勉強が必要なようです。
ありがとうございました。
private: System::Void pictureBox1_Click(System::Object^ sender, System::EventArgs^ e) {
HWND hWnd = (HWND)this->Handle.ToPointer();
POINT p1, p2;
COLORREF cl;
// p1、p2の座標はクライアント座標
p1.x = 32;
p1.y = 32;
p2.x = 128;
p2.y = 128;
cl = RGB(255, 255, 255);
myReverseLine(hWnd, p1, p2, cl);
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【Excel】エクセルの1シートが2枚に分割されてしまうので印刷プレビューを押して閉 4 2022/12/13 13:12
- 運転免許・教習所 黄色のセンターライン(中央線)の追い越し 1 2022/08/07 23:34
- Excel(エクセル) シートが違う2枚のエクセルシートにある数値を別シートにコピーしたい(VBA?) 8 2022/03/31 12:24
- 数学 数学教えてください!!軌跡、極線、反転 円C:x^2+y^2=1にCの外部の点P(a.b)から引いた 5 2022/07/08 01:55
- 運転免許・教習所 黄色信号の間に止まり切れず、赤信号で停止線を越えたら信号無視で取り締まられますか? 8 2022/05/16 06:44
- 数学 ベクトル方程式(ヘッセの標準形)についての質問 2 2022/04/23 18:00
- 数学 正八面体の8面を、7色A~Gで塗り分ける方法は何通りあるか(隣り合う面は同じ色でもいいが、回転して一 1 2022/08/04 23:06
- 運転免許・教習所 自動車での追い越し追い抜きですが、最近ドラレコ映像で、自転車やオートバイの悪質が取り上げられています 7 2022/11/02 15:31
- バイク車検・修理・メンテナンス 何度もすみません スペインスズキSMX50の12V化を進めていますが元々付いてたレギュレターを汎用品 2 2022/10/17 08:53
- 数学 高校数学です。 放物線C:y^2=-2xとCに合同な放物線Dがある。Dは最初放物線y^=2xに一致し 0 2022/12/17 17:34
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
[VB.net] DataGridViewの列ヘッ...
-
google Colabでmatplotlibの描...
-
NVIDIAのシェーダーキャッシュ
-
MFCでOnPaintのタイミング
-
Labelの文字をスクロールする際...
-
word
-
TextBoxに文字を書いても表示さ...
-
Minecraft 統合版(PC)の描画距...
-
UpdateData( FALSE); による文...
-
ビューにビットマップファイル...
-
コンボボックスの高さを変えたい
-
FlexGridの一部のみ表示を更新...
-
VB.netでのライン描画方法がわ...
-
VB6,リストボックスの特定行の...
-
画面リサイズ時のちらつきをな...
-
ブレゼンハムのアルゴリズムに...
-
VC++2010(MFC)での描画
-
ボタン形のラベル
-
c++ ダブルバッファリング、以...
-
ASP.NETのパフォーマンス要因
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
word
-
TextBoxに文字を書いても表示さ...
-
VB6,リストボックスの特定行の...
-
[VB.net] DataGridViewの列ヘッ...
-
MFCでOnPaintのタイミング
-
NVIDIAのシェーダーキャッシュ
-
C++にて、塗りつぶされた円を描...
-
UpdateData( FALSE); による文...
-
VC++プログラムをつかったBMP画...
-
MFCのタイマーのつかい方を教え...
-
CStaticコントロールの静的イメ...
-
画面全体を再描画させたい
-
OneNote 2010 文字と描画がずれる
-
VBAにGDI+を参照させる方法
-
Labelの文字をスクロールする際...
-
Form1 Load で実行されない。
-
テクスチャに半透明ポリゴンを...
-
InvalidateRectの使い方について
-
Windowのちらつき防止
おすすめ情報