tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルMSChartのちらつき防止
記事No5693
投稿日: 2007/06/23(Sat) 18:21
投稿者シビセラ
いつも、お世話になってます。
いろいろなところで既に解決されているMSChartのちらつき防止の為、
クリップボード経由でピクチャーボックスにコピペしようとしているのですが、
上手くいかず、他と同じ趣旨になってしまい申し訳ないのですが、
書き込みさせて頂きます。
(環境:WindowsXP VisualBasic 2005 Express Edition)

Public Sub bitRate_Disp(ByRef by As Byte)
       '(省略)
        MSChart1.EditCopy()
        If My.Computer.Clipboard.ContainsImage() Then
           Picture1.Image = My.Computer.Clipboard.GetImage() 'Clipboard Past
        End If
       '(省略)
end sub
と上記の記述で実行するとフォーム画面が白一色になってしまい、
何も変化しませず、フォーム自体がハングしてしまいます。
(別フォームは動作)

そこで、Picture1への貼り付け部分の記述をコメントアウトして動作させ
フォーム動作中にペイントソフトへ貼り付け行うとちゃんとMSChartの画面が
貼り付けられます。
また、クリップボードへのコピーを他のピクチャボックスに変えるとコピーは行われます。
マイクロソフトのWebに記載されていたピクチャーボックス上にMSChartを載せて
コピペを行うようにしてみたのですが、ピクチャーボックスのimageだけがコピーされて
しまいます。

僕の記述不足や考慮不足が原因だとは思うのですが、
どなたかご教授頂けますようお願いします。

[ツリー表示へ]
タイトルRe: MSChartのちらつき防止
記事No5698
投稿日: 2007/06/25(Mon) 07:49
投稿者花ちゃん
> いろいろなところで既に解決されているMSChartのちらつき防止の為、
ここの掲示板(勿論VB6.0の方ですが)の過去ログはご覧になりましたか?
http://tinyurl.com/28ccau

> 上手くいかず、他と同じ趣旨になってしまい申し訳ないのですが、
上手くいかないコードを掲載して頂かないと、誰も試してくれませんよ。
事象を再現できるコードを投稿するとレスがつき易いかと思うのですが。

> Public Sub bitRate_Disp(ByRef by As Byte)
>        '(省略)
>         MSChart1.EditCopy()
>         If My.Computer.Clipboard.ContainsImage() Then
>            Picture1.Image = My.Computer.Clipboard.GetImage() 'Clipboard Past
>         End If
>        '(省略)
> end sub
> と上記の記述で実行するとフォーム画面が白一色になってしまい、
> 何も変化しませず、フォーム自体がハングしてしまいます。

My.Computer を使用しない方法で、コピー&ペーストしても同様になるのですか?
上記コード事態に問題があるのか、他の部分に問題があるのか原因を絞り込まないと。
(グラフでなく別のものを表示してコピー&ペーストしてみてどうかとか)

そもそも肝心のグラフをどのように表示して、画面がチラつくのかを書かないと。

私なら、Win32API の方を試してみますが、又、.NET では、ダブル・バッファリングし、
ちらつきをなくす方法 が使用されるようですが、MSChart に対しては効果があるのか
どうかは、試していませんが、参考のために下記を紹介しておきます。
http://www.microsoft.com/japan/msdn/vbasic/migration/tips/DoubleBuffer/

[ツリー表示へ]
タイトルRe: MSChartのちらつき防止
記事No5705
投稿日: 2007/06/25(Mon) 13:29
投稿者花ちゃん
気になったのでちょっと試して見ましたが、チラつくとかじゃなくて

AxMSChart1.EditCopy でクリップボードへコピーしたものが
クリックボードから取得できないと言う事ですよね。

他のグラフィックソフトならクリップボードから読み込めるが
VB.NET から取得すると下記のようなエラーが表示されるという事ですよね

----------------------------------------------------------------------------
ランタイムの重大なエラーが発生しました。
エラーのアドレスは 0x7a005c3d、スレッド 0x6f8 です。
エラー コードは 0xc0000005 です。
これは CLR のバグであるか、またはユーザー コードのアンセーフまたは
確認不可能な部分にバグがある可能性があります。
このバグの一般的な原因には、スタックが壊れる可能性のある
COM-interop または PInvoke のユーザー マーシャリング エラーが含まれています。
-----------------------------------------------------------------------------
多分、クリップボードの扱い方が変更されたせいでしょうね。
クリップボード関係のWIN32APIを使ったらできるのだろうだろうけど。
(ちょっと今は、試すに時間がないのでここまで)
下記を試したところペーストできました。
http://dobon.net/vb/dotnet/graphics/getclipboardmetafile.html#meta
同じAPIを使うなら先の方法の方がいいかも。


又、英語が読めるなら、 AxMSChart1.EditCopy で検索して見て下さい。
色々同じ事が書かれているようですが、私は、英語が皆目なので。

[ツリー表示へ]
タイトルRe^2: MSChartのちらつき防止
記事No5713
投稿日: 2007/06/25(Mon) 22:13
投稿者シビセラ
花ちゃん様

> 気になったのでちょっと試して見ましたが、チラつくとかじゃなくて
> AxMSChart1.EditCopy でクリップボードへコピーしたものが
> クリックボードから取得できないと言う事ですよね。

気にして頂きありがとう御座います。
おっしゃる通りです。僕の説明が悪く二度手間をかけてすみません。

> 他のグラフィックソフトならクリップボードから読み込めるが
> VB.NET から取得すると下記のようなエラーが表示されるという事ですよね

はい、当初は表記して頂いたようにランタイムエラーが出力されていたのですが、
MSChart1のプロパティなどを変化させるとランタイムエラーではなくて
フリーズしたりしました。
今は元に戻してもランタイムエラーに戻らなくなってしまったのですが・・
(以前との差分はないはずなのですが)

> 下記を試したところペーストできました。
> http://dobon.net/vb/dotnet/graphics/getclipboardmetafile.html#meta

返答が遅くなってしまい申し訳ありません。
.net初心者で参考コードの
  'Imports System.Runtime.InteropServices
をそのままコメントアウトしていて
  <DllImport("user32.dll")>
が宣言エラーになってしまったりで四苦八苦していました・・
上記HPを参考にして修正したところピクチャーボックスに表示されました。
ただ、表示される画像がかなり縮小されてしまいます。
同じピクチャーボックスにメタファイルではなくて通常の画像データ(Bitmap??)を
クリップボード経由で貼り付けた場合は縮小されない為、
ピクチャーボックスの設定ではないと考えています。
また、MSCharet1を拡大すると縮小されてはいるものの比例して大きくなります。

今さっきこの問題にぶつかったところなので、まだしっかり調べていませんが、
現在はピクチャーボックスのSizeプロパティをStrechimageにしてとりあえずの
対応をしています。

> 同じAPIを使うなら先の方法の方がいいかも。

前にアドバイス頂いたダブルバッファ作戦についてはご予想通り
MSChartには効果はありませんでした。

>又、英語が読めるなら、 AxMSChart1.EditCopy で検索して見て下さい。
>色々同じ事が書かれているようですが、私は、英語が皆目なので。

すみません、私も英語は苦手でして・・(^^;

[ツリー表示へ]
タイトルRe^3: MSChartのちらつき防止
記事No5714
投稿日: 2007/06/25(Mon) 22:29
投稿者花ちゃん
> > 同じAPIを使うなら先の方法の方がいいかも。
>
> 前にアドバイス頂いたダブルバッファ作戦についてはご予想通り
> MSChartには効果はありませんでした。

ダブルバッファ の事ではありませんよ。
http://tinyurl.com/28ccau を見なかったのですか?

OleDraw API の事を言っているのですが。

[ツリー表示へ]
タイトルRe^4: MSChartのちらつき防止
記事No5760
投稿日: 2007/06/29(Fri) 22:32
投稿者シビセラ
花ちゃん様

> ダブルバッファ の事ではありませんよ。
>  http://tinyurl.com/28ccau を見なかったのですか?
> OleDraw API の事を言っているのですが。

すみません、クリップ経由でのプログラムがMSChart以外のところでも
トラブルっていてまだ、OleDraw APIをしっかり試せていません。
OleDraw APIについての過去ログはこちらに投稿させてもらう前にも
拝見していましたが、一度トライしてみてビルドエラーになったまま
未だに動かせていません。

確かにおっしゃるとおりOleDraw APIを使用した方がいいと今は考えています。
クリップ経由ではアプリ動作中はクリップボードが使用出来なくなってしまい
何かと不便になってしまっています。
また、使用している実感はなくても他のアプリが使用している事があったりします。
(例:リモートPCコントロールの「RealVNC」など)

とりあえず、クリップボード版が多少動く様になったので、
OleDraw APIに再度チャレンジしてみます。

以上、よろしくお願い致します。

[ツリー表示へ]