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.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);
}
No.3
- 回答日時:
ピクチャーボックスに対してならば
PictureBox^ pict = (PictureBox^)sender;
HWND hWnd = (HWND)pict->Handle->ToPointer();
といった具合で ウィンドウハンドルをピクチャーボックスのものにしてあげましょう
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);
}
}
お探しの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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB6,リストボックスの特定行の...
-
TextBoxに文字を書いても表示さ...
-
C++にて、塗りつぶされた円を描...
-
[VB.net] DataGridViewの列ヘッ...
-
多角形の描画。(VC++)
-
UpdateData( FALSE); による文...
-
word
-
PCで「使用可能な場合はグラフ...
-
他のプロセスの描画領域を再描画
-
VC++でカーソルを固定する
-
楕円を描くプログラミング
-
ビットマップを表示させる(MFC)
-
gnuplotのフリーズについて
-
動的に作成したメニュー名を...
-
Windowのちらつき防止
-
タブコントロール上のピクチャ...
-
VBAにGDI+を参照させる方法
-
MFCのタイマーのつかい方を教え...
-
描画
-
MFCでOnPaintのタイミング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6,リストボックスの特定行の...
-
[VB.net] DataGridViewの列ヘッ...
-
NVIDIAのシェーダーキャッシュ
-
MFCでOnPaintのタイミング
-
TextBoxに文字を書いても表示さ...
-
word
-
UpdateData( FALSE); による文...
-
VC++プログラムをつかったBMP画...
-
InvalidateRectの使い方について
-
StretchBlt関数について
-
OneNote 2010 文字と描画がずれる
-
C# ラバーバンドの描画を快適に...
-
エクセルでガンチャートを作成...
-
C++にて、塗りつぶされた円を描...
-
VBAにGDI+を参照させる方法
-
MFC DrawText 背景色とフォント
-
GDI+で高速な描画
-
MFCのタイマーのつかい方を教え...
-
Labelの文字をスクロールする際...
-
FlexGridの一部のみ表示を更新...
おすすめ情報