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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 >>
■2080  処理のタイミングについて
□投稿者/ 終 -(2007/03/16(Fri) 23:33:47)

    分類:[C# (Windows)] 

    2007/03/16(Fri) 23:36:48 編集(投稿者)

    自動でキー入力をするツールを作っているのですが、一つ質問させてください。
    説明のために簡略化したソースです:

    // A
    win32api.keybd_event((byte)charA, 0, 0, (UIntPtr)0);
    win32api.keybd_event((byte)charA, 0, 2/*KEYEVENTF_KEYUP*/, (UIntPtr)0);
    Thread.Sleep(500);

    Clipboard.SetDataObject(textBox1.Text);

    // Ctrl + V
    win32api.keybd_event((byte)Keys.ControlKey, 0, 0, (UIntPtr)0);
    win32api.keybd_event((byte)charV, 0, 0, (UIntPtr)0);
    win32api.keybd_event((byte)charV, 0, 2/*KEYEVENTF_KEYUP*/, (UIntPtr)0);
    win32api.keybd_event((byte)Keys.ControlKey, 0, 2/*KEYEVENTF_KEYUP*/, (UIntPtr)0);
    Thread.Sleep(500);

    // B
    win32api.keybd_event((byte)charB, 0, 0, (UIntPtr)0);
    win32api.keybd_event((byte)charB, 0, 2/*KEYEVENTF_KEYUP*/, (UIntPtr)0);
    Thread.Sleep(500);

    // C
    win32api.keybd_event((byte)charC, 0, 0, (UIntPtr)0);
    win32api.keybd_event((byte)charC, 0, 2/*KEYEVENTF_KEYUP*/, (UIntPtr)0);
    Thread.Sleep(500);

    順当に処理されれば、「A → 貼り付け → B → C」が0.5秒間隔で入力されるはずなのですが、
    「A →(1.5秒)→ 貼り付け&B&C」と、後半が同時に入力されてしまいます。
    これで、

    Clipboard.SetDataObject(textBox1.Text);

    か、もしくは

    // Ctrl + V

    の部分のどちらかが無ければ、0.5秒間隔でテンポ良く入力されるのですが、
    両方がある状態だとどうもうまくいかないようです。

    ひょっとすると初歩的なことなのかもしれませんが、
    どうにもお手上げ状態のため、どなたかご教示頂けましたら幸いです。
    どうぞよろしくお願い致します。(_ _)
親記事 /過去ログ10より / 関連記事表示
削除チェック/

■2087  Re[1]: 処理のタイミングについて
□投稿者/ よねKEN -(2007/03/17(Sat) 16:03:07)
>
    何のアプリをアクティブにしてキー入力しているのでしょうか?
    キー入力のメッセージをどのように処理するか?は受け側のアプリ側次第ですので、
    タイミングの調整は難しいかもしれません。

    例えば、他のアプリではなく、自分のアプリのテキストボックスに
    キー入力させるとどうなるでしょうか?
    提示のコードがbutton1のClickイベントに記述してあるとして、
    textBox2にキー入力させようとすると、0.5秒間隔で表示されずに
    たぶん一気にすべてのキー入力が表示されると思います。

    button1をクリックしたときに提示の処理が走りますので、
    その処理中にはtextBox2側でキー入力に対して処理できません。
    そのため、button1のクリックの処理後に一気に入力された文字が表示されます。

    つまり、相手側のアプリが何らかの処理でビジーになると
    すぐにはキー入力の結果は反映されません。
    #そのアプリはCtrl+Vの処理で忙しくなっているんではないかなと予想されます。
記事No.2080 のレス /過去ログ10より / 関連記事表示
削除チェック/

■2100  Re[2]: 処理のタイミングについて
□投稿者/ 終 -(2007/03/18(Sun) 21:42:52)
    2007/03/18(Sun) 21:45:34 編集(投稿者)

    ご回答ありがとうございます。
    実行時にアクティブにしていたアプリは、通常のテキストエディタです。
    ちなみにご指摘の通り、このアプリ内のtextBox内への表示に対しても
    順序に関する似たような問題が発生しております。

    #キー入力シミュレートが始まる前に表示させたいのに、実際には
    #全てのキー入力処理が終わった瞬間にようやく表示される

    確かにビジー状態に陥ってるような雰囲気ですが、ウェイトをかけるのに
    Thread.Sleep()を使用しているのがマズイのでしょうか。
    何か良い回避方法はありますでしょうか。。

    よろしくお願い致します。(_ _;
記事No.2080 のレス /過去ログ10より / 関連記事表示
削除チェック/

■1806  VC++で作成したコールバックDLLをc#で使用するには
□投稿者/ DLLをはじめて使う者 -(2007/03/06(Tue) 23:46:17)

    分類:[C# (Windows)] 

    はじめまして。
    DLLをはじめて使う者です。

    VC++でCBTProcをフックして、ウィンドウの状態を取得するDLLを
    作成しました。

    作成したDLL関数は全てCALLBACKです。
    それをC#で使用するにはどのように記述すればよいのでしょうか?

    以上、丸投げ感は否めませんが宜しくお願いします。

    以下VC++のソースです。

    #define STRICT
    #include <windows.h>
    #include <stdio.h>
    #include <HookDLL.h>

    #pragma data_seg(".sharedata")
    HHOOK hHookWnd = 0; // フックプロシージャハンドル
    HWND hWndSend = 0; // メッセージ送信先のウィンドウハンドル
    #pragma data_seg()

    // *************************************************************/
    // 関数名:DLLエントリポイント
    // *************************************************************/
    BOOL WINAPI DllMain(HINSTANCE hInst, DWORD fdwReason, LPVOID lpReserved)
    {
    (void)lpReserved;
    if(fdwReason==DLL_PROCESS_ATTACH) {
    hdll = hInst;
    }

    return TRUE;
    }

    // *************************************************************/
    // 関数名:コールバック処理
    // *************************************************************/
    LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    switch(nCode)
    {
    // ウィンドウが作成される
    case WM_USER+1:
    // 指定されたウィンドウへメッセージ送信
    PostMessage(hWndSend, WM_CREATEWINDOW, wParam, lParam);
    break;
    // ウィンドウがアクティブ化
    case WM_USER+2:
    // 指定されたウィンドウへメッセージ送信
    PostMessage(hWndSend, WM_ACTIVEWINDOW, wParam, lParam);
    break;
    // ウィンドウが破棄される
    case WM_USER+3:
    // 指定されたウィンドウへメッセージ送信
    PostMessage(hWndSend, WM_DESTROYWINDOW, wParam, lParam);
    break;
    }
    //次のフックを呼ぶ
    return CallNextHookEx(hHookWnd, nCode, wParam, lParam);
    }

    // *************************************************************/
    // 関数名:フックインストール
    // *************************************************************/
    void CALLBACK SetHook(HWND hWnd)
    {
    hHookWnd = SetWindowsHookEx(WH_CBT, CBTProc, hdll, 0);
    hWndSend = hWnd;
    }

    // *************************************************************/
    // 関数名:フックアンインストール
    // *************************************************************/
    void CALLBACK ReleaseHook()
    {
    UnhookWindowsHookEx(hHookWnd);
    }
親記事 /過去ログ10より / 関連記事表示
削除チェック/

■1812  Re[1]: VC++で作成したコールバックDLLをc#で使用するには
□投稿者/ 渋木宏明(ひどり) -(2007/03/07(Wed) 03:25:14)
>
    No1806 (DLLをはじめて使う者 さん) に返信
    > VC++でCBTProcをフックして、ウィンドウの状態を取得するDLLを
    > 作成しました。
    >
    > 作成したDLL関数は全てCALLBACKです。
    > それをC#で使用するにはどのように記述すればよいのでしょうか?

    ヘルプの関連項目って読みました?
    それほど難解なことは無いと思うんですが。

    アンマネージ DLL 関数の処理
    http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpguide/html/cpconConsumingUnmanagedDLLFunctions.asp

    > 以上、丸投げ感は否めませんが宜しくお願いします。

    まさかとは思いますが、どの関数を呼ぶべきかは自分で把握してますよね?
    おそらく、

    > // *************************************************************/
    > // 関数名:フックインストール
    > // *************************************************************/
    > void CALLBACK SetHook(HWND hWnd)
    > {
    > hHookWnd = SetWindowsHookEx(WH_CBT, CBTProc, hdll, 0);
    > hWndSend = hWnd;
    > }
    >
    > // *************************************************************/
    > // 関数名:フックアンインストール
    > // *************************************************************/
    > void CALLBACK ReleaseHook()
    > {
    > UnhookWindowsHookEx(hHookWnd);
    > }

    の2つを、C# のプログラムから呼びたいんですよね?
記事No.1806 のレス /過去ログ10より / 関連記事表示
削除チェック/

■1838  Re[2]: VC++で作成したコールバックDLLをc#で使用するには
□投稿者/ DLLをはじめて使う者 -(2007/03/07(Wed) 12:52:17)
    渋木宏明(ひどり) さん

    アドバイスありがとうございます。
    早速教えていただいたURLを参考に挑戦してみます。

    わからなかったらまたよろしくお願いします。

    No1812 (渋木宏明(ひどり) さん) に返信
    > ■No1806 (DLLをはじめて使う者 さん) に返信
    >>VC++でCBTProcをフックして、ウィンドウの状態を取得するDLLを
    >>作成しました。
    >>
    >>作成したDLL関数は全てCALLBACKです。
    >>それをC#で使用するにはどのように記述すればよいのでしょうか?
    >
    > ヘルプの関連項目って読みました?
    > それほど難解なことは無いと思うんですが。
    >
    > アンマネージ DLL 関数の処理
    > http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpguide/html/cpconConsumingUnmanagedDLLFunctions.asp
    >
    >>以上、丸投げ感は否めませんが宜しくお願いします。
    >
    > まさかとは思いますが、どの関数を呼ぶべきかは自分で把握してますよね?
    > おそらく、
    >
    >>// *************************************************************/
    >>// 関数名:フックインストール
    >>// *************************************************************/
    >>void CALLBACK SetHook(HWND hWnd)
    >>{
    >> hHookWnd = SetWindowsHookEx(WH_CBT, CBTProc, hdll, 0);
    >> hWndSend = hWnd;
    >>}
    >>
    >>// *************************************************************/
    >>// 関数名:フックアンインストール
    >>// *************************************************************/
    >>void CALLBACK ReleaseHook()
    >>{
    >> UnhookWindowsHookEx(hHookWnd);
    >>}
    >
    > の2つを、C# のプログラムから呼びたいんですよね?
    >
記事No.1806 のレス /過去ログ10より / 関連記事表示
削除チェック/

■2110  Re[3]: VC++で作成したコールバックDLLをc#で使用するには
□投稿者/ DLLをはじめて使う者 -(2007/03/19(Mon) 13:06:30)
    DLLをはじめて使う者です。

    さんざん調べたのですが、どうにもうまくできません。
    リファレンスを読んでもまったく理解できない状況です。
    (delegate云々だとは思うのですが、
    どうにも宣言の仕方、使用方法がわかりません。)

    すっぱりあきらめるのことはしたくないです。
    どうかコーディングの取っ掛かりを教えていただけないでしょうか?

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

    No1838 (DLLをはじめて使う者 さん) に返信
    > 渋木宏明(ひどり) さん
    >
    > アドバイスありがとうございます。
    > 早速教えていただいたURLを参考に挑戦してみます。
    >
    > わからなかったらまたよろしくお願いします。
    >
    > ■No1812 (渋木宏明(ひどり) さん) に返信
    >>■No1806 (DLLをはじめて使う者 さん) に返信
    > >>VC++でCBTProcをフックして、ウィンドウの状態を取得するDLLを
    > >>作成しました。
    > >>
    > >>作成したDLL関数は全てCALLBACKです。
    > >>それをC#で使用するにはどのように記述すればよいのでしょうか?
    >>
    >>ヘルプの関連項目って読みました?
    >>それほど難解なことは無いと思うんですが。
    >>
    >>アンマネージ DLL 関数の処理
    >>http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpguide/html/cpconConsumingUnmanagedDLLFunctions.asp
    >>
    > >>以上、丸投げ感は否めませんが宜しくお願いします。
    >>
    >>まさかとは思いますが、どの関数を呼ぶべきかは自分で把握してますよね?
    >>おそらく、
    >>
    > >>// *************************************************************/
    > >>// 関数名:フックインストール
    > >>// *************************************************************/
    > >>void CALLBACK SetHook(HWND hWnd)
    > >>{
    > >> hHookWnd = SetWindowsHookEx(WH_CBT, CBTProc, hdll, 0);
    > >> hWndSend = hWnd;
    > >>}
    > >>
    > >>// *************************************************************/
    > >>// 関数名:フックアンインストール
    > >>// *************************************************************/
    > >>void CALLBACK ReleaseHook()
    > >>{
    > >> UnhookWindowsHookEx(hHookWnd);
    > >>}
    >>
    >>の2つを、C# のプログラムから呼びたいんですよね?
    >>
記事No.1806 のレス /過去ログ10より / 関連記事表示
削除チェック/

■2111  Re[4]: VC++で作成したコールバックDLLをc#で使用するには
□投稿者/ シャノン -(2007/03/19(Mon) 13:25:48)
>
    No2110 (DLLをはじめて使う者 さん) に返信
    > DLLをはじめて使う者です。
    >
    > さんざん調べたのですが、どうにもうまくできません。
    > リファレンスを読んでもまったく理解できない状況です。
    > (delegate云々だとは思うのですが、
    > どうにも宣言の仕方、使用方法がわかりません。)

    .NETのdelegateは、C++で言えば関数ポインタのようなものです。
    VC++ DLLをVC++ EXEから使う時は、引数に関数ポインタを渡しますか?
    そうでないなら、delegateは関係ありません。
記事No.1806 のレス /過去ログ10より / 関連記事表示
削除チェック/

■2104  DateGridViewへのキーブレイク編集
□投稿者/ ありんこ -(2007/03/19(Mon) 11:06:16)

    分類:[VB.NET (Windows)] 

    はじめまして、ありんこと申します。

    VB.net2005[Windowsフォーム]と SQL-Server2005-Express を使い、
    親子関係にある2つのテーブルを組み合わせ DateGridView に結果を表示させます。

    この場合、内容が重複して繰り替えされる親データは、
    ブレイク時にだけ表示させ、重複時は空白表示を図ります。
    -----------------------------------------------------------
    [テーブル:伝票見出し]主キー:伝票NO
    伝票NO^計上日
    ------^------
    100001^07/3/1
    100002^07/3/3

    [テーブル:伝票明細]主キー:伝票NO,NO
    伝票NO^NO^コード
    ------^--^------
    100001^01^HK-001
    100001^02^HK-002
    100001^03^HK-003
    100002^01^MR-001
    100002^02^MR-002

    [DateGridView]
    伝票NO^計上日^NO^コード
    ------^------^--^------
    100001^07/3/1^01^HK-001
    ^^^^^^^^^^^^^^^^^^^02^HK-002
    ^^^^^^^^^^^^^^^^^^^03^HK-003
    100002^07/3/3^01^MR-001
    ^^^^^^^^^^^^^^^^^^^02^MR-002
    -----------------------------------------------------------

    重複分も表示する場合のSQL文を元に
    プログラム内で『DateGridViewに1行ずつ編集セット』する方法以外に、

    (1).SQL文でキーブレイク編集させる
    (2).DateGridViewの機能を使いキーブレイク編集させる

    上記のキーブレイク編集を実現する手段(1)や(2)の方法をご教授願います。
親記事 /過去ログ10より / 関連記事表示
削除チェック/

■2112  Re[1]: DateGridViewへのキーブレイク編集
□投稿者/ ありんこ -(2007/03/19(Mon) 13:43:35)
    質問者のありんこです。

    Unionを使って、見出し用と明細用のそれぞれのSelect文を結合させてから
    結合用の項目を[DataGridView]で非表示にさせる方法で実現しそうなので、
    質問を取下げます。

    ありがとうございました。

    Select
    F.伝票NO As 結合用
    ,F.伝票NO
    ,F.計上日
    ,D.明細NO
    ,D.コード
    From 伝票見出し As F Inner Join 伝票明細 As D
    On F.伝票NO = D.伝票NO
    Where D.明細NO = '01'
    Union
    Select
    伝票NO As 結合用
    ,Null
    ,Null
    ,明細NO
    ,コード
    From 伝票明細
    Where 明細NO <> '01'
    Order By 1,4
記事No.2104 のレス / END /過去ログ10より / 関連記事表示
削除チェック/

■2119  XmlSerializerにおけるencoding情報の登録
□投稿者/ M.K -(2007/03/19(Mon) 16:52:08)

    分類:[C# (Windows)] 

    何時もお世話になっております、M.Kと申します。

    開発環境は WinXP SP2 + VS2005 + C# です。


    とあるクラスの配列をXmlSerializerを使ってシリアライズしているのですが、
    出力されたXMLファイルの先頭部分が以下の様になっています。

    <?xml version="1.0"?>

    これを

    <?xml version="1.0" encoding="UTF-8"?>

    などの様にencodingの情報をシリアライズと同時に埋め込みたいのですが、
    この様な事はできるのか、またどの様に記述すれば良いのかを教えて頂け
    ないでしょうか?

    以上 宜しくお願いします。
親記事 /過去ログ10より / 関連記事表示
削除チェック/

■2120  Re[1]: XmlSerializerにおけるencodi
□投稿者/ HIRO -(2007/03/19(Mon) 17:17:42)
>
    2007/03/19(Mon) 17:18:45 編集(投稿者)

    No2119 (M.K さん) に返信
    > 何時もお世話になっております、M.Kと申します。
    >
    > 開発環境は WinXP SP2 + VS2005 + C# です。
    >
    >
    > とあるクラスの配列をXmlSerializerを使ってシリアライズしているのですが、
    > 出力されたXMLファイルの先頭部分が以下の様になっています。
    >
    > <?xml version="1.0"?>
    >
    > これを
    >
    > <?xml version="1.0" encoding="UTF-8"?>
    >
    > などの様にencodingの情報をシリアライズと同時に埋め込みたいのですが、
    > この様な事はできるのか、またどの様に記述すれば良いのかを教えて頂け
    > ないでしょうか?
    >
    > 以上 宜しくお願いします。

     シリアライズするときにXmlWriterを使用する。XmlWriterを作成するときに、
    XmlWriterSettingsを作成しEncodingを指定すればよいのではないでしょうか?
記事No.2119 のレス /過去ログ10より / 関連記事表示
削除チェック/

■2121  Re[2]: XmlSerializerにおけるencodi
□投稿者/ M.K -(2007/03/19(Mon) 17:58:21)
    No2120 (HIRO さん) に返信
    
    >  シリアライズするときにXmlWriterを使用する。XmlWriterを作成するときに、
    > XmlWriterSettingsを作成しEncodingを指定すればよいのではないでしょうか?
    
    HIROさん、お返事ありがとうございます。
    
    XmlWriterクラスを使用する事でEncodingを指定してXMLファイルを作成できる事は
    ヘルプで読み解けたのですが、クラスの配列をシリアライズする事とXmlWriterを
    結ぶものがわかりません。
    
    もし良ければ具体的なコードも記述して頂けないでしょうか?
    
    なお、私の方で記述しているシリアライズのコードは以下の通りです。
    
      XmlSerializer serializer = new XmlSerializer(typeof(Pattern[]));
      using (FileStream stream = new FileStream(FileName, FileMode.Create))
      {
          serializer.Serialize(stream, wrkPattern);
      }
    
記事No.2119 のレス /過去ログ10より / 関連記事表示
削除チェック/

■2124  Re[3]: XmlSerializerにおけるencodi
□投稿者/ Hongliang -(2007/03/19(Mon) 18:58:42)
>
    XmlSerializer の Serialize メソッドのドキュメントを調べてみてください。
記事No.2119 のレス /過去ログ10より / 関連記事表示
削除チェック/

■2125  Re[4]: XmlSerializerにおけるencodi
□投稿者/ M.K -(2007/03/19(Mon) 19:54:57)
    No2124 (Hongliang さん) に返信
    
    > XmlSerializer の Serialize メソッドのドキュメントを調べてみてください。
    
    Hongliangさん、お返事ありがとうございます。
    
    以下の様に記述したところ、望むような書式で保存されました。
    
      XmlSerializer serializer = new XmlSerializer(typeof(Pattern[]));
      XmlWriterSettings settings = new XmlWriterSettings();
      settings.Indent = true;
      settings.IndentChars = ("    ");
      settings.Encoding = Encoding.UTF8;
      using (XmlWriter writer = XmlWriter.Create(FileName, settings))
      {
          serializer.Serialize(writer, wrkPattern);
      }
    
    ありがとうございました。
記事No.2119 のレス / END /過去ログ10より / 関連記事表示
削除チェック/

■2102  GDI+で文字の縮小拡大+回転
□投稿者/ セイン -(2007/03/19(Mon) 10:26:11)

    分類:[C/C++] 

    いつもお世話になっています。
    C++ .NET で開発しております。

    GDI+で文字の縮小拡大+回転をしようとしましたが、
    両方共同時にしようとすると、正しく表示されません。
    求める動作は、横幅の広い文字や細い文字を表示することです。
    下記サイトの一番下の表示方法を参考にしました。

    http://park17.wakwak.com/~dragoon/gdiplus7.htm



    float XScale = 0.5; //Xスケール(0.5はスリム文字 1.5は幅広文字)
    float YScale = 1.0; //Yスケール
    Matrix mx;

    for( int i=0; i<=180; i+=45 )
    {
    mx.Scale(XScale, YScale);//スケール適応
    mx.RotateAt( (REAL)i, origin );
    graphics.SetTransform( &mx );
    SolidBrush brush( Color(255-i, 0,0,0) );
    graphics.DrawString( pStr, -1, &myFont, origin, &format, &brush );
    }


    上記を動かすと、90度に回転した図は、Y方向にスリム文字になってしまっています。(45度では斜体のような表示)


    別手段として、↓の方法も考えましたが、origin2の座標の補正の計算式が思い浮かびません。
    下記は0度90度180度のときの補正位置をベタで書いてみています。
    この方法で行く場合は、計算式どのようになるのでしょうか?

    float XScale = 0.5; //Xスケール(0.5はスリム文字 1.5は幅広文字)
    float YScale = 1.0; //Yスケール
    Matrix mx;

    for( int i=0; i<=180; i+=45 )
    {
    PointF origin2(origin);

    //計算
    if( i == 0 ) {
    origin2.X = origin.X / 0.5f;
    origin2.Y = origin.Y / 1.0f;
    }
    if( i == 90 ) {
    origin2.X = origin.X;
    origin2.Y = origin.Y + (origin.Y*0.5f);
    }
    if( i == 180 ) {
    origin2.X = origin.X / 1.5f;
    origin2.Y = origin.Y / 1.0f;
    }

    mx.RotateAt( (REAL)i, origin2);

    graphics.SetTransform( &mx );
    graphics.ScaleTransform(XScale, YScale);
    }


    上記2種類以外にも、こんな方法を使えば、回転+縮小拡大の文字が扱えるよという方法ございましたら
    ご教授願います。
    よろしくお願いいたします。
親記事 /過去ログ10より / 関連記事表示
削除チェック/

■2108  Re[1]: GDI+で文字の縮小拡大+回転
□投稿者/ オノデラ -(2007/03/19(Mon) 12:32:30)
    ぱっと見ただけで試していないのですが、単にループごとに mx を初期化していないだけではないでしょうか?
記事No.2102 のレス /過去ログ10より / 関連記事表示
削除チェック/

■2109  Re[2]: GDI+で文字の縮小拡大+回転
□投稿者/ セイン -(2007/03/19(Mon) 13:02:00)
    No2108 (オノデラ さん) に返信
    > ぱっと見ただけで試していないのですが、単にループごとに mx を初期化していないだけではないでしょうか?

    ループの中で
    float XScale
    float YScale
    Matrix mx

    宣言してみましたが、同じでした。
    求める動作になりません。
    引き続きお願いいたします。
記事No.2102 のレス /過去ログ10より / 関連記事表示
削除チェック/

■2128  Re[3]: GDI+で文字の縮小拡大+回転
□投稿者/ オノデラ -(2007/03/19(Mon) 23:22:04)
>
    2007/03/19(Mon) 23:29:14 編集(投稿者)

     すいません。テストできる環境にいなかったので返信が遅れました。

     リンク先にも書いてあるとおり、Matrix は「行列」を使った計算になります。

     例えばスカラー式「A・B」は「B・A」と等しいですが(A・B=B・A)、行列式の「A×B」は「B×A」と等しくなりません(A×B≠B×A)。(高校数学ですね(^_^))

     で、何が言いたいかというと、「Matrix.Scale」や「Matrix.RotateAt」メソッドは上記の行列式を内部で行っています。「拡大してから回転」するのと「回転してから拡大」するのでは最終的な表示結果が異なってきます。

     セインさんが行いたいのは「拡大してから回転」になるので、セインさんの書いた処理で正しいように見えますが、実は「Matrix.Scale」などのメソッドはデフォルトでは「前掛け」の計算になってしまいます。

     どういうことかというと、Matrix.Scale、Matrix.RotateAt の順番で処理しても「結果=回転×拡大」となってしまうのです。

     これを解決するには、単純に処理の順番を反対にする方法もありますし、Matrix.Scale メソッドとMatrix.RotateAt の第3引数に「MatrixOrder」を指定して掛ける順番を指定できるので、そこを「MatrixOrder::Append」として指定してください。

    //-----------------------------------------------------//
    float XScale = 0.5; //Xスケール(0.5はスリム文字 1.5は幅広文字)
    float YScale = 1.0; //Yスケール

    for( int i=0; i<=180; i+=45 )
    {
    Matrix mx;
    mx.Scale(XScale, YScale, MatrixOrder::Append );//スケール適応
    mx.RotateAt( (REAL)i, origin, MatrixOrder::Append );
    graphics.SetTransform( &mx );
    SolidBrush brush( Color(255-i, 0,0,0) );
    graphics.DrawString( pStr, -1, &myFont, origin, &format, &brush );
    } // これであってるかな?
    //-----------------------------------------------------//

    ※余談ですが、Graphics::DrawString の point 引数を使用すると、「結果=移動×拡大×回転」になることに注意してください。
記事No.2102 のレス /過去ログ10より / 関連記事表示
削除チェック/

■2130  コンパイルエラーについて
□投稿者/ kozu -(2007/03/20(Tue) 01:05:32)

    分類:[Java] 

    以下をコンパイルするとコンパイルエラーになってしまいます。どう修正していいのかわかりません。(すいません初心者なものでレベル低い質問だったらごめんなさい)コンパイルエラーの内容は下記⇒に記述しました。
    import java.util.ArrayList;

    public class MainTest1 {

    public static void main(String args[]) {
    ScoreReader read = new ScoreReader(args[0]);
    ArrayList readfile = read.fileArray(); /*メソッドの呼び出し*/

    ArrayList total = (ArrayList) readfile.get(0); /*readfileから要素を取得*/
    total.add("合計");
    readfile.remove(0);
    readfile.add(0, total); /*readfileに"合計"を追加*/

    ArrayList subTotal = new ArrayList();
    subTotal.add("科目合計\t");
    int[] subTotaltmp = new int[total.size()-1];
    int listTotal = 0;

    for(int i = 1; i < readfile.size(); i++){
    ArrayList list = (ArrayList) readfile.get(i);

    for(int j = 0; j < list.size(); j++){
    if(!total.get(j).equals("名前")){
    /*数値チェック*/
    try{
    subTotaltmp[j] += Integer.parseInt((String)list.get(j).toString()); /*科目の合計*/
    listTotal += Integer.parseInt((String)list.get(j)); /*個人の点数合計*/

    }catch(NumberFormatException e){
    System.out.println("数値以外入力されている為エラー");
    System.exit(1);
    }
    }
    }
         list.add(listTotal);⇒シンボルを見つけられません。シンボル:メソッドadd(int)
                                   場所:java.util.ArrayListのクラス
    readfile.remove(i);
    readfile.add(i, list); /*個人の点数合計を追加*/
    listTotal = 0;
    }
    int finalTotal = 0;

    for(int j = 0; j < subTotaltmp.length; j++){
    if(!total.get(j).equals("名前")){
    subTotal.add(subTotaltmp[j]);⇒シンボルを見つけられません。シンボル:メソッドadd(int)
                          場所:java.util.ArrayListのクラス
    finalTotal += subTotaltmp[j]; /*科目の総計*/
    }
    }
         subTotal.add(finalTotal);⇒シンボルを見つけられません。シンボル:メソッドadd(int)
                       場所:java.util.ArrayListのクラス
         readfile.add(subTotal); /*readfileに総計を追加*/

    /*readfileのデータ数からソート*/
    for(int i = 0; i < readfile.size() - 3; i++){
    for(int j = 1; j < readfile.size() - 2; j++){
    ArrayList sort1 = (ArrayList) readfile.get(j);
    ArrayList sort2 = (ArrayList) readfile.get(j + 1);

    if((Integer)sort1.get(sort1.size() - 1) < (Integer)sort2.get(sort2.size() - 1)){
    ⇒演算子<はjava.lang.Integer,java.lang.Integerに適用できません。

    readfile.remove(j + 1);
    readfile.add(j, sort2);
    }
    }
         }
         for(int i = 0; i < readfile.size() - 1; i++){
    ArrayList tmpArrayList = (ArrayList) readfile.get(i);
    if(i == 0){
    tmpArrayList.add(0, "順位"); /*"順位"を追加*/
    }else{
    tmpArrayList.add(0, i); /*1〜5の数字を追加*/
    }
    readfile.remove(i);
    readfile.add(i, tmpArrayList);⇒シンボルを見つけられません。
                     メソッド:add(int,int) 場所:java.util.ArrayListのクラス
    }

    Writedown.fileWrite(readfile); /*WritedownのfileWriteメソッドの呼び出し*/
    }
    }
親記事 /過去ログ10より / 関連記事表示
削除チェック/

<前の20件 | 次の20件>

<< 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 >>

ヒット件数が多いので過去ログ1〜10 までの検索結果 / 過去ログ11からさらに検索→

パスワード/

- Child Tree -