C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: フォーム拡大時 画面移動


(過去ログ 120 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■69968 / inTopicNo.1)  フォーム拡大時 画面移動
  
□投稿者/ C#研究者 (24回)-(2014/02/14(Fri) 17:10:14)

分類:[C#] 


実行環境 Windows7 32bit
開発環境 Windows7 32bit VisualStudio C#2010

Windowsアプリケーションの拡大鏡やフリーツールでフォームが拡大された時のために、
パネルコントロールにクリックするとパネルの場所まで画面を移動したいのですが、
表示したい場所とぜんぜん違う場所に飛ぶことがあります。

//クリックイベント内(一行のみ)
this.AutoScrollPosition = new Point(ctrl.Location.X, ctrl.Location.Y);

スクロールの座標移動だけなので簡単だと思ったのですが、
なにがいけないのでしょうか・・・。
引用返信 編集キー/
■69973 / inTopicNo.2)  Re[1]: フォーム拡大時 画面移動
□投稿者/ C#研究者 (25回)-(2014/02/15(Sat) 16:27:44)
いろいろ調べてみたのですが、拡大鏡の倍率を取得する方法が見当たりません。
ここの資料をあさったのですが、いい資料が見つかりませんでした。
どなたか関連情報をお持ちではないでしょうか。

○MSDNのリファレンスより
Form.AutoScrollPosition //スクロールの地点
this.PointToClient(Cursor.Position); //座標変換メソッド
Cursor.Position //カーソル座標
Screen.GetWorkingArea(this).Height //ディスプレイ作業領域。

○ほしい情報
・拡大鏡の現在の倍率
・ディスプレイの作業範囲。(指定したコントロールをディスプレイの中心に合わせるための計算に必要。)
引用返信 編集キー/
■70016 / inTopicNo.3)  Re[2]: フォーム拡大時 画面移動
□投稿者/ Jitta (130回)-(2014/02/17(Mon) 21:23:33)
No69973 (C#研究者 さん) に返信
> ○ほしい情報
> ・拡大鏡の現在の倍率
> ・ディスプレイの作業範囲。(指定したコントロールをディスプレイの中心に合わせるための計算に必要。)

拡大鏡は、magnifier です。
「magnifier」で検索すると、ルーペのような物理的な物が多数引っかかるので、
「magnifier site:msdn.microsoft.com」で検索しました。
すると、Magnifier API というものがあるようなので(いくつか、MSDN-F のスレッドが見つかります)、
「magnifier api site:msdn.microsoft.com」で検索すると、
「Magnification API Overview」というページがありました。
ここがトップになります。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms692162.aspx
引用返信 編集キー/
■70021 / inTopicNo.4)  Re[3]: フォーム拡大時 画面移動
□投稿者/ C#研究者 (29回)-(2014/02/18(Tue) 12:02:05)
Jitta様ありがとうございます。

このようなAPIがあるとは知りませんでした。教えてくださりありがとうございます。

ところで質問なのですが、画面のズーム処理をする際に

typedef struct tagMAGTRANSFORM {
float v[3][3];
} MAGTRANSFORM, *PMAGTRANSFORM;

このような構造体を見かけたのですが、
多次元配列の固定バッファの記述方法がわからないので
教えて下さればうれしいです。
引用返信 編集キー/
■70024 / inTopicNo.5)  Re[4]: フォーム拡大時 画面移動
□投稿者/ Hongliang (170回)-(2014/02/18(Tue) 17:19:41)
> 多次元配列の固定バッファの記述方法がわからないので

1次元配列として表現する必要があります。
引用返信 編集キー/
■70028 / inTopicNo.6)  Re[5]: フォーム拡大時 画面移動
□投稿者/ C#研究者 (32回)-(2014/02/19(Wed) 05:58:59)
この場合はこうなるのでしょうか。

float v[9];

引用返信 編集キー/
■70029 / inTopicNo.7)  Re[6]: フォーム拡大時 画面移動
□投稿者/ 魔界の仮面弁士 (533回)-(2014/02/19(Wed) 09:39:17)
No70028 (C#研究者 さん) に返信
>>> 多次元配列の固定バッファの記述方法がわからないので
>> 1次元配列として表現する必要があります。
メモリ配置的には、
 v[0][0]
 v[0][1]
 v[0][2]
 v[1][0]
 v[1][1]
 v[1][2]
 v[2][0]
 v[2][1]
 v[2][2]
の順で並びますね。


> この場合はこうなるのでしょうか。
> float v[9];
それだと、 C# 的には構文エラーになってしまうはずです。おそらくは、
  class MAGTRANSFORM
  {
    public float[] v;
    public MAGTRANSFORM()
    {
      v = new float[9];
    }
  }
もしくは
  unsafe struct MAGTRANSFORM
  {
    public fixed float v[9];
  }
という感じになるんじゃないかな…? (未確認)

引用返信 編集キー/
■70038 / inTopicNo.8)  Re[6]: フォーム拡大時 画面移動
□投稿者/ Jitta (132回)-(2014/02/19(Wed) 21:35:21)
No70028 (C#研究者 さん) に返信
> この場合はこうなるのでしょうか。
> 
> float v[9];
> 
 そのような場合は http://www.pinvoke.net/ と思ったのですが、
残念なことに Magnification API は、まだエントリされていませんでした。
こうかな?

using System.Runtime InteropServices;

[StructLayout(LayoutKind.Sequential)]
public struct MAGTRANSFORM
{
    [MarshalAs(UnmanagedType.R4, SizeConst=9)]
    public float[] v;

    public MAGTRANSFORM(float x, float y)
    {
        /*
         *    x, 0.0, 0.0
         *  0.0,   y, 0.0
         *  0.0, 0.0, 1.0
         *  と決まっている。
         */
        this.v = new float[9];
        float[0] = x;
        float[4] = y;
        float[8] = 1.0;
    }
}

引用返信 編集キー/
■70042 / inTopicNo.9)  Re[7]: フォーム拡大時 画面移動
□投稿者/ C#研究者 (33回)-(2014/02/20(Thu) 08:52:03)
皆様ありがとうございます。
おかげさまで有力なサンプルにたどりつくことができ、このAPIの概要をだいたい把握できそうです。

http://pastebin.com/mgAURmf0

ただ、このサンプルではこのコントロールに移っているものはあくまでビューで
拡大しているウインドウを操作できるものではありませんでした。

dumpbin /exportsでdllの見てみると、デスクトップの拡大鏡の倍率を操作できると思われる
「MagSetFullscreenTransform」がすでになくなっておりました。

私は拡大鏡プログラムを操作してデスクトップ上のカーソルのある場所まで表示を移動したり、
デスクトップのフルスクリーンそのものを拡大・縮小できるものだと思い込んでいたのですが、
そういうものではないのでしょうか。

引用返信 編集キー/
■70215 / inTopicNo.10)  Re[8]: フォーム拡大時 画面移動
□投稿者/ C#研究者 (53回)-(2014/03/03(Mon) 17:58:23)
自分で再度調べてみたのですが、
どうしてもうまくいきませんでした。

自動で拡大鏡の倍率を設定することはあきらめて拡大鏡に手動で倍率を設定して再度起動した後、
WinAPIのSendInputメソッドを使ってカーソルを移動させたりする等悪あがきもしましたが、歯が立ちませんでした。

他に似たような拡大鏡のオープンソースがあれば教えていただければと思います。(C#で動かせるもの。)

もしくは他の方法があれば恐縮ですが教えてください。
引用返信 編集キー/
■70273 / inTopicNo.11)  Re[9]: フォーム拡大時 画面移動
□投稿者/ C#研究者 (61回)-(2014/03/06(Thu) 16:31:03)
長期間回答がなかったので、
一度、こちらの質問を閉めようと思います。
ご協力ありがとうございます。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -