フランケンシュタイン?(調査中)

(※以下調査中の内容なので、内容には責任はとれません)


CSliderCtrlの摩訶不思議な挙動(仕様?)に苦しめられている...。


まず、設定。
#SetRangeの引数は、int型。
スライダに渡そうとしている保持データはDWORD型で、処理系を確認すると、ULONGを表すとのことだから、まずここでどうしようかと考える。


int型の範囲で設定出来るよう、スライダーにはintで渡し、受け取る方でULONGに換算する、という計算式をかいてみて、動作することが確認できたが、どうしても気になったので少し調べてみた。
この処理系ではint型もULONG型も同じ4バイトらしいので、実は、
ULONG型をそのまま放り込めるはず...だったが......
#OnHScrollで受け取った値をそのまま文字列に変換して表示させると.....
値がぐるぐる回っている
どうもUINT_MAXをぶち抜いておかしな値になり、0になってまた増えて...を4回くらい繰り返している。
何なんだ、これは


で、#OnHScrollの引数をよく見てみると...。
nPosの型がUINTだ
intで設定させて、UINTを返す?????
そりゃないだろと、MSDNを確認したら、

nPos が負になることもあるので、必要に応じて int にキャストします

え?え?どういうこと??
これは...一筋縄ではいかんようだ。
(試しにintにキャストしてみたら、ものの見事に負数になっていた。ええっと...0〜ULONG値で指定したはずですが......。)


ここから、ひとしきり、型変換の試みを行うが、どうキャストしてみても#OnHScrollのnPosの値はUINTで表現できる値をぶっちぎってぐるぐる回る。


いったいどうなっているんだと、#GetRangeMax(返り値はint型!)で設定直後の値を確認してみると...きちんとULONGで渡した値が設定されているように見える。
ということは...。


どうもnPosが怪しいということで、先のイベントハンドラの中で#GetPosを呼んでみた。
......。
......。
今度はぐるぐる回らなかった。
(これが正しい使い方なのかどうかは検証中)


え〜っと...。
巷には、nPosを受け取ってそのままデータの値として処理しているサンプルコードが山のように転がっているのですが.....。
どういうこと?