
| PRocedure TXPMenu.MenueDrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; Selected: Boolean); beign ..... //------- if HasBitmap then begin B.Width := FMenuItem.Bitmap.Width; B.Height := FMenuItem.Bitmap.Height; // +jt //B.Canvas.Brush.Color := FTransparentColor; // ACanvas.Brush.Color; B.Canvas.Brush.Color := B.Canvas.Pixels[0, B.Height - 1];//"Todd Asher" <ashert@yadasystems.com> B.Canvas.FillRect(Rect(0, 0, B.Width, B.Height)); FMenuItem.Bitmap.Transparent := true; FMenuItem.Bitmap.TransparentMode := tmAuto; B.Canvas.Draw(0,0,FMenuItem.Bitmap); // +jt end; 
       B.Width := FMenuItem.Parent.SubMenuImages.Width;       B.Width := FMenuItem.Parent.GetParentMenu.Images.Width; end;   end; | 
  很明顯,除了XPMenu的作者之外,+jt、Asher和X均對代碼進行過修改,問題就出在+jk的修改的這段代碼里,它先用B(TBitmap).Canvas.Pixels[0, B.Height - 1]處的顏色填充了整個B,然后再把要顯示的圖標畫到B里去,后面會調(diào)用DrawIcon把圖標顯示出來,可惜+jt計算錯誤,當時的B(TBitmap).Canvas.Pixels[0, B.Height - 1]值正是$FFFFFF(白色),以ILD_Transparent參數(shù)調(diào)用ImageList_DrawEx時會把原圖標底色(比如上圖的粉紅色)去掉,那么DrawIcon繪制的圖標底色就是白色的,最后圖標所有白色部分被挖空了。+jt真是好心做壞事了。
  原因找到了,現(xiàn)在直接把+jt那部分代碼去掉即可。原程序變?yōu)椋?BR>
| procedure TXPMenu.MenueDrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; Selected: Boolean); beign ..... //------- if HasBitmap then begin B.Width := FMenuItem.Bitmap.Width; B.Height := FMenuItem.Bitmap.Height; {Modify: Conch 2004-12-16 畫出的圖標透明顏色有錯 // +jt //B.Canvas.Brush.Color := FTransparentColor; // ACanvas.Brush.Color; B.Canvas.Brush.Color := B.Canvas.Pixels[0, B.Height - 1];//"Todd Asher" <ashert@yadasystems.com> B.Canvas.FillRect(Rect(0, 0, B.Width, B.Height)); FMenuItem.Bitmap.Transparent := true; FMenuItem.Bitmap.TransparentMode := tmAuto; } B.Canvas.Draw(0,0,FMenuItem.Bitmap); // +jt end; 
       B.Width := FMenuItem.Parent.SubMenuImages.Width;       B.Width := FMenuItem.Parent.GetParentMenu.Images.Width; end;   end; | 
  TXPMenu.ToolBarDrawButton的原因也是一樣。
| procedure TXPMenu.ToolBarDrawButton(Sender: TToolBar; Button: TToolButton; State: TCustomDrawState; var DefaultDraw: Boolean); begin if CanDraw then begin {CanDraw} {Modify: Conch 2004-12-16 畫出的圖標透明顏色有錯 // B.Canvas.Brush.Color := TransparentColor; // ACanvas.Brush.Color; // +jt B.Canvas.Brush.Color := B.Canvas.Pixels[0, B.Height - 1];//"Todd Asher" <ashert@yadasystems.com> B.Canvas.FillRect(Rect(0, 0, B.Width, B.Height)); ImageList_DrawEx(ImglstHand, Button.ImageIndex, B.Canvas.Handle, 0, 0, 0, 0, clNone, clNone, ILD_Transparent); } ImageList_DrawEx(ImglstHand, Button.ImageIndex, B.Canvas.Handle, 0, 0, 0, 0, clNone, clNone, ILD_NORMAL); //Conch ...... end; | 
2、第二個問題是菜單的陰影太呆板,是固定的一層灰色塊(當然是指WinXP以前的系統(tǒng)),如圖:
  菜單陰影是由TXPMenu.DrawWindowBorder函數(shù)繪制的。這里可以看到+jt進行過修改,不過+jt的注釋方式有點特別,看不出那些在作者的原代碼,那些是+jt改過的,不過可以肯定+jt下了不少苦功。這個函數(shù)把Windows來的那個3D邊框去掉,變成平面的OfficeXP風格菜單。若果要改為像WinXP菜單的那種通過與背景像素混合的得到的陰影效果,必須對源碼進行大改,但使用第三方控件目的是為了方便省事,如果那樣做的話就太有違初衷了。因此我這里用了一種折衷的辦法,把灰色面積減少,這樣看起來就順眼多了。最終效果如下圖:
  修改后的TXPMenu.DrawWindowBorder函數(shù):
| procedure TXPMenu.DrawWindowBorder(hWnd: HWND; IsRightToLeft: boolean); var WRect: TRect; dCanvas: TCanvas; wDC: HDC; // +jt  regiontype: integer; // +jt   if (hWnd <= 0) or (FSettingWindowRng) then  finally end; | 
新聞熱點
疑難解答