今日の閲覧数が376という驚異的数字になっている.どうしたのだろう?通常,この数字は今日の訪問者数+1~3程度のものだったのだが… つまり,ほとんどの訪問者は最初に開いたページから移動しないで離脱するというのがこれまでの常態だったのだが…
考えられる理由としては昨日の投稿のタイトルが「非公開投稿」とあったのをなにか勘違いして,どこかにトップシークレットが漏れているのではないかと思って探し回ったため,くらいのことしか思いつかない.
暖かくなってきたので,昨日からまたウォーキングを再開した.スマホは持ち出していないので歩数はカウントできていないが,かなり短い距離しか歩いていない.おそらく2000歩は超えていないのではないかと思う.去年の冬,ウォーキング休止になる前の歩数が5000歩くらいだったと思うので,その1/3くらいの距離だ.なんとかまだ歩けるだけでもうれしい.少し歩いていれば5000歩くらいまでには回復できると思う.
さて,そろそろクリップ領域の問題にケリを付けることにしよう.クリッピングでは,①現在のクリップ領域と描画の対象となる矩形領域の論理和を取って描画を実行し,②そのあと元の状態に戻すという操作を行っている.②の操作でRGN_COPYモードでSelectClipRgnを実行するとき,第一引数を空にしてやれば問題なく描画することができる.これで事実上描画できているし,それによる実害というのも特に考えられないので,とりあえずはこのままでもよいと思われるのだが,もう少し突っ込んでみたい.⇒問題は以下の3行だ.
SetClipRegion(pdc, crect, RGN_AND, &oldrect); (1)
DrawNameText(pdc, Frame);
SetClipRegion(pdc, oldrect, RGN_COPY, NULL); (2)
しかし,このパターンはここにだけ現れるのではない.少なくとも以下の複数箇所で同じパターンが使われている.しかも,縦書きではこの論理で通っているのだから,その論理が横書きで通らないということは考えられない.というより,問題だ.
- NAMEBOX::DrawName
- Bobject::DrawTextBox
- Bobject::DrawTextLine
- NAMEBOX::DrawImage
- PAGESETUP::PrintPage
- TITLEBOX::Draw
(1)式ではクリップ領域を取り出し,(2)ではそれを書き戻している.(1)ではoldrectをGetClipBoxで取り出している.クリッピングの対象領域crectは論理座標単位で_CDC::LPtoDPで物理座標に直交変換している.この矩形領域をCreateRectRgnIndirectでクリップ領域に変換してCDC::SelectClipRgnが実行される.デバイスコンテキストが保持しているクリップ領域は物理単位でかつ直交変換されたものでなくてはならないと考えられる.(1)と(2)の内部処理は共通でいずれの場合もCDC::SelectClipRgnが呼び出される.
どうも解決したようだ!(1)で取り出したoldrectを直交変換して保持するように修正した.これでよいのではないかと思う.この動作から推定すると,GetClipBoxで取り出される矩形領域は(明示されていないが)論理座標系であると思われる.Bobject::SetClipRegionはBobject::setClipRegionのラッパになっているので,この部分は親のSetClipRegionで実行するように切り分けておくことにする.
これでようやく三本桜の実装に移ることができる.三本桜とはコラッツ木のバリエーションで,①一般コラッツ木,②仮想コラッツ木(長子木),③完全コラッツ木の3種を意味する.小学校の入学式の記念写真を満開の桜の木の下で撮影するというのは,わたしの母校に限らず日本中の小学校で行われていたようだが,年々桜の開花日は早くなっている.今日のコースには桜土手が一部含まれていたのですでにかなりほころび始めているのが確認されたが,桜が満開になるまでにこの改修を完了できるかどうかは確言できない…まぁ,やることは決まっているので,それほど手間取ることもないだろうとは思う…