掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ビットマップ付きのメニューでショートカットに下線をつけるには? (ID:2021)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
オーナードローの横着版です。 上のだと、ショートカットの左位置がばらばらになるので、ショートカットの左位置があうようにしました。 OnMeasureItemで位置を取得し、OnDrawItemでその位置になるようにDrawTextExで描画します。 横着版の理由は、OnMeasureItemで、タブ位置を取得するのに、Length(Caption)+4 としているだけだからです。 本来なら、DrawTextExでDT_CALCRECTを使用してWidthとHeightを計算してやる必要があります。 でも、たぶんこれだけで大丈夫でしょう。+4としているのは、キャプションとショートカットの間を少しあけるための小細工です。 デフォルトの描画とやり方が違うため、ショートカット名がずれます。 画像部分の描画も違うので、このあたりを同じにするなら // 画像が設定されていれば、画像を描画 のあたりに少し手を加えればできます。 # TForm1にSavedTabStop:integerを用意する必要があります。 procedure TForm1.MenuItemDrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; Selected: Boolean); const PADDING_WIDTH = 2; PADDING_RIGHT = 2; var AMenuItem: TMenuItem; ACaption, AShortcutText: String; LeftImage_width: integer; DTP: TDrawTextParams; begin // 背景を埋める ACanvas.FillRect(ARect); // 画像は後から書くので、画像と隙間分足しておく LeftImage_width := ImageList1.Width + PADDING_WIDTH * 2; ARect.Right := ARect.Right - PADDING_RIGHT; ARect.Left := ARect.Left + LeftImage_width; //対象メニューと、キャプション・ショートカット名 AMenuItem := Sender As TMenuItem; ACaption := AMenuItem.Caption; AShortcutText := ShortCutToText(AMenuItem.ShortCut); ACaption := ACaption + #9 + AShortcutText; with DTP do begin cbSize := SizeOf(TDrawTextParams); iTabLength := SavedTabStop; iLeftMargin := 0; iRightMargin := 0; uiLengthDrawn := 0; end; // 左寄せでキャプションを描画 DrawTextEx( ACanvas.Handle, PChar(ACaption), Length(ACaption), ARect, DT_LEFT Or DT_VCENTER Or DT_SINGLELINE Or DT_EXPANDTABS Or DT_TABSTOP, addr(DTP) ); // 画像が設定されていれば、画像を描画 if AMenuItem.ImageIndex >= 0 then ImageList1.Draw(ACanvas, ARect.Left - LeftImage_width, ARect.Top + ((ARect.Bottom - ARect.Top) - ImageList1.Height) div 2, AMenuItem.ImageIndex, AMenuItem.Enabled); end; procedure TForm1.MenuItemMeasureItem(Sender: TObject; ACanvas: TCanvas; var Width, Height: Integer); var tmpMenuShortcutLength: integer; AMenuItem: TMenuItem; begin AMenuItem := Sender As TMenuItem; tmpMenuShortcutLength := ACanvas.TextWidth(ShortCutToText(AMenuItem.ShortCut)); if tmpMenuShortcutLength > 0 then begin if SavedTabStop < Length(AMenuItem.Caption)+4 then SavedTabStop := Length(AMenuItem.Caption)+4; end; end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.