◀ANSI版開発トップへ
  • 4730 CTabWnd
    • 4732 Re:CTabWnd
      • 4735 Re2:CTabWnd
        • 4739 Re3:CTabWnd
        • 4741 Re3:CTabWnd
          • 4748 Re4:CTabWnd
            • 4749 Re5:CTabWnd
            • 4752 Re5:CTabWnd
  • [4730] CTabWnd wakura 2007年03月12日 18:19

    SetWindowLongPtrする場所間違ってるっぽい。
    タブバーが消えるとかなんとかのバグがあった気がする
    のはこのためかも
    • [4732] Re:CTabWnd げんた 2007年03月13日 00:29

      ▼ wakuraさん
      > SetWindowLongPtrする場所間違ってるっぽい。
      えっ,どこどこ?
      各種設定を行う前にいきなりサブクラス化するのが問題になるということですか?

      できれば
      - 不具合の出る状況
      - 修正内容
      - 修正後の確認結果
      をまとめてもらえると助かります.
      • [4735] Re2:CTabWnd wakura 2007年03月13日 18:23


        597行目
        CreateWindow実行中にWM_CREATEイベントが発生するからCreateWindow
        の後に実行したのでは遅い。
        他の箇所はWndProcの中かWM_CREATE/WM_INITDIALOGの中でSetWindowLongPtrしている。
        • [4739] Re3:CTabWnd ryoji 2007年03月13日 21:37

          ▼ wakuraさん
          > 他の箇所はWndProcの中かWM_CREATE/WM_INITDIALOGの中でSetWindowLongPtrしている。
          本質的には、SetWindowLongPtrの位置が間違いなのではなく、
          親ウィンドウをCreateしてから子ウィンドウをCreateするのか
          親ウィンドウのCreateの最中に子ウィンドウをCreateするのか
          の違いだと思います。
          CTabWndは前者ですね。CEditWndやCFuncKeyWndも前者です。
          というか、CWnd::OnCreate()は誰も使っていないみたいですね。
          子ウィンドウのサブクラス化は対象の子ウィンドウを作ってからでないとできないので、前者なら自動的に親ウィンドウのCreate後ということになります。
          たまたま最初に作った人が前者の手順で作ったというだけの話のように思います。
          後者の手順のほうが普通っぽい気はしますが。。。
        • [4741] Re3:CTabWnd ryoji 2007年03月14日 02:33

          ▼ wakuraさん
          > 597行目
          あれ?次の行のサブクラス化ぢゃなくてGWLP_USERDATAのほうですか?
          だったら、サブクラス化(GWLP_WNDPROC)の前にやってるので問題ナッシングではないのかなぁ~。
          thisポインタにアクセスするのはサブクラスプロシージャのほうですからね。
          WC_TABCONTROLのシステム定義ウィンドウプロシージャがGWLP_USERDATAをthisポインタとして解釈することはないでしょ?
          なんか見当違いしてますかね。σ(^^;
          • [4748] Re4:CTabWnd wakura 2007年03月15日 21:51


            CreateWindowから戻ってきたときにはすでにウインドウメッセージは飛び始めた後なので、
            サブクラス化のタイミングが遅いんじゃないかなぁと思ったのです。
            (それまでのメッセージが不要なら、無問題です)

            あと、CreateWindowの前にグローバル変数にオブジェクトを代入してWM_CREATEで拾う
            方法がサクラでは一般的なようですが、マルチスレッドで動き出したら乙るので、
            なんかいい方法ないかなとググってたら、いいもの見つけました。

            http://techtips.belution.com/ja/vc/0009/

            この例だと、グローバル変数を使わずにカプセル化できています。
            (SetPropというAPIが便利そう。
            • [4749] Re5:CTabWnd (全略) 2007年03月16日 00:04

              ▼ wakuraさん
              >
              > CreateWindowから戻ってきたときにはすでにウインドウメッセージは飛び始めた後なので、
              > サブクラス化のタイミングが遅いんじゃないかなぁと思ったのです。
              > (それまでのメッセージが不要なら、無問題です)
              大したメッセージ流れないし、いいんじゃないですか?
              昔調べた時のメモですが↓のような順番でした

              * CreateWindowしてからCreateWindowを抜けるまでに飛ぶメッセージ
              WM_GETMINMAXINFO
              WM_NCCREATE
              WM_NCCALCSIZE
              WM_CREATE

              ふつーのアプリケーションにはどー考えても不要かと(^^;
              # 後、コモンコントロール系のWM_CREATEはとれないことはないけど、あまりとらないんじゃ?
            • [4752] Re5:CTabWnd ryoji 2007年03月16日 02:57

              ▼ wakuraさん
              > この例だと、グローバル変数を使わずにカプセル化できています。
              > (SetPropというAPIが便利そう。
              うろ覚えだけど、SetPropよりもTLS使うほうが高速らしいですよ。
              言わずもがなで気付いいちゃいても、即、恩恵に結びつかないスマート化には皆さんなかなか手が回らないようで。
              (WM_COMMANDの件も...)
              #プロセス間共有メモリを排他制御してないことのほうが遥かにやばいに違いない。(^^;;;