2015年4月23日木曜日

Visual C++のFeature Packをインストールすると、Visual Studioのような自由にドッキング可能なウィンドウが簡単に実現できるけど、ドキュメントが少なくてちょっと苦労する件

自分に対する備忘録です。


  • x閉じるボタンで閉じた時に、CPane派生クラスを削除する方法

    ドッキングフレームウィンドウのxボタンを押すとウィンドウは閉じたように見えるけれど、実際には作成たCPane派生クラスのウィンドウは非表示になっているだけ。フレームワークは、CPaneのコンテナウィンドウ(直接の親ミニフレームウィンドウ)しか破棄してくれない。
    xボタンを押した時にそのCPane派生ウィンドウも破棄するには、ドッキング対象の親フレームウィンドウクラス(CMDIFrameWndExとか)のOnCloseDockingPaneメンバ関数をオーバーライドする。そして、この関数に渡されるCDockablePaneに対して、WM_CLOSEをPostMessageすると良いようだ。
    SendMessageはダメで、あくまでもフレームワークにいったんCPaneを非表示にさせておいて、その後WM_CLOSEハンドラで削除するという流れになるようだ。

  • x閉じるボタンを押さないで、アプリ側から特定のドッキングウィンドウを削除する方法

    これは結構悩みました。CPaneがフローティング状態か、ドッキングしているか、他のドッキングウィンドウとのタブ化されているか、ドッキング後隠れている状態かといろんな状態があって、それによってコンテナウィンドウが違うんですね。どの親コンテナに、どんなメッセージを送るべきか、あるいは、どの関数を呼ぶべきか・・・。

    結論は、そういうアプローチじゃなかったです。自分のCPane派生クラスのOnPressCloseButton()メンバ関数を呼ぶだけで良かったんです。それで、上のいろんなドッキング/フローティング状態からも、その親ミニフレームウィンドウも含めて、うまくウィンドウを破棄してくれました。

2015年4月3日金曜日

備忘録


  • Windows8はTFTPクライアントを持っているが、デフォルトではインストールされていない。「プログラムのアンインストールと変更」から「Windowsの機能の有効化と無効化」から追加できる。
    ただし、ファイアウォール設定でTFTPに許可を与えないと実際の通信はできない。これは、TFTPクライアントが送信した最初のコマンドパケットに対して、TFTPサーバは別のポート番号から応答パケットを返すので、Windowsはこれを「攻撃」とみなすようだ。
  • UDPソケットでは、bindをしないと受信ができない(という仕様らしい)。送信はbindしなくてもできる。
  • Windowsのファイルウォール設定で、アプリケーション名(exe)を指定して通信を許可するときは、ジャンクション上のパスを指定してはいけない。この場合、通信(受信)はブロックされてしまう。
    ジャンクションの先のパス名を指定すればOK。手動で設定する場合は、人間が確認して設定すればよいが、プログラム上でファイアウォール設定をするときは何らかの方法でジャンクションの設定先パス名に変換しなければならないので、少し面倒臭い。