◀ANSI版開発トップへ
  • 3359 Windows98 でタスクトレイアイコンからバージョン情報を開くとアイコンが16x16になる
    • 3360 Re:Windows98 でタスクトレイアイコンからバージョン情報を開くとアイコンが16x16になる
    • 3361 Re: Windows98 でタスクトレイアイコンからバージョン情報を開くとアイコンが16x16になる
      • 3362 Re2: Windows98 でタスクトレイアイコンからバージョン情報を開くとアイコンが16x16になる
        • 3364 Re3: Windows98 でタスクトレイアイコンからバージョン情報を開くとアイコンが16x16になる
  • [3359] Windows98 でタスクトレイアイコンからバージョン情報を開くとアイコンが16x16になる クルクル 2004年01月16日 02:08

    開発者でない上に高度な話ばかりで恐縮ですが、
    『・2003.09.19 □ ----.--.-- Windows98 でタスクトレイアイコンからバージョン情報を開くとアイコンが16x16になる』
    ↑のバージョン情報のアイコンが小さくなるの原因がわかったのでテストしたコードを(長くなってしまうので省略したら分かりにくてすみません)
    あと、カーソルが砂時計になるは再現できませんでした。環境はWinMeでVC5です(工夫次第でエラーは出ますがコンパイルは可能でした)。

    下には変更してみたソースを載せましたが単純にLR_SHAREDを外せばアイコンは別々に読み込まれるので大きなアイコンで表示されるみたいです。
    LR_SHAREDが指定されているとインスタンス毎に1つしか読み込まれないのではないでしょうか。

    ■変更
    ソースファイル
    HICON GetAppIcon( HINSTANCE hInst, int nResource, const char* szFile, bool bSmall )
    ↓
    HICON GetAppIcon( HINSTANCE hInst, int nResource, const char* szFile, bool bSmall, bool bShare )

    ■変更
    ヘッダーファイル
    HICON GetAppIcon( HINSTANCE hInst, int nResource, const char* szFile, bool bSmall = false);
    ↓
    HICON GetAppIcon( HINSTANCE hInst, int nResource, const char* szFile, bool bSmall = false, bool bShare = true);


    ■追加 class CDlgAbout::OnInitDialog
    // From Here Dec. 2, 2002 genta
    // アイコンをカスタマイズアイコンに合わせる
    HICON hIcon = GetAppIcon( m_hInstance, ICON_DEFAULT_APP, FN_APP_ICON, false );
    HWND hIconWnd = GetDlgItem( m_hWnd, IDC_STATIC_MYICON );
    ↓
    // From Here Dec. 2, 2002 genta
    // アイコンをカスタマイズアイコンに合わせる
    // アイコンは非共有でロードされるので破壊するべき?
    HICON hIcon = GetAppIcon( m_hInstance, ICON_DEFAULT_APP, FN_APP_ICON, false, false );
    HWND hIconWnd = GetDlgItem( m_hWnd, IDC_STATIC_MYICON );
    • [3360] Re:Windows98 でタスクトレイアイコンからバージョン情報を開くとアイコンが16x16になる クルクル 2004年01月16日 02:08

      続きです。

      ■追加 GetAppIcon
      // ファイルからの読み込みをまず試みる
      hIcon = (HICON)::LoadImage( NULL, szPath, IMAGE_ICON, size, size,
      LR_SHARED | LR_LOADFROMFILE );
      if( hIcon != NULL ){
      return hIcon;
      }

      // ファイルからの読み込みに失敗したらリソースから取得
      hIcon = (HICON)::LoadImage( hInst, MAKEINTRESOURCE(nResource),
      IMAGE_ICON, size, size, LR_SHARED );
      ↓
      // ファイルからの読み込みをまず試みる
      hIcon = (HICON)::LoadImage( NULL, szPath, IMAGE_ICON, size, size,
      (bShare ? LR_SHARED : 0) | LR_LOADFROMFILE );
      if( hIcon != NULL ){
      return hIcon;
      }

      // ファイルからの読み込みに失敗したらリソースから取得
      hIcon = (HICON)::LoadImage( hInst, MAKEINTRESOURCE(nResource),
      IMAGE_ICON, size, size, bShare ? LR_SHARED : 0 );

      ■追加 class CDlgAbout
      protected:
      BOOL OnInitDialog( HWND, WPARAM, LPARAM );
      BOOL OnBnClicked( int );
      LPVOID GetHelpIdTable(void); //@@@ 2002.01.18 add
      ↓
      protected:
      BOOL OnInitDialog( HWND, WPARAM, LPARAM );
      BOOL OnDestroy( void );
      BOOL OnBnClicked( int );
      LPVOID GetHelpIdTable(void); //@@@ 2002.01.18 add


      ■追加
      BOOL CDlgAbout::OnDestroy( void )
      {
      // 非共有でロードされたアイコンを破壊する。
      // これは必要でしょうか?
      HWND hIconWnd = GetDlgItem( m_hWnd, IDC_STATIC_MYICON );
      DestroyIcon( (HICON)::SendMessage( hIconWnd, STM_GETICON, 0, 0 ) );

      /* 基底クラスメンバ */
      return CDialog::OnDestroy();
      }
    • [3361] Re: Windows98 でタスクトレイアイコンからバージョン情報を開くとアイコンが16x16になる げんた 2004年01月16日 23:35

      いろいろとありがとうございます.

      アイコン管理が面倒くさかったのでSharedIconに変更してこの不具合には目をつぶったつもりだったのですが,今よくよくソースを見てみるとSharedIconにDestroyIconしているところを発見...やばすぎ.
      SHAREDは使わない方向でもう一度見直してみます.
      • [3362] Re2: Windows98 でタスクトレイアイコンからバージョン情報を開くとアイコンが16x16になる げんた 2004年01月17日 11:41

        Iconには共有アイコンと非共有アイコンがあって,共有アイコンは使用後に破棄してはならず,非共有アイコンは破棄しなければならない.しかし,windowに関連づけられているアイコンなどシステムで用意されたアイコンがどっちなのかが記述されていない上にウィンドウが消えたときに破棄されるかどうかも記述がない.

        結局どうすればいいのか...

        Static controlでは関連づけられたアイコンハンドルは破棄されるとの記述があったのでAbout Dialogboxでは非共有アイコンを割り当てて破棄は省略できるとわかるんですが.
        • [3364] Re3: Windows98 でタスクトレイアイコンからバージョン情報を開くとアイコンが16x16になる もか 2004年01月18日 00:28

          ▼げんた
          >結局どうすればいいのか...

          ▼MSDNのLoadImage
          >LR_SHARED を指定しないでロードした..アイコンを使い終わったときは、..関数(DestroyIcon)を呼び出すことによって、対応するメモリを解放できます。
          >リソースを使っているプロセスが終了すると、システムがそのリソースを自動的に削除します。
          >(..部分は略)
          というのは楽観的に読むと、削除して節約してもいいけど、しなくてもいい、と取れます。
          LR_SHAREDつきのときは、削除するに越したことは無いので、非共有でロードした | してない・不明 のフラグでも追加して、非共有のときだけ削除するという手段にでることもできますが..どうでしょうか?