DiglogWindowの最少化位置の指定

解決


hannya  URL  2011-12-01 17:24:39  No: 73020  IP: [192.*.*.*]

お世話になって  すこしづつ  使い勝手の良い一筆描画アプリケーションが出来ます

今回は  変数(色も)を入力(あるいは描画Windowで直接変更があると表示)するDiglogWindowの最少化位置の変更です。
現状はDeskTopの左下に収まります。ドラッグドロップで位置変更可能です。
これを描画Window(唯一のアプリのWindowですが  その中の左下に位置するようしたいので助言をおねがいします。
本当は関連コードを提示しないといけないのですが
現在  ほとんど理解していない状態で  かってそのDialogを画面にどこに提示するかも  すこし  移動させた記憶があるのですが  そのコードを探せないでいます。
アプリの名前はKolamDesignerで  そのKolamDesigner.rcには
IDD_ParameterDIALOG DIALOGEX 0, 0, 225, 144
があります  これなど  Dialogのサイズでしょうか?
はんにゃ

編集 削除
仲澤@失業者  2011-12-05 16:10:07  No: 73021  IP: [192.*.*.*]

レス付きませんねぇ。
おそらく、質問の意味がさっぱりわからないからでしょう。

んで、エスパーになったつもりで考えて見ると。
1.DLG(ダイアログ)を最小化した場合の表示位置は変更できません。
  ポップアップチャイルドもできません。唯一、MDIチャイルド
  ウインドウの場合のみMDIの親のクライアント領域に最小化
  されます。当該のDLGにご希望の動作をさせることは出来ませんが、
  MDIチャイルドのクライアント領域にそのDLGを貼り付け(子として
  作成する)れば、ご希望の動作に近いかもしれません。
  注意しなければならないのは、この場合MDIチャイルドウインドウ
  は、その親のクライアント領域を出ることができない、という点で、
  これは、ポップアップチャイルドやモードレスDLGと大きく動作が
  異なる点です。
ということかもしれません。

編集 削除
hannya  URL  2011-12-08 16:19:52  No: 73022  IP: [192.*.*.*]

ありがとうございます

>DLG(ダイアログ)を最小化した場合の表示位置は変更できません。
最小化した表示位置を自動的に指定できないということでしょうか?
現状では  一度最小化され、Desktopの左下のWindowはマウスで位置を任意にどこでも  アプリの描画Window内(に重ねて)でも移動できます。
ただ  描画Windowのいちを変えても  そのDesktop上でそのままです。

まず  このダイアログサはモードレスを優先したいので  現状を選択します
それと  やはり  この親子関係など小生にはむずかしく  うっかりいじると
すべてパーになりそうです。
(そんな奴は質問するな!と叱られそうです)
  諦めさせて頂き  ありがとうございました

編集 削除
gak  2011-12-13 18:36:08  No: 73023  IP: [192.*.*.*]

> 現状では  一度最小化され、Desktopの左下のWindowはマウスで位置を任意にどこでも  アプリの描画Window内(に重ねて)でも移動できます。
その「モードレスダイアログ」は「アプリの描画Window」ではなく「デスクトップ」を親として作成していると推測できる。
だとすれば、普通はこういう動作になる。

それでも何とかしたいのなら WM_WINDOWPOSCHANGED を捕まえてやれば(超無理やりにだが)それっぽくできる。

  void 「アプリの描画Window」::OnWindowPosChanged(WINDOWPOS *lpwndpos) {
      CDialog::OnWindowPosChanged(lpwndpos);
      if ((lpwndpos->flags & (SWP_NOMOVE | SWP_NOSIZE)) != (SWP_NOMOVE | SWP_NOSIZE)) {
          if (「モードレスダイアログ」.GetSafeHwnd() != NULL) {
              CRect rect, modeless;
              GetClientRect(rect);
              ClientToScreen(rect);
              「モードレスダイアログ」.GetWindowRect(modeless);
              WINDOWPLACEMENT wp = { 0 };
              wp.length = sizeof(WINDOWPLACEMENT);
              「モードレスダイアログ」.GetWindowPlacement(&wp);
              wp.flags = WPF_SETMINPOSITION;
              // 「モードレスダイアログ」の最小化時の位置を「アプリの描画Window」領域の左下に
              wp.ptMinPosition.x = rect.left;
              wp.ptMinPosition.y = rect.bottom - modeless.Height();
              「モードレスダイアログ」.SetWindowPlacement(&wp);
          }
      }
  }

「モードレスダイアログ」に topmost スタイルを設定しないと「アプリの描画Window」の裏に隠れてしまうけどね…

編集 削除
hannya  2011-12-23 18:42:53  No: 73024  IP: [192.*.*.*]

ありがとうございます
これは魅力ですが  「モードレスダイアログ」に topmost スタイルを設定することを勉強してから  これを試します
(小生の理解は)「モードレスダイアログ」の親は「アプリの描画Window」ではなく「デスクトップ」であることなど  今これを読んで  なるほどそういう関係かと知るような状態です

編集 削除
hannya  2011-12-23 18:48:34  No: 73025  IP: [192.*.*.*]

すみません
実は起動すると直ぐにで表示されるDialogをスクリーンのどの位置に表示するか
雛形から  動かした記憶があるのですが
どのコードでそうしたか  探せないでいます。
こんなコードのはずという助言を頂ければ幸いです
起動の他にMenuBarのDialogoをクリックすると一度消したDialogは表示されます

編集 削除
みい  2011-12-24 11:43:17  No: 73026  IP: [192.*.*.*]

MoveWindowとか?

編集 削除
hannya  2011-12-24 16:30:38  No: 73027  IP: [192.*.*.*]

ありがとうございました  
ChildView.cppの中にありました
こういうところで  最小化の位置指定が出来ると良いなと思ったのですが
これまでの助言からは無理のようです。

void CChildView::OnParameterSet() 
{
// 2009/10/27 t.yoshino モードレス表示
// m_wndParam.SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE); // 必要なし
// m_wndParam.CenterWindow();  // 親ウィンドウに対して中央寄せ 無いと右寄せ
// m_wndParam.RightWindow();  // 親ウィンドウに対して右寄せ、//'RightWindow' : 'CParameterDlg' のメンバではありません。

//2009/10/29 以下追加 右寄せ  by totoko  
// http://social.msdn.microsoft.com/Forums/ja-JP/user/threads?user=Shonan%20Hannya
        // 親ウィンドウの位置を得る
  CRect rectParent;
  GetWindowRect(&rectParent);
  // 子ウィンドウの位置を得る
  CRect rectChild;
  m_wndParam.GetWindowRect(&rectChild);
  // 親の右端から子の幅分オフセットさせた位置に配置
  long width = rectChild.right - rectChild.left;
  rectChild.right = rectParent.right;
  rectChild.left = rectChild.right - width;
  // 親ウィンドウの中ほどの高さに配置 by ミッヒー
  long parentHeight = rectParent.bottom - rectParent.top;
  long childHeight = rectChild.bottom - rectChild.top;
  rectChild.top = rectParent.top + parentHeight / 4;
  rectChild.bottom = rectChild.top + childHeight;
  // ここまで
  m_wndParam.MoveWindow(&rectChild);
  m_wndParam.BringWindowToTop();  // 前に持ってくる
  m_wndParam.ShowWindow(SW_SHOW); // 表示
} //endof OnParameterSet(

編集 削除
仲澤@失業者  2011-12-26 12:59:48  No: 73028  IP: [192.*.*.*]

>実は起動すると直ぐにで表示されるDialogをスクリーンのどの位置に表示するか
当該DLGのWM_INITDIALOG 又は OnInitDialog()のハンドラで
自分自身の位置を指定します。
みいさんのアドバイスを参照してください。
そのほかにはStrWindowPos()が使えます。

編集 削除