★初心者にVisual C++を教えるスレ★ Part27at TECH
★初心者にVisual C++を教えるスレ★ Part27 - 暇つぶし2ch684:デフォルトの名無しさん
07/11/11 15:40:55
質問させてください。
Visual C++ .net 2005で開発を行っています。

フォーム(Form1)やピクチャボックス(pictureBox1)に簡単なグラフを表示させたいのですが、
button1_Click等で描画すると、一度非表示になった部分の線が消えてしまいます。

Form1_Paintイベント内で描画すれば解決するのですが、毎回データを読み込んだり計算するのが
無駄に感じます。

Form1で非表示になった部分を消さないための方法はあるのでしょうか?


または、なんらかのバッファに描画して、それをForm1_Paint内で毎回読み出すという方法のほうがいいのでしょうか?
そのための方法等があれば教えてください。

よろしくお願いします。

685:684
07/11/11 15:44:04
補足

線は、
 Graphics^ gr = pictureBox1->CreateGraphics();
 Pen^ pen1 = gcnew Pen(Color::Black,2);
 gr->DrawLine(pen1,10,10,200,200);
こんな感じで書いています。

686:デフォルトの名無しさん
07/11/11 22:25:30
>>684
Imageに描いて、Paintイベントでgr->DrawImage

687:648
07/11/12 00:13:47
>686
なるほど、ありがとうございます。

Bitmapをバッファとして使い、Graphics::FromImageで取り込んだイメージに対して、
描画を行いました。おかげでうまくいきました。


↓みたいな感じでよろしいでしょうか? 何か改善点があればご指摘お願いします。

Bitmap^ bmap1;
private: System::Void mnDraw_Click(System::Object^ sender, System::EventArgs^ e) {
Pen^ pen1 = gcnew Pen(Color::Black,2);
        Graphics^ gr1 = Graphics::FromImage(bmap1);
gr1->DrawLine(pen1,10,10,100,100);
// gr1->Dispose(); //なぜかエラーになる
Form1::Refresh();
}
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
bmap1 = gcnew Bitmap(200,200);
}
private: System::Void Form1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {
e->Graphics->DrawImage(bmap1,100,100,200,200);
}


688:デフォルトの名無しさん
07/11/12 00:15:57
>>687
Bitmap^ の 「^ 」 ってどういう意味?

689:若者は馬鹿者 ◆KorX0HCHGU
07/11/12 00:16:21
Win32アプリ開発で
VSの出力の部分にウインドウメッセージを表示したいのですが
.netでいうSystem.Diagnostics.Debug.Printに相当する機能はないですか?


690:デフォルトの名無しさん
07/11/12 00:18:17
>>689
ドットネットの質問は他所でやれ馬鹿者!

691:デフォルトの名無しさん
07/11/12 00:24:38
>>690には>>689が”ドットネットの質問”に見えるらしいw

692:684
07/11/12 01:09:01
>688
自動でガーベージコレクションをやってくれるようです。ようは、使い終わったら勝手にメモリを開放してくれるらしい。



693:デフォルトの名無しさん
07/11/12 03:14:25
>>692
なるほどー 2005からの機能ですね

694:デフォルトの名無しさん
07/11/12 08:44:30
win32APIで虫眼鏡のプログラムを作ってます。
メモリデバイスコンテキストでマウスカーソル周辺を拡大したものを
ディスプレイのデバイスコンテキストに転送してるんですが、
マウスを移動させたときに先ほど拡大した部分を元に戻して
移動先のマウスカーソル周辺をまた拡大という風にしたいんです。

ですが、毎回GetDC(0)をしたとしても拡大した後のディスプレイでは初期化できないし、
hdc2という二つ目のデバイスコンテキストに拡大前の状態を退避させて
hdc1に復活させようと思ったのですがうまくいきません。
さらに、メニューを開いたり新たにソフトを起動させたりと、
刻々と変化するディスプレイの状態を追いかけつつ拡大できるようにしたいのです。

探し方が悪いのかもしれませんが、
いろいろ検索しましたが良い解決法が見つかりませんでした。
それに虫眼鏡のプログラミングを解説してるサイトもなさげだし・・・。

このような場合、どのような方法を用いればいいのでしょうか?
よろしくお願いします。

695:デフォルトの名無しさん
07/11/12 09:49:55
MSDNのサンプルじゃダメなの?

/****************************** Module Header *******************************
* Module Name: zoomin.c
*
* Microsoft ZoomIn utility. This tool magnifies a portion of the screen,
* allowing you to see things at a pixel level.
*
* History:
* 01/01/88 Created.
* 01/01/92 Ported to NT.
* 03/06/92 Cleanup.
*
****************************************************************************/

696:デフォルトの名無しさん
07/11/12 10:35:31
一応
.netを使ったC++/CLI は、普通のC++とは全く別物
.net使いたいならC#がいいと思う

697:デフォルトの名無しさん
07/11/12 12:45:26
argcとargvについて教えてください。

698:694
07/11/12 13:27:05
>>695
そのページってどこを探したらありますかね?
MSDNのサイト調べても見あたらなかったんですが…。
教えて君で申し訳ありません。

699:デフォルトの名無しさん
07/11/12 16:26:41
>>698
Platform SDKはインストールしてる?

700:デフォルトの名無しさん
07/11/12 17:51:17
Visual Studio 2005を使って、DirectXプログラムを作ろうとしてます。
ちなみにOSはWindowsXP Home Editionです。

ネット上の解説サイトで、Visual C++ Express Editionを使って
Windowsアプリケーションを作成する場合にはPlatform SDKが必要と書いてあるんですが、
Visual Studio 2005を使う際にもPlatform SDKをインストールしておいたほうが良いでしょうか?

701:デフォルトの名無しさん
07/11/12 17:58:14
今ならPlatform SDKよりWindows SDKお勧め。
DirectXには、DirectX SDKが必要。
ただし、DirectShowには上2つの内どちらかが必要。

702:デフォルトの名無しさん
07/11/12 18:04:12
>>701
ありがとうございます。

DirectShowが何かよくわかりませんが、
解説本がPlatform SDKで進めているので、
これとDirectX SDKでやってみます。


703:デフォルトの名無しさん
07/11/12 18:20:49
VisualC++ Expressでプログラム製作をしています。
プログラム実行中にコードを書き換えてAlt+F9を押すと、動的にプログラム
の内容を変えてくれますが、ボタンを押しても出来ない時があります。
これは何が原因なのでしょうか?

704:700
07/11/12 20:24:35
度々すみません。
DirectXのテストをしようと、
D:\Program Files\Microsoft DirectX SDK (November 2007)\Samples\C++\Direct3D\Tutorials\Tut01_CreateDevice\CreateDevice.cpp
を自分のプロジェクトフォルダにコピー、既存の項目を追加して、
ソリューションのビルドをしてみると以下のエラーが出ました。

CreateDevice.obj : error LNK2019: 未解決の外部シンボル _Direct3DCreate9@4 が関数 "long __cdecl InitD3D(struct HWND__ *)" (?InitD3D@@YAJPAUHWND__@@@Z) で参照されました。
C:\Documents and Settings\(ユーザ名)\My Documents\Visual Studio 2005\Projects\d3dtest01\Debug\d3dtest01.exe : fatal error LNK1120: 外部参照 1 が未解決です。

そこで、Direct3DCreate9を含む「d3d9.lib」をプロジェクト名→プロパティ→リンカ→入力の「既存の依存ファイル」に追加したのですが、
まだ同じエラーが起こります。
D:\Program Files\Microsoft Platform SDK\Bin/Lib/Includeのパスは追加したのですが、
他に何が原因なんでしょうか?


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch