• ベストアンサー

【VC2008】色反転破線の書き方

redfox63の回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答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);   } } といった具合になるかと …

Momentary
質問者

お礼

何度も回答して頂いて、ありがとうございます。 教えて頂いた方法で、下記のようにしてみました。 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

  • libgd で左右反転コピーをするには?

    perl だと copyFlipHorizontal を使って左右反転したイメージの描画ができるのですが、C で libgd を使って同じ事をするにはどうしたらいいのでしょうか?

  • VC++4.0→VC++6.0

    Visual C++4.0で作成したソースをVisual C++6.0で 読み込ませたい(VC++6.0で再コンパイルしたい)の ですが、.dswファイルを起動しても関連するファイルが 開いてくれません。(ファイルビューには.makしかない) Visual C++6.0で再コンパイルする方法を教えて下さい。 (VC++自体わからないのですが、コンパイル位は出来ます) そもそも出来ないのでしょうか? (VBは可能なので、VC++も出来るのかなと思いまして...)

  • イラストレーターにて重なり合う部分の色を反転させる方法

    イラストレーターにて重なり合う部分の色を反転させる方法 イラストレーターCS5にて白黒のイラストを作成しております。 添付画像の様に四角をライブペイントで塗ります、その後別のレイヤーにペンツールでラインを入れます(白色のライン)、この時、ライブペイントで白にした四角と重なる部分だけ色を反転させたいのですが、何か方法はありますでしょうか?ハサミツールを使ってやる方法もあるかと思いますが、それだとかなり時間がかかってしまいます、以上に記載しました内容とまったく同じ状態でなくとも構いませんので何かアドバイスをいただけると助かります。

  • マウスドラッグで四角形を表示するには

    WinXPでVisual Basic 6.0をもちいてアプリケーションを作っています。 Formオブジェクトのデザインのときに、マウスを左クリックしてドラッグすると破線の四角形が表示されますよね。 あれと同じようなものを作成するアプリに実装したいと思っているのですが、どのようにしたら良いでしょうか。 MouseDownとMouseMoveを用いてやってみたのですが、これではForm上が四角ばかりになってしまいました。 良い方法を教えてください。

  • 【VC++】コントロールの上に描画

    【VC++】コントロールの上に描画 Visual C++ 2005環境です。 ニコニコ動画みたいな動画プレイヤを作ろうとしているのですが、 作成するにあたって、コントロールの上にテキストを描画する方法で悩んでいます。 ボタンでもチェックボックスでもなんでも良いのですが、 そういったフォーム上のコントロールの上にテキストなり図形なりを描画するのって どういう方法で実装したら良いのでしょうか? サンプルのコードがあれば嬉しいですが、 無くても「こういうものを調べれば出来る」という取っ掛かりだけでも 教えて頂けると助かります。 すみませんが、方法ご存知の方居ましたらお願いします。

  • ビスタで作った動画の色が反転して困っています。

    こんにちわ。よろしくお願いします。 先日、ビスタのパソコンをフォーマットしました。 そのあとに、FrameToonというアニメ作成ソフトで作ったAVI動画ファイルの色が反転してしまいます。 具体的には、そのAVIファイルをAdoveReremireElementsという動画編集ソフトで読み込むと、  色が反転したようになり、また、動画の端っこが切れて動画が二重写しのようになってしまいます。メディアプレーヤーでは反転せず正常に再生できます。  ちなみに、ウインドウズXP上のFrameToonで作った動画AVIは、ビスタ上で問題なく読み込めます。ビスタで作った動画はXPで読み込むと反転が起こってしまいます。互換性の問題でしょうか?  ビスタを買った当時も同じことが起こっていました。そのあとにいろいろコーデックなどをインストールしているうちに治っていました。(ビスタ上で作成した動画が反転しなくなった)なにが効いて治ったのかはわかりませんでした。  そこで今回ビスタをフォーマットしたところ、反転が再び起こり、コーデックDivxをインストールしたのですが、一向に治りません。  どなたか私と同じ症状が出た方や、また、解決法をご存知の方に、なんでも結構ですので教えていただけると幸いです。  よろしくお願いします。

  • ワードファイル 色の反転

    タイトルの通りです。レポートを作成しているのですが、 添付するファイルの背景が黒で印刷時に見にくくなってしまいます。 色を反転できたらイイかなと思うのですが、他にも何かアイディアありましたらご享受ください。

  • VC++2010でdllファイルの作成について

    プログラミングを始めたばかりです。 詳しく教えて下さい。 Microsoft Visual C++ 2010 Expressにて コンソールアプリを作ってdllファイルから「Test」とprintfで表示するプログラムを作ろうとしていますが、 ネットで探してもこれだ!と言うものがヒットしません。 どなたかご教授お願いします。 dllの作成方法と、dllの読み込み方法をあわせて教えてください。

  • エクセルのセル色を好きな色に

    エクセルでセルの色を変える際に、ペンキ缶のツールバーをクリックすると色を選択できますが、この際、自分の好きな色を作ってセル色にすることはできるのでしょうか。 「図形描画」で作成した四角マスなどの色指定は、「その他の色…」という項目が選択できますが、このセルの場合は、この選択が出てきません。。。 エクセル2003を使用しています。 どなたかご教授ください。

  • C++の学び方について

    今、C++を独学で勉強しています。 Visual C++を使っているのですが、コンソールアプリを作成したりは できるようになりました。しかし、いろいろ探してみても ウィンドウを表示したりする方法などが見つかりません。 どうすればウィンドウを表示してその上に描画したりできるようになるでしょうか?