yamamoWorks

ログイン
in 検索
ホーム ブログ フォーラム ギャラリー ダウンロード

yamamo's Blogs

IEツールバーの背景にXPスタイルを適応する方法

IEのツールバーを.NETで開発するには BandObject がよく使われているようです。 はてなブックマークMenuBar も BandObject を利用しています。

BandObject は簡単にIEツールバーが作れるのですが、Windows XPでスタイルを有効にしている場合に背景部分の色がクラシックのままになり、ちょっと違和感があります。 (よ~く見ないとわからない?)

これは Windows XP のスタイルを制御している「uxtheme.dll」の「DrawThemeParentBackground」関数を BandObject.OnPaintBackground() で叩いてやる事で解決できます。

[DllImport("uxtheme.dll", ExactSpelling = true)]
private static extern UInt32 DrawThemeParentBackground(IntPtr hwnd, IntPtr hdc, ref RECT prc);

public static int DrawThemeParentBackground(IntPtr hWnd, Graphics g, Rectangle rect)
{
     RECT r = new RECT(rect);
     IntPtr hDc = g.GetHdc();
     int ret = (int) DrawThemeParentBackground(hWnd, hDc, ref r);
     g.ReleaseHdc(hDc);
     return ret;
}

protected override void OnPaintBackground(PaintEventArgs pevent)
{
     DrawThemeParentBackground(this.Handle, pevent.Graphics, pevent.ClipRectangle);
}

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
     public Int32 Left;
     public Int32 Top;
     public Int32 Right;
     public Int32 Bottom;

     public RECT(Rectangle rc)
     {
         Left = rc.Left;
         Top = rc.Top;
         Right = rc.Left + rc.Width;
         Bottom = rc.Top + rc.Height;
     }
}

これで自作ツールバーの背景色にスタイルが適応されたようになります。

公開 2006年8月2日 1:33 投稿者 やまも
タグ : ,

コメント

 

asuka

はじめまして。

BandObjectsを使用してプログラミングしております。

フォーカスの問題やコンボボックスでバックスペースが効かない件など対応してきたのですが、XPの場合にXPスタイルにならずクラシックで表示されてしまうのだけが解決できない状況です。

yamamoさんのページを見つけてBandObject.csを記載されている通り変更したのですが、クラシックのままです。。。TT

私のブラウザがIE7なのかもしれませんが、上記以外の修正はないと考えてよろしいでしょうか?

10月 22, 2007 19:45
 

やまも

asuka さん

上記の方法でIE6でもダメですか?

IE7では試したことがないので分からないです。

ちなみに、.NETアプリでXPスタイルを適応するには Application.EnableVisualStyles() メソッドの実行が必要ですが(もしくはマニュフェストで設定・・・だったかな)それは大丈夫ですか?

> 上記以外の修正はないと考えてよろしいでしょうか?

MSの人じゃないんでそんな事は分からないです (笑)

10月 22, 2007 22:24
 

asuka

レスありがとうございます。^^

朝からへばりついて調査していたのですが、XPではIE6でも駄目でした。TT

とりあえずやったことは、前述の通りBandObject.csを御紹介のあるように変更しました。

次にレスで頂いた情報なのですが、

http://www.atmarkit.co.jp/fdotnet/dotnettips/234winxpstyle/winxpstyle.html

を元に、

[STAThread]

static void Main()

{

 Application.EnableVisualStyles();

 Application.DoEvents();

 Application.Run(new Form1());

}  

となるよう修正しようとしたのですが、そもそも作成されるオブジェクトはexeでなくdllですので[STAThread]がないのかなぁ・・・と。

(ソリューション全体を[STAThread]や[EnableVisualStyles]で検索してもヒットせず)

ただ、コントロールについてはFlatStyleプロパティがあるものについては全てSystemに変更致しました。

次に教えて頂いたマニュフェストについて調査してみました。

http://www.atmarkit.co.jp/fdotnet/dotnettips/235embmanifest/embmanifest.html

を参考に、

[ソリューション]

|-BandObjectプロジェクト

|-自作のDLLプロジェクト

|_インストーラプロジェクト

のうち、自作のDLLに作成したマニュフェストをリソースファイルとして埋め込んだのですが、

期待を胸にインストールして表示されたのはゴツイクラシックタイプのものでした・・・ TT

ちなみに自分の環境ではIE6でもXPではクラシックで表示されてしまいます・・・

何処かに落ち度があるような気はするのですが、試しにexeとしてWindowsフォームのアプリを作りますと、VS2005では

Application.EnableVisualStyles();

が自動生成されXPでもきちんとXPスタイルになっておりました。

問題は、自作のDLLがToolStripコントロールを用いておりまして、これにFlatStyleがないのでそもそも無理なのかな、と嘆いております。TT

このToolStripコントロールに表示されるコンボボックスにはFlatSysleがありSystemにしてもクラシックのまま表示されてしまいます。

当たり前ですがApplication.EnableVisualStyles();をしていないので・・・

DLLで作成したコントロールはXPスタイルに出来るのか疑問です・・・

長文失礼しました。。。

10月 23, 2007 13:57
 

やまも

asuka さん

BandObject クラスのコンストラクタに Application.EnableVisualStyles() を書いてやると幸せになれるかもしれません。

10月 23, 2007 14:18
 

asuka

し、しあわせになれました!

ありがとうございます!!!

なんと・・・

見ず知らずの駄目プログラマーにアドバイスして頂き本当にありがとうございます。

朝から7時間くらいかけていましたがやまもさんの一言で終了致しました。

本当にありがとうございます。m(__)m

感謝多謝です。

10月 23, 2007 15:55
 

C-LIS Crazy Lab. 有山

 初めまして。私C-LIS Crazy Lab.の有山と申します。

 BandObjectを利用したIEツールバーの開発に当たり参考にさせていただきました。

 ありがとうございました。

12月 20, 2007 15:40

どのような感想ですか?

(必須)
(オプション)
(必須)
登録

タグ

最近の投稿

  • お知らせ
  • NemusSync - iPod touch とGoogleカレンダーの同期!
  • 負荷増大?
  • Google Apps に対応!
  • idea*idea さんで

過去の投稿

  • 6月 2008 (2)
  • 5月 2008 (1)
  • 4月 2008 (1)
  • 2月 2008 (1)
  • 12月 2007 (1)
  • 10月 2007 (1)
  • 9月 2007 (3)
  • 8月 2007 (1)
  • 7月 2007 (2)
  • 6月 2007 (4)
  • 5月 2007 (3)
  • 4月 2007 (2)
  • 3月 2007 (8)
  • 2月 2007 (2)
  • 1月 2007 (4)
  • 12月 2006 (1)
  • 11月 2006 (3)
  • 10月 2006 (2)
  • 9月 2006 (7)
  • 8月 2006 (7)
  • 7月 2006 (6)

購読

  • RSS 2.0
  • Atom 1.0
Powered by Community Server, by Telligent Systems