Search
Categories
Articles
Rainmeter関連
ファイル置き場
お知り合いなど

スポンサーサイト

--.--.-- | スポンサー広告

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[Rainmeter-dev] issue 111

2009.09.27 | Rainmeter-dev // Issue/マルチモニタ関連

2 Comments

r229で入れた変更がどうやらバグを生んでいたようで、バタバタですが取り急ぎその部分の変更を取り消しました。
WebParserでの単純な勘違いによるコピペミスもそうですけど、なんだか変更するたびにどこかバグを埋め込んでる感じでダメダメですね……。
[Measure]の置き換えの挙動修正も、今まで動いてたものが動かなくなることもあって、もう少し後方互換性を考慮した形での修正も含めてからにしたほうがよかったなぁと……)

今回のバグは、自分の環境の設定では起こらないものでした……。

/*
** OnMove
**
** Stores the new place of the window so that it can be written in the config file.
**
*/
LRESULT CMeterWindow::OnMove(WPARAM wParam, LPARAM lParam) 
{
    // Store the new window position
    m_ScreenX = (SHORT)LOWORD(lParam);
    m_ScreenY = (SHORT)HIWORD(lParam);
/*
    if(m_Dragging)
    {
        OutputDebugString (_T("OnMove Dragging\n"));
    }
    else
    {
        OutputDebugString(_T("OnMove No Dragging\n"));
    }
*/
 
    if (m_SavePosition && m_Dragging)
    {
        //TODO: Recaculate WindowX/Y based on position flags
        //m_WindowX = m_ScreenX;
        //m_WindowY = m_ScreenY;
        ScreenToWindow();
        WriteConfig();
    }
    m_Dragging = false;
 
    return 0;
}

OnMove()はWM_MOVEが送られてきたとき、すなわちウィンドウの移動後に処理されます。
この「ウィンドウの移動後」というタイミングが、「ドラッグ中にウィンドウの内容を表示する」という設定をオンにしているかオフにしているかで変わるようで……。
(この設定はXPだと「画面のプロパティ」-「デザイン」-「効果...」にあります)

オフ(うちの環境)だと、ドラッグ中にはまったく送られてこず、ボタンを離すとWM_MOVEが送られてきます。
オンだと、ドラッグしてウィンドウを動かしている最中でも、たぶんその説明の通り、ウィンドウの内容を表示するために何度もWM_MOVEが送られてきます。オフのほうだけを確認して、てっきり「ドラッグ中には送られてこないんだ」と勘違いしてました。

赤字の "m_Dragging = false;" は、ドラッグが終わってもm_Draggingがそのままtrueを維持し続ける変な状態を修正しようと入れたのですが(コード上はOnLeftButtonDown()でm_Draggingがtrueにされ、OnLeftButtonUp()でfalseにリセットするようになっているけれど、ボタン押下からドラッグに遷移すると、ドラッグが終わってもOnLeftButtonUp()が呼ばれないので、リセットされずtrueのままになっている)、WM_MOVEが1度しか飛んでこないか、何度も飛んでくるかで話が全然違ってきます。

オフだと、ドラッグが終わってからWM_MOVEが飛んでくるので、ドラッグ終了位置を書きだしてm_Draggingをクリアして終わります。
オンだと、ドラッグ中に飛んでくる最初のWM_MOVEで現在値を書き出してm_Draggingをクリアしてしまい、その後のドラッグが終わったときのWM_MOVEでドラッグ終了位置を書き出せずに終わってしまいます。結果、refreshなどをすると、ドラッグ終了位置から最初に書き出した位置にジャンプしてしまうような(位置が全くセーブされていないような)挙動になります。

環境依存な問題ならまだしも、基本的なシステム設定の違いでこういうバグを埋め込んじゃうのはいただけないですね……。反省。
正直なところ、trueを維持していようが、動作としては特に問題なさそうではあったので、そのままにしておいてもよかったわけで(特に1.1正式版リリース間近なのに)、最近のポカミスラッシュとかいろいろ含めて結構凹み中ですorz

スポンサーサイト

いろいろと修正中

2009.09.21 | 雑記

2 Comments

つい先日から正式にRainmeterに開発メンバーとして参加することになりまして、バグなどの修正をメインに行っていこうと考えています。
ほとんどは以前からちょこちょこ書いていた内容メインですが。

そういうこともあって、ブログ記事の内容が本家の修正のものなのか、単に自分自身がこう書いてみたというものなのか分かりにくいとあれだなぁと思いまして、いろいろと過去記事を統合したりしてます。
(WM_SETTINGCHANGE絡みの問題も、本家はまた違うアプローチになってしまうかもしれないし、いろんな記事に分散させず、備忘録としてひとつの記事に統合しようかと……)

とりあえずは本でも読んで勉強することにします。
マルチモニタ関連はさすがに載ってないけど、初歩には結構よさそうな「APIで学ぶWindows徹底理解」を買ってきたので、まずそちらから……。

Vistaとか7とか

2009.09.14 | PC関連

0 Comments

うちにはXPのマシンしかないので、UACとかAeroとかでの動作を検証しようがないんですよねぇ……。
修正を入れるにしても、それがUACに引っかからないかどうか、64ビット版ではどうかとか、Aeroを有効にしたまま使えるのかとか("On Desktop"にすると消えちゃう、みたいな)謎なところも多くて、原因を絞り込むのも自分の手だけでは難しいというか。Windows7のRC版が先月までダウンロードできたみたいですが、それ落としとけばよかったなぁと後悔。

他には何かないかなと調べてたどり着いたのが、VirtualPC + Vista(30日間限定の試用版)の記事。
とりあえずうちのPenM機に突っ込んでみましたよ。起動して使えるようになるまでに1時間半くらいかかったよ……。で、肝心なことに気づくわけですよ。

Aero有効にできないYO!

……ある意味それが目的だったのにいきなり出鼻を挫かれてしまった気分。
でもUACの方はちょこちょこポップアップダイアログが出てきて、こういうときに出てくるんだなーというのを確認できました。懸念してた点は大丈夫そうだった。
しばらくはいじって遊ぼう……。

[GDI+] InterpolationModeをいじる

2009.09.04 | Rainmeter-dev // その他

0 Comments

Rainmeter1.0では、全MeterでAntiAliasの設定ができるようになったので、画像系のMeterでもAntiAliasが反映されるようになりました。
AntiAliasの設定は、主に図形のエッジのエイリアスを改善する使い方が多く、たぶんこれはRotatorで画像を傾けたときにも反映されるんだと思いますが(試してない)、それだけでなく、画像を拡大/縮小したときに使われる補間方法も変わっています。この補間方法をいろいろ変えて遊んでみました。

補間方法の設定には、SetInterpolationMode()を使います。引数には、InterpolationMode列挙体のどれかを指定します。

InterpolationModeDefault
Specifies the default interpolation mode.

InterpolationModeLowQuality
Specifies a low-quality mode.

InterpolationModeHighQuality
Specifies a high-quality mode.

InterpolationModeBilinear
Specifies bilinear interpolation. No prefiltering is done. This mode is not suitable for shrinking an image below 50 percent of its original size.

InterpolationModeBicubic
Specifies bicubic interpolation. No prefiltering is done. This mode is not suitable for shrinking an image below 25 percent of its original size.

InterpolationModeNearestNeighbor
Specifies nearest-neighbor interpolation.

InterpolationModeHighQualityBilinear
Specifies high-quality, bilinear interpolation. Prefiltering is performed to ensure high-quality shrinking.

InterpolationModeHighQualityBicubic
Specifies high-quality, bicubic interpolation. Prefiltering is performed to ensure high-quality shrinking. This mode produces the highest quality transformed images.

AntiAlias=0(Rainmeter1.0以前も含む)のときに使われる補間方法としては、InterpolationModeDefaultという規定値が使われています。実際にどんな補間方法が使われているのかというと……デフォルトの補間モードと書かれてあるだけで、中身は不明です。AntiAlias=1では、InterpolationModeBicubicが指定されています。

Bicubicでは、画像を縮小する用途に使うと汚くなることがあるので、デフォルトとするにはあまり好きにはなれないんですが、じゃあほかのモードだとどんな感じになるのかなと、MeterImageで補間方法を指定できるようにして比べてみました。LowQualityとHighQualityはよくわからないので除外。

写真よりは細めの文字のほうがわかりやすいと思うので、適当な文章で画像(240x80)を作ってテスト。

元画像×0.55

まずは縮小。
Disabled(AntiAlias=0)でいいんじゃないかという……。AntiAlias=1のデフォルトBicubicはシャープがかかりすぎていて、少しガタガタして見えます。
一番汚いのはやっぱりNearest Neighborで、Bilinearも思っていたよりはボケ具合が大きい。HighQualityBicubicは一番はっきりしていて綺麗だけれど、Disabledよりは負荷は増えるのかなぁと。

元画像×1.3

次に拡大。
拡大率があまり高くないので、Nearest Neighbor以外はあまり変わらない感じ。率が大きくなるほど、Bicubicの2つは他より綺麗に表示してくれます。Bilinearは縮小のときと同じく、率が大きくなるとボケてきます。
これでもDisabledなもので十分綺麗。AntiAlias=0を=1にすると、画像の大きさと拡大率につれて負荷も大きくなっていくので、=0で使ってもいいのかなぁと思ったり。
(ただ、AntiAliasは冒頭にも書いたように変形時のアンチエイリアスも兼ねているかもしれないので、それが必要ならオフにできないかも?)

個人的な結論としては、縮小するときにはAntiAlias=0を使って、拡大するときにも基本は=0で、綺麗に補間したいときだけ=1で使えばいいかなぁと。
それにしても、中身が謎なInterpolationModeDefaultが一番使い勝手がいいっていうのも……デフォルトだからか。

<追記>
もっと小さいの(x0.3)と、もっと大きいの(x2.35)も撮ってみた。

元画像×0.3 元画像×2.35

[Rainmeter-dev] Imageに透明度指定を入れてみる

2009.09.01 | Rainmeter-dev // その他

0 Comments

Rainmeterは透過pngに対応しているので、もし画像を表示する際に透過効果を持たせたければ、あらかじめ透過pngとしてファイルを作っておく必要があります。
ですが、jpg画像を使いたいときや、オリジナルファイルをいじりたくないときもあります。DynamicVariablesで文字色やその透明度が動的に変えられるようになったのもあって、画像描画時の透明度も同じように替えられてもいいんじゃないかと思い、試しにコードを書いてみました。

設定としてAlphaValueを追加し、値には0(透明)~255(不透明)を指定します。

    m_AlphaValue = parser.ReadInt(section, L"AlphaValue", 255);
    m_AlphaValue = min(255, m_AlphaValue);
    m_AlphaValue = max(0, m_AlphaValue);

255が指定されているときは今まで通りに描画し、それ以外ではColorMatrixを使って透明度を反映させます。

        if (m_AlphaValue == 255)
        {
            graphics.DrawImage(m_Bitmap, r, 0, 0, imageW, imageH, UnitPixel);
        }
        else
        {
            REAL alp = m_AlphaValue / 255.0f;
 
            // Initialize the color matrix
            ColorMatrix colorMatrix = { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
                                        0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
                                        0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
                                        0.0f, 0.0f, 0.0f, alp,  0.0f,
                                        0.0f, 0.0f, 0.0f, 0.0f, 1.0f };
 
            // Create an ImageAttributes object and set its color matrix
            ImageAttributes imageAtt;
            imageAtt.SetColorMatrix(&colorMatrix, ColorMatrixFlagsDefault, ColorAdjustTypeBitmap);
 
            // Draw the semitransparent bitmap image
            graphics.DrawImage(m_Bitmap, r, 0, 0, imageW, imageH, UnitPixel, &imageAtt);
        }

ColorMatrixの5x5のうち、縦横それぞれの4番目が透明度に対応します(赤字の部分)。取る範囲は0.0-1.0なので、0-255から変換して指定します。
あとはそのColorMatrixをImageAttributesに設定して、DrawImage関数の引数に加えるだけです。MeterBitmapでも同じようにできそうです。

やはり実行時に透明度処理をするので、若干CPU使用率は上がってしまいますが、どうしても実行時に反映させたいという用途にはいいのかなと。
本来ならばDynamicVariablesでの透明度更新も含めてフェードアニメーションに使うようなものかもしれないけど、Rainmeterは仕組み上(表示にGDI+を使っているのも含め)アニメーションに弱いので、使いづらいものではあるんですが……。

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。