7

ウィンドウ キャプション ボタンのサイズと位置を決定する API 呼び出しはありますか? 所有者が描画したウィンドウにビスタ スタイルのキャプション ボタンを描画しようとしています。私はc/c++/mfcを扱っています。

編集:閉じるボタンを描画するコード例はありますか?

4

4 に答える 4

11

vista でボタンの位置を取得するために必要な関数を見つけました: WM_GETTITLEBARINFOEX

このリンクは、すべての間隔を正しくするために必要なシステム メトリックも示しています (ただし、完全なダイアログ画像ではないのが残念です)。これは Vista で完全に機能し、ほとんどの場合 XP で機能します (XP ではボタン間のギャップがわずかに大きすぎます)。

http://shellrevealed.com/photos/blog_images/images/4538/original.aspx から

于 2009-01-26T11:42:51.887 に答える
4

GetSystemMetricsは、これらすべての情報を提供します。ウィンドウ装飾内に描画するには、GetWindowDCを使用します。

于 2009-01-26T10:28:40.850 に答える
2

次のコードは、 http://www.catch22.net/content/snippetsで見つけた「GlobalTitlebarHook」の例を基にしています。MFCに対応するように例を変更しました。左端のタイトルバーボタンのX座標を返しますが、ボタンの位置を見つけるために簡単に変更できます。

#define B_EDGE 2

int CMyWindow::CalcRightEdge()
{
 if(GetStyle() & WS_THICKFRAME)
  return GetSystemMetrics(SM_CXSIZEFRAME);
 else
  return GetSystemMetrics(SM_CXFIXEDFRAME);
}


int CMyWindow::findNewButtonPosition()
{
 int   nButSize  = 0;
 DWORD dwStyle   = GetStyle();
 DWORD dwExStyle = GetExStyle();

 if(dwExStyle & WS_EX_TOOLWINDOW)
 {
  int nSysButSize = GetSystemMetrics(SM_CXSMSIZE) - B_EDGE;

  if(GetStyle() & WS_SYSMENU) 
   nButSize += nSysButSize + B_EDGE;

  return nButSize + CalcRightEdge();
 }
 else
 {
  int nSysButSize = GetSystemMetrics(SM_CXSIZE) - B_EDGE;

 // Window has Close [X] button. This button has a 2-pixel
 // border on either size
  if(dwStyle & WS_SYSMENU) 
   nButSize += nSysButSize + B_EDGE;

 // If either of the minimize or maximize buttons are shown,
 // Then both will appear (but may be disabled)
 // This button pair has a 2 pixel border on the left
  if(dwStyle & (WS_MINIMIZEBOX | WS_MAXIMIZEBOX) )
   nButSize += B_EDGE + nSysButSize * 2;

 // A window can have a question-mark button, but only
 // if it doesn't have any min/max buttons
  else if(dwExStyle & WS_EX_CONTEXTHELP)
   nButSize += B_EDGE + nSysButSize;

 // Now calculate the size of the border...aggghh!
  return nButSize + CalcRightEdge();
 }
}
于 2009-09-15T07:19:40.723 に答える
0

GetSystemMetrics関数は、サイズ(SM_CYSIZEおよびSM_CXSIZEパラメーター)を支援する必要があります。

編集

この関数で位置を見つけることができるかどうかはわかりませんが、emuleのソースコードを見ると、ウィンドウのキャプションにボタンを追加することができます。

于 2009-01-26T10:29:39.180 に答える